Seite 1 von 1

IMA bei Adresse 0 (bei DLL-Aufruf und Adressübergabe)

Verfasst: 12.09.2010 17:26
von Mok
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.

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
Testen außerhalb der DLL mit Debug funktioniert einwandfrei, allerdings will ich keinen Umweg machen.

Re: IMA bei Adresse 0 (bei DLL-Aufruf und Adressübergabe)

Verfasst: 12.09.2010 20:51
von HeX0R
Mok hat geschrieben: Testen außerhalb der DLL mit Debug funktioniert einwandfrei, allerdings will ich keinen Umweg machen.
Ja ja, aber nur, wenn du GetCpuModelName() anstatt INF_GetCpuModelName() aufrufst, gell?

Re: IMA bei Adresse 0 (bei DLL-Aufruf und Adressübergabe)

Verfasst: 12.09.2010 21:17
von Mok
HeX0R hat geschrieben:Ja ja, aber nur, wenn du GetCpuModelName() anstatt INF_GetCpuModelName() aufrufst, gell?
Logisch - Prototype ohne DLL ist ja ziemlich sinnlos (Edit 2)

Edit
Ach du lieber Schreck... ich sollte bei meinen eigenen Namenskonventionen mal besser überlegen... mein Fehler *ganzkleinundhässlich*

Re: IMA bei Adresse 0 (bei DLL-Aufruf und Adressübergabe)

Verfasst: 12.09.2010 21:26
von ts-soft
Mok hat geschrieben:Logisch - Prototype ohne DLL gibt's ja nicht.
Diese Aussage solltest Du auch nochmal überdenken, Prototype wird
zwar meist mit DLLs genutzt, aber nicht nur.

Gruß
Thomas