| |
|
|
| Guten Abend...
Ist es possibile bei anderen Prozessen den letzten aufgetretenen API-Fehler (GetLastError) auszulesen?
Hab grad einen Anruf bekommen => muß gleich arbeiten. Alles weitere deshalb morgen .
Saluto
Andreas |
|
|
| |
|
|
|
| So, dann mal los... Es geht um folgenden Quelltext: KompilierenMarkierenSeparierenDef @GetLastError(0) !"KERNEL32","GetLastError"
Def @SetLastError(1) !"KERNEL32","SetLastError"
DEF @GetDlgCtrlID(1) !"USER32","GetDlgCtrlID"
DEF @ButtonClicked(1) @GetDlgCtrlID(@&(1))=-%MENUITEM
Def @FreeLibrary(1) !"kernel32","FreeLibrary"
Declare Error&,Zurück&,Prod&
WindowStyle 31
WindowTitle "SetLastError"
Window 0,0-640,440
LET Zurück&=@CreateButton(%HWND,"Fehler setzen",20,20,300,30)
LET Prod&=@CreateButton(%HWND,"Fehler produzieren",20,80,300,30)
While 0=0
Waitinput
IF @ButtonClicked(Zurück&)
CLS
Locate 15,0
@SetLastError($0ABC1234)
Print "$"+@HEX$(@GetLastError())," "+@str$(@GetLastError())
ElseIF @ButtonClicked(Prod&)
CLS
Locate 15,0
@FreeLibrary(0)
Print @GetLastError()
endif
wend
Nach dem Starten des Quelltextes wird zuerst der Button Fehler setzen angeklickt. Jetzt starten wir mal [...] und markieren den Prozess PROFAN.EXE. Im Menü wird dann Programm/Optionen und Zahl in Bytefolge ausgewählt und in den dann erscheinenden Dialog $ABC1234 eingegeben. Nun Klicken wir rechts ins Treeview auf PROFAN.EXE, wählen Speicher durchsuchen aus und klicken danach (ohne im Dialog irgendetwas zu ändern) auf den Button Speicher durchsuchen. TNT sucht nun im Speicher von PROFAN.EXE nach der Zahl $ABC1234, die dem Wert von GetLastError entspricht. Ziemlich am Ende des per den User zugänglichen virtuellen Prozessspeichers wird [...] fündig: Windows2000 (SP2 und SP4) => Adresse 2147344436
Ändern wir nun durch anklicken des Buttons Fehler produzieren il valore von GetLastError, ändert sich auch der Wert, der im Speicher an dieser Stelle steht.
Diese Adresse bezieht sich aber scheinbar nicht nur auf diesen einen Prozess, sonder an dieser Adresse scheint in jedem Prozess der Wert von GetLastError zu stehen. Was mich jetzt noch interessiert: Wie lautet die gefundene Adresse unter XP? Kann mir da jemand helfen?? |
|
|
| |
|
|
|
| Unter nicht NT-basierenden Systemen sieht die Sache dagegen anders aus. Da der virtuelle Speicher, in dem der Wert von GetLastError gespeichert wird, an dieser Stelle komplett anders verwaltet wird als unter NT, hat dort jeder Prozess eine andere Errorcodeadresse. |
|
|
| |
|
|