Seite 1 von 1

Verwenden der newdev.dll

Verfasst: 17.07.2014 23:00
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".

Re: Verwenden der newdev.dll

Verfasst: 17.07.2014 23:18
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.

Re: Verwenden der newdev.dll

Verfasst: 18.07.2014 00:38
von edel
Tausch mal CallCFunction gegen CallFunction aus.

Re: Verwenden der newdev.dll

Verfasst: 18.07.2014 07:58
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.

Re: Verwenden der newdev.dll

Verfasst: 18.07.2014 11:49
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

Re: Verwenden der newdev.dll

Verfasst: 25.07.2014 18:58
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

Re: Verwenden der newdev.dll

Verfasst: 26.07.2014 16:51
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.

Re: Verwenden der newdev.dll

Verfasst: 26.07.2014 17:44
von ts-soft
@Chimorin

Das gilt aber nicht für Treiber-DLLs!

Re: Verwenden der newdev.dll

Verfasst: 26.07.2014 19:23
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."

Re: Verwenden der newdev.dll

Verfasst: 27.07.2014 23:26
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: