Problem mit ReadProcessMemory
-
Hab jetzt Code gefunden der funktioniert, trotzdem Danke für die Bemühungen.
Hab allerdings noch eine Frage. In was unterscheiden sich eigentlich die ...64 zu den normalen Funktionen?
Also z.B. StackWalk64 zu StackWalk, außer dass sie teilweiße ...64 Parameter haben?Gruß
yogle
-
yogle schrieb:
Hab allerdings noch eine Frage. In was unterscheiden sich eigentlich die ...64 zu den normalen Funktionen?
Also z.B. StackWalk64 zu StackWalk, außer dass sie teilweiße ...64 Parameter haben?Die 64-Funktionen haben sie erst eingeführt, nachem es absehbar war, dass auf ein 64-Bit OS umgestellt wird. Hier sind einige Parameter eben "richtige" Pointer und keine DWORDs mehr!
PS: Für eine Anwendung der StackWalk64 Funktione siehe meinen CP Artikel:
http://www.codeproject.com/threads/StackWalker.asp
oder
http://www.codeproject.com/tools/leakfinder.asp
-
Achso, ich fragte weil ja nur noch die ...64 Funktionen dokumentiert sind.
Wie könnte ich eigentlich aus so einem DWORD Pointer das Modul herausfinden. Über SymGetModuleBase64 und dann SymGetModuleInfo64? Wenn ich die die Rückgabe von SymGetModuleBase für GetModuleFileName verwende bringt er mir ein Warning, was ich vermeiden möchte.Gruß
yogle
-
Schau Dir einfach mal CP Artikel an...
-
Hmm habe mich falsch ausgedrückt.
Ich benötige eine Funktion die mir aus einem DWORD(64) Pointer den mir StackWalk64 zurückgibt den Pfad zu dem Modul ausliest.
So eine Funktion kann ich im StackWalker Code und auch sonst nicht finden, außer über GetModuleFileName mit dem Warning das ich vermeiden möchte.Und gibt es eigentlich eine Funktion die mir sagt auf was für einem Processor ich sitze, also ein X86, ein X64 oder ein IA64?
Gruß
yogle
-
yogle schrieb:
Hmm habe mich falsch ausgedrückt.
Ich benötige eine Funktion die mir aus einem DWORD(64) Pointer den mir StackWalk64 zurückgibt den Pfad zu dem Modul ausliest.
So eine Funktion kann ich im StackWalker Code und auch sonst nicht finden, außer über GetModuleFileName mit dem Warning das ich vermeiden möchte.???
SymGetModuleInfo64yogle schrieb:
Und gibt es eigentlich eine Funktion die mir sagt auf was für einem Processor ich sitze, also ein X86, ein X64 oder ein IA64?
Wie meinst Du das??? Da Du eh für jede Platform separat compilieren musst, erübrigt sich eigentlich fast die Frage (da Du es über Compiler-Directieves rausbekommst)...
-
typedef struct _IMAGEHLP_MODULE64 { DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64) DWORD64 BaseOfImage; // base load address of module DWORD ImageSize; // virtual size of the loaded module DWORD TimeDateStamp; // date/time stamp from pe header DWORD CheckSum; // checksum from the pe header DWORD NumSyms; // number of symbols in the symbol table SYM_TYPE SymType; // type of symbols loaded CHAR ModuleName[32]; // module name CHAR ImageName[256]; // image name CHAR LoadedImageName[256]; // symbol file name } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64; STACKFRAME64 sf64; IMAGEHLP_MODULE64 Module; StackWalk64( Bla, sf64, Bla ); SymGetModuleInfo64( Bla, sf64.AddrPC.Offset, &Module ) MessageBox( NULL, Module.ModuleName, "ModulName", MB_OK ); MessageBox( NULL, Module.ImageName, "ImageName", MB_OK ); MessageBox( NULL, Module.LoadedImageName, "LoadedImageName", MB_OK );ModuleName ist der Modulname _ohne_ Suffix. ImageName ist der Modulname _mit_ Suffix. LoadedImageName ist der Pfad für die Debugsymbole für das Modul. Ich weiß nicht wie du meinst, dass ich auf meinen Modulpfad komme.
Jochen Kalmbach schrieb:
Wie meinst Du das??? Da Du eh für jede Platform separat compilieren musst, erübrigt sich eigentlich fast die Frage (da Du es über Compiler-Directieves rausbekommst)...
Kann man es denn nicht auch anderst herausbekommen? So das ich nicht 3 oder sogar 5 (64Bit) verschiedene Binarys benötige, sondern eine bei der ich die Parameter für StackWalk64 wie z.B. IMAGE_FILE_MACHINE_AMD64 und die Register während der Laufzeit anpassen könnte. Sonst wäre das äußerst ungeschickt, da ich ja auch nicht immer weiß auf welchem Zielsystem das Programm laufen soll

Gruß
yogle
-
yogle schrieb:
Jochen Kalmbach schrieb:
Wie meinst Du das??? Da Du eh für jede Platform separat compilieren musst, erübrigt sich eigentlich fast die Frage (da Du es über Compiler-Directieves rausbekommst)...
Kann man es denn nicht auch anderst herausbekommen? So das ich nicht 3 oder sogar 5 (64Bit) verschiedene Binarys benötige, sondern eine bei der ich die Parameter für StackWalk64 wie z.B. IMAGE_FILE_MACHINE_AMD64 und die Register während der Laufzeit anpassen könnte. Sonst wäre das äußerst ungeschickt, da ich ja auch nicht immer weiß auf welchem Zielsystem das Programm laufen soll

?????
Hast Du jemamls schon für x64/IA64 Programme erstellt?Es ist halt nun mal, so dass Du für x86/x64 und IA64 eigene binaries erstellen musst (ok, x86 läuft auch in einer "Simulation" in x64/IA64).
Schau Dir bitte mal meinen "StackWalker" auf Codeproject richtig an; der ist für alle drei Platformen vollständig implementiert und wird eigentlich Deine Fragen beantworten (auch mit dem IMAGE_FILE_MACHINE_AMD64)...
-
Nein ich hab noch nie ein Programm für x64, IA64 geschrieben da ich dafür gar keinen Compiler habe.
Ich glaube ich habe dich falsch verstanden. Sehe ich das jetzt richtig, dass wenn ich mein Programm für x86 kompiliere und bei StackWalk64 als Parametet IMAGE_FILE_MACHINE_I386 angebe, es dann auch auf einem x64, IA64 Prozessor funktioniert, da x86 "simuliert" wird? Und wenn ich einen 64Bit Kompiler hätte müsste ich angeben für welchen Prozessor ich kompilieren will und dann den Code darauf anpassen?Sorry für die blöden Fragen, bin heute etwas langsam.
Gruß
yogle
-
yogle schrieb:
Nein ich hab noch nie ein Programm für x64, IA64 geschrieben da ich dafür gar keinen Compiler habe.
Ich glaube ich habe dich falsch verstanden. Sehe ich das jetzt richtig, dass wenn ich mein Programm für x86 kompiliere und bei StackWalk64 als Parametet IMAGE_FILE_MACHINE_I386 angebe, es dann auch auf einem x64, IA64 Prozessor funktioniert, da x86 "simuliert" wird? Und wenn ich einen 64Bit Kompiler hätte müsste ich angeben für welchen Prozessor ich kompilieren will und dann den Code darauf anpassen?Treffer, versenkt.