IMA bei Adresse 0 (bei DLL-Aufruf und Adressübergabe)
Verfasst: 12.09.2010 17:26
Hallo.
Ich habe eine DLL mit einer Prozedur, die den CPU-Namen mittel ASM ermittelt, in einen String speichert und den Zeiger auf den String zurückgibt. Allerdings bekomme ich einen IMA bei der Adresse 0. Bei GetCpuVendor() (also Hersteller ermitteln), wird ebenfalls mit ASM gecodet und ein String-Zeiger zurückgegeben - allerdings ohne Fehler.
Testen außerhalb der DLL mit Debug funktioniert einwandfrei, allerdings will ich keinen Umweg machen.
Ich habe eine DLL mit einer Prozedur, die den CPU-Namen mittel ASM ermittelt, in einen String speichert und den Zeiger auf den String zurückgibt. Allerdings bekomme ich einen IMA bei der Adresse 0. Bei GetCpuVendor() (also Hersteller ermitteln), wird ebenfalls mit ASM gecodet und ein String-Zeiger zurückgegeben - allerdings ohne Fehler.
Code: Alles auswählen
If Not OpenLibrary(0,"cmdcore.dll")
MessageBox_(0,"cmdcore.dll konnte nicht gefunden oder nicht geöffnet werden!","Fehler!",#MB_OK|#MB_ICONERROR)
End
Else
Prototype.i pGetCpuVendor() ; funktioniert einwandfrei
Global GetCpuVendor.pGetCpuVendor = GetFunction(0,"INF_GetCpuVendor")
Prototype.i pGetCpuModelName() ; Prototyp definieren funktioniert noch
Global GetCpuModelName.pGetCpuModelName = GetFunction(0,"INF_GetCpuModelName")
EndIf
;[...]
AddGadgetItem(#ListIcon,-1,"Hersteller"+Chr(10)+PeekS(GetCpuVendor())) ; funktioniert (Sollte AuthenticAMD oder GenuineIntel ergeben)
AddGadgetItem(#ListIcon,-1,"Modell"+Chr(10)+PeekS(GetCpuModelName()))
Code: Alles auswählen
;DLL-Code
ProcedureDLL INF_GetCpuVendor()
Global sBuffer.s
Protected Zeiger1.l, Zeiger2.l, Zeiger3.l
!MOV EAX, 0
!CPUID
!MOV [p.v_Zeiger1], EBX
!MOV [p.v_Zeiger2], EDX
!MOV [p.v_Zeiger3], ECX
sBuffer = PeekS(@Zeiger1, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger2, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger3, 4, #PB_Ascii)
ProcedureReturn @sBuffer
EndProcedure
ProcedureDLL GetCpuModelName()
Global sBuffer.s
Protected Zeiger1.l, Zeiger2.l, Zeiger3.l, Zeiger4.l
!MOV eax, $80000002
!CPUID
!MOV [p.v_Zeiger1], EAX
!MOV [p.v_Zeiger2], EBX
!MOV [p.v_Zeiger3], ECX
!MOV [p.v_Zeiger4], EDX
sBuffer = PeekS(@Zeiger1, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger2, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger3, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger4, 4, #PB_Ascii)
!MOV eax, $80000003
!CPUID
!MOV [p.v_Zeiger1], EAX
!MOV [p.v_Zeiger2], EBX
!MOV [p.v_Zeiger3], ECX
!MOV [p.v_Zeiger4], EDX
sBuffer + PeekS(@Zeiger1, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger2, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger3, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger4, 4, #PB_Ascii)
!MOV eax, $80000004
!CPUID
!MOV [p.v_Zeiger1], EAX ; move eax to the buffer
!MOV [p.v_Zeiger2], EBX ; move ebx to the buffer
!MOV [p.v_Zeiger3], ECX ; move ecx to the buffer
!MOV [p.v_Zeiger4], EDX ; move edx to the buffer
sBuffer + PeekS(@Zeiger1, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger2, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger3, 4, #PB_Ascii)
sBuffer + PeekS(@Zeiger4, 4, #PB_Ascii)
ProcedureReturn @sBuffer
EndProcedure