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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

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

Beitrag 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.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

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

Beitrag 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?
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

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

Beitrag 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*
Zuletzt geändert von Mok am 12.09.2010 21:28, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten