Verwenden der newdev.dll

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Verwenden der newdev.dll

Beitrag von The_Dark_Zim-.- »

Hey ho,

ich versuche gerade einen Treiber mithilfe der newdev.dll zu installieren. Leider bekomme ich beim versuch die Funktion "UpdateDriverForPlugAndPlayDevicesA" bzw. "UpdateDriverForPlugAndPlayDevicesW" auf zu rufen eine Fehlermeldung "Ungültiger Speicherzugriff".
Da ich nicht so oft mit DLL's arbeite dachte ich mir frag ich mal lieber nach ^^

Code: Alles auswählen

hwnd = 0
hardwareid$ = "USB\VID_0000&PID_0400"
path$ = "C:\Documents And Settings\Administrator\My Documents\Dropbox\HTK\USB\"
flag = 0
reboot = 0

Procedure.s GetSpecialFolder(iCSIDL.i)
  Protected sPath.s = Space(#MAX_PATH)

  If SHGetSpecialFolderPath_(#Null, @sPath, iCSIDL, 0) = #True
     ProcedureReturn sPath
   Else
      ProcedureReturn ""
  EndIf
EndProcedure

system32$ = GetSpecialFolder(#CSIDL_SYSTEM) + "\newdev.dll"

OpenLibrary(0, system32$)

Debug CallCFunction(0, "UpdateDriverForPlugAndPlayDevicesA", hwnd, @hardwareid$, @path$, flag, reboot)
CloseLibrary(0)
Merkwürdigerweise finde ich auch nur sehr wenig zu "UpdateDriverForPlugAndPlayDevicesA" bzw. "UpdateDriverForPlugAndPlayDevicesW". Bei MSDN ist immer nur die Rede von "UpdateDriverForPlugAndPlayDevices".
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Verwenden der newdev.dll

Beitrag von NicTheQuick »

Soweit ich weiß ist die Funktion mit A am Ende die Ascii-Version und die mit W am Ende die Unicode-Version. Vielleicht solltest du es mal mit einem Prototype versuchen. Das ist eh die bessere Version.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Verwenden der newdev.dll

Beitrag von edel »

Tausch mal CallCFunction gegen CallFunction aus.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Verwenden der newdev.dll

Beitrag von Chimorin »

Eventuell kann es auch an trivialen Dingen scheitern.
Welcher Version gehört die DLL an (x64/x86); Wie kompillierst du dein Programm?
Für x64-Programme brauchst du x64 DLLs (x86 geht wohl nicht nach eigener Erfahrung, finde ich aber merkwürdig)
Für x86 eben x86.
Bild

- formerly known as Bananenfreak -
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: Verwenden der newdev.dll

Beitrag von ts-soft »

Erstmal: Programm muß nativer DLL-Auslösung entsprechen, also 64-Bit OS = 64-Bit Programm, andernfalls
geht es ja nur in 32-Bit!

Die Funktion gibt es in Unicode oder Ansi (A oder W am ende des Namens, wir nehmen Unicode per Pseudocode).

Hier der Code, wobei ich voraussetze, das die Parameter korrekt sind:

Code: Alles auswählen

EnableExplicit

Prototype UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid.p-unicode, path.p-unicode, flag, reboot)

Define hWnd = 0
Define hardwareid.s = "USB\VID_0000&PID_0400"
Define path.s = "C:\Documents And Setting\Administrator\My Documents\Dropbox\HTK\USB\"
Define flag = 0, reboot = 0

Define DLL, UpdateDriverForPlugAndPlayDevices.UpdateDriverForPlugAndPlayDevices

DLL = OpenLibrary(#PB_Any, "newdev.dll")
If DLL
  Debug DLL
  UpdateDriverForPlugAndPlayDevices = GetFunction(DLL, "UpdateDriverForPlugAndPlayDevicesW")
  Debug UpdateDriverForPlugAndPlayDevices
  If UpdateDriverForPlugAndPlayDevices
    Debug UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid, path, flag, reboot)
  EndIf
  CloseLibrary(DLL)
EndIf
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
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Verwenden der newdev.dll

Beitrag von The_Dark_Zim-.- »

Hey ho,

ich bin heute endlich zum Testen gekommen :)

Ich habe jetzt folgenden Code der so funktioniert (getestet unter XP(32/64)

Code: Alles auswählen

EnableExplicit

Prototype UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid.p-unicode, path.p-unicode, flag, reboot)

Define hWnd = 0
Define hardwareid.s = "USB\VID_0000&PID_0400&Rev_0100"
Define path.s = "C:\USB\VCPDriver.inf"
Define flag = 0, reboot = 0
Define lasterror = 0
Define error$ = ""

Define DLL, UpdateDriverForPlugAndPlayDevices.UpdateDriverForPlugAndPlayDevices

DLL = OpenLibrary(#PB_Any, "newdev.dll")
If DLL
  Debug DLL
  UpdateDriverForPlugAndPlayDevices = GetFunction(DLL, "UpdateDriverForPlugAndPlayDevicesW")
  Debug UpdateDriverForPlugAndPlayDevices
  If UpdateDriverForPlugAndPlayDevices
    If UpdateDriverForPlugAndPlayDevices(hWnd, hardwareid, path, flag, reboot) = 0
      lasterror = GetLastError_()
      Select lasterror
        Case #ERROR_FILE_NOT_FOUND
          error$ = "ERROR_FILE_NOT_FOUND"
          ; Case #ERROR_IN_WOW64 ; Scheinbar nicht implementiert
          ;   Debug "ERROR_IN_WOW64"
        Case #ERROR_INVALID_FLAGS
          error$ =  "ERROR_INVALID_FLAGS"
        Case 3758096907
          error$ =  "ERROR_NO_SUCH_DEVINST"
        Case #ERROR_NO_MORE_ITEMS
          error$ =  "ERROR_NO_MORE_ITEMS"
        Default
          error$ = Str(lasterror)
      EndSelect
      MessageRequester("Treiber", "Fehlercode: " + error$) 
      
    Else
      MessageRequester("Treiber", "Treiber wurde erfolgreich installiert!")
    EndIf
  EndIf
  CloseLibrary(DLL)
EndIf
Wenn man XP x64 benutzt muss man mit PB x64 Compilieren

Ich Danke für eure Hilfe :)

Gruß Zim
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Verwenden der newdev.dll

Beitrag von Chimorin »

The_Dark_Zim-.- hat geschrieben: Wenn man XP x64 benutzt muss man mit PB x64 Compilieren
Da hast du etwas falsch verstanden. Du kannst unter Win x64 x64- und x86-Programme ausführen.
Unter Win x86 nur 32-bit Programme.
Du musst allerdings die passende DLL-Version für dein Programm haben.
Windows ist da in erster Linie egal.
Bild

- formerly known as Bananenfreak -
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: Verwenden der newdev.dll

Beitrag von ts-soft »

@Chimorin

Das gilt aber nicht für Treiber-DLLs!
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
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Verwenden der newdev.dll

Beitrag von _JON_ »

@Chimorin

Er hat nichts falsch verstanden. Die Funktion UpdateDriverForPlugAndPlayDevices() muss von einem nativen Programm aufgerufen werden.

Sonst bekommt man den Error: ERROR_IN_WOW64

"The calling application is a 32-bit application attempting to execute in a 64-bit environment, which is not allowed."
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
The_Dark_Zim-.-
Beiträge: 372
Registriert: 18.03.2008 16:53

Re: Verwenden der newdev.dll

Beitrag von The_Dark_Zim-.- »

Hey Ho,

mit dem Compilieren in der richtigen Version hatte ich geschrieben, da ich, als ich mit der x86 Version compiliert hatte, einen Fehler code ~ -5XXXXXX bekommen hatte.
Mit der x64 Version ging es dann.

Ich habe das Ganze heute außerdem noch mit Win7 32bit testen können, wo es auch Funktioniert :). Man muss die Exe allerdings mit Adminrechten ausführt, sonst bekommt man den Fehlercode 5 :roll:
PB: 5.xx LTS x86/x64 | WIN: 10 Pro x64, Linux Mint x64
Antworten