Problem mit ReadProcessMemory



  • hmmm,

    er steht exakt so im source und es gibt auch eine binary dazu!
    Ich weiß nur nicht mit was er das kompiliert hat, schätze aber mal mit MinGW, da dieser code teil der mingw-utils (drwingw/exchndl.dll) ist!
    Also schwachsinn?

    Irgendwie muss man es ja hinbekommen, oder?

    Gruß
    yogle



  • (DWORD)(&ExportDir.AddressOfNames[j]))

    AddressOfNames ist doch ein long...das ist doch kein wunder daß das ned funzt...



  • Jep das es net funzt, da es kein array oder pointer, sondern ein DWORD ist, ist mir schon klar 😃
    Aber wie bekomm ich es jetzt zum laufen? Ich bekomm's nicht hin.

    yogle



  • 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.

    ???
    SymGetModuleInfo64

    yogle 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.


Anmelden zum Antworten