![]() |
GetThreadContext 64Bit
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:
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.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; |
AW: GetThreadContext 64Bit
Zitat:
Zitat:
Zitat:
Zitat:
GetLastError SysErrorMessage RaiseLastOSError ... |
AW: GetThreadContext 64Bit
Oops, ganz vergessen zu dazuzuschreiben, jo der WindowsError ist mal wieder hilfreich wie Fußpilz:
"Unzulässiger Zugriff auf einen Speicherbereich" - auf welchen Speicherbereich? ist meine Context-variable zu klein? oder der Speicherbereich im anderen Programm/Thread geschützt? Da fallen mir noch 100 weitere Möglichkeiten ein wo er auf Speicher zugreifen könnte. RaiseLastOSError:
Code:
ERROR_NOACCESS
998 (0x3E6) Invalid access to memory location. Und zum nonzero return Value: die Funktion gibt System.Boolean zurück und die Suspend/Resumethread geben im Fehlerfall laut MSDN -1 zurück. Edit: mein Programm läuft als Administrator, es holt sich vor CreateProcess das DebugPrivilegeToken. Edit2: Was mich am meisten ärgert ist, dass ich das ganze nicht vernünftig debuggen kann, mit singlestepping springt er einfach drüber. Das x64 debugging mit Delphi XE2 ist der pure Wahnsinn. |
AW: GetThreadContext 64Bit
Update:
Anstatt dem Handle, dass mir CreateProcess in FProcessSpawnInfo schreibt nun versucht mittels dem Handle von OpenThread 'THREAD_ALL_ACCESS' den Context zu lesen, ohne Erfolg. Warum ist OpenThread eigentlich nicht in den Delphi-Windows headern? |
AW: GetThreadContext 64Bit
Was passiert, wenn du es mal nicht mit CONTEXT_FULL, sondern mit z.b. mal nur den Control Registern versuchst?
|
AW: GetThreadContext 64Bit
Selbes Ergebnis - mit allen verügbaren Flags.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz