Hallo,
dabei geht es nicht um Tauschen der Dateien. Der Fehler ist in der Kernel32.dll und damit nicht einfach tauschbar. Aber wenn ein Prozess eine DLL laed macht er das ueber eine Sprungtabelle. Meine Loesung setzt genau dort an. Nachdem die DLL geladen ist biege ich den Eintrag fuer den DDE Call auf eine eigene Funktion um, welche dann den Timeout mit non timeout ersetzt.
In jeden Fall muss der Code in den Adressraum der Server/client Application eingebracht werden (z.b. ebenfalls durch eine DLL). Sofern man nicht von etwas Win32 API Code zurueckschreckt ist das ganz einfach.
code below :
CatchAPICall::CatchAPICall()
{
funcPtr=NULL;
funcRedirect=NULL;
}
/// target handler
int _timeoutForDdeConnect=5000;
#ifdef WIN32
LRESULT __stdcall MySendMessageA(HWND hwnd,UINT Msg,WPARAM wparam,LPARAM lparam)
{
DWORD result=0;
LRESULT flag;
flag = SendMessageTimeoutA(hwnd,Msg,wparam,lparam,SMTO_ABORTIFHUNG|SMTO_NORMAL,_timeoutForDdeConnect,&result);
return (LRESULT)result;
}
LRESULT __stdcall MySendMessageW(HWND hwnd,UINT Msg,WPARAM wparam,LPARAM lparam)
{
DWORD result=0;
LRESULT flag;
flag = SendMessageTimeoutW(hwnd,Msg,wparam,lparam,SMTO_ABORTIFHUNG|SMTO_NORMAL,_timeoutForDdeConnect,&result);
return (LRESULT)result;
}
#endif
// usage in code
catcherA.BgnCatch(SendMessageA,MySendMessageA);
catcherW.BgnCatch(SendMessageW,MySendMessageW);
// code in Catch Class
CatchAPICall::~CatchAPICall()
{
EndCatch();
}
//Ersetzen der Funktion
void CatchAPICall::BgnCatch(void* orgFunc,void* newTarget)
{
#ifdef WIN32
unsigned long read;
funcPtr=orgFunc;
funcRedirect=newTarget;
ReadProcessMemory(GetCurrentProcess(),funcPtr,orgcode,6,&read);
// jetzt den neuen Code schreiben ...
char callcode[6];
callcode[0]=(char)0xFF;
callcode[1]=(char)0x25;
long * helpPtr=(long*)(callcode+2);
*helpPtr=(long)&funcRedirect;
unsigned long written;
WriteProcessMemory(GetCurrentProcess(),funcPtr,callcode,6,&written);
#endif
}
//Ersetzung aufheben
void CatchAPICall::EndCatch()
{
#ifdef WIN32
unsigned long written;
if (funcPtr)
{
WriteProcessMemory(GetCurrentProcess(),funcPtr,orgcode,6,&written);
funcPtr=NULL;
}
#endif
}
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP