Einzelnen Beitrag anzeigen

sansimarkus

Registriert seit: 15. Dez 2011
17 Beiträge
 
Delphi XE2 Architect
 
#1

GetThreadContext 64Bit

  Alt 25. Jul 2012, 16:04
Moin,

ich bastele grade ein Programm, dass ein anderes via CreateProcess startet, dadurch habe ich ein TProcessInformation record welches das Handle des Prozesses und des Hauptthreads enthält. Nun versuche ich kurz nach dem starten des Programmes (sleep (100)) einen der Register des Hauptthreads auszulesen:

Delphi-Quellcode:
     

var
   FTargetContext: _CONTEXT; // = winapi.windows._CONTEXT
   FStartUpInfo: TStartupInfo;
   FProcessSpawnInfo: TProcessInformation;

[....]
 
ZeroMemory(@FStartUpInfo, SizeOf(TStartUpInfo));
ZeroMemory(@FProcessSpawnInfo, SizeOf(TProcessInformation));
FStartUpInfo.cb := SizeOf(TStartUpInfo);
if not CreateProcess(PChar(StrBuf2), nil, nil, nil, true,
                     DETACHED_PROCESS or CREATE_SUSPENDED,
                     nil, PChar(StrBuf1), FStartUpInfo, FProcessSpawnInfo)
then
    ErrorAndExit(); //pseudocode

repeat
 if ResumeThread(FProcessSpawnInfo.hThread) = -1 then
   ErrorAndExit(); //pseudocode
 Sleep(100);
 FTargetContext.ContextFlags := CONTEXT_FULL;
 if SuspendThread(FProcessSpawnInfo.hThread) = -1 then
   ErrorAndExit(); //pseudocode
 if not GetThreadContext(FProcessSpawnInfo.hThread, FTargetContext) then
   ErrorAndExit(); // <---- failed
until SomeCondition;
Das ganze funktioniert wunderbar in der 32Bit Version (target prozess ist natürlich auch 32bit), mit 64Bit (target prozess ist auch 64bit) kommt GetThreadContext mit false zurück und FTargetContext ist ausgenullt. Im MSDN steht leider nichts bezüglich irgendwelcher unterschiede von GetThreadContext bei 32 und 64Bit, abgesehen davon, dass ein 64bit Programm ein 32bit-Thread mittels Wow64GetThreadContext auslesen kann, aber das trifft ja nicht zu, da meine 64bit-Executable auch eine 64bit-Executable wieder ausführt.
  Mit Zitat antworten Zitat