SetupVerifyInfFile Function um zu überprüfen ob Treiber signiert sind

  • Hi,
    ich möchte prüfen, ob ein bestimmte inf datei "signed" ist oder nicht? Laut MSDN soll das mit dieser Funktion gehen:

    http://msdn.microsoft.com/en-us/library/…7(v=vs.85).aspx

    Hier mal ein Versuch:

    [autoit][/autoit][autoit][/autoit][autoit]

    ;~ Local $sPath = "C:\network_share\driver\NVHDCi.inf"
    Local $sPath = "C:\network_share\driver\nv_dispi.inf"
    Local $signed = DllCall("setupapi.dll", "BOOL", "SetupVerifyInfFileW", _
    "WSTR", $sPath, _
    "PTR", 0, _
    "PTR*", 0 _ ; out
    )
    If @error Then MsgBox(0, "DLL error", @error)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($signed)

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "error", _WinAPI_GetLastError())

    [/autoit]

    Return code ist 0 und der letze pointer der eigentliche auf eine " SP_INF_SIGNER_INFO" Struktur verweisen sollte ist auch 0. Also Requirements ist angegeben:

    Zitat

    Minimum supported client: Windows XP


    Die wenigen autoIT Beiträge die ich dazu gefunden habe, benutzten Windows XP. Funktioniert die Funktion nicht unter Windows 7? Hier ist ein Artikel, dort steht unter Windows Vista, könnte man mit der Funktion keine Treiber prüfen, aber ist das nicht veraltet?
    Microsoft Artikel

    Gibt es eine Alternative Funktion (nicht auf WMI Basis)?

    Danke schonmal!

    • Offizieller Beitrag

    Return code ist 0 und der letze pointer der eigentliche auf eine " SP_INF_SIGNER_INFO" Struktur verweisen sollte ist auch 0.


    Zum grundlegenden Handling:
    Wenn MSDN angibt, dass dort Pointer auf bestimmte Strukturen verweisen, dann mußt du die Strukturen vorher erstellen und den Pointer auf diese an den Aufruf übergeben damit die Strukturen befüllt werden können. Aus diesen Strukturen kannst du dann die Ergebniswerte auslesen.

  • Ja so ein Beispiel hab ich auch, sieht dann so aus:

    [autoit]

    $ptr=DllStructCreate("dword;char[260];char[260];char[260]")
    $signed=DllCall("setupapi.dll","INT","SetupVerifyInfFile","wstr",$sPath, "ptr",0,"ptr",DllStructGetPtr($ptr))
    _ArrayDisplay($signed)
    MsgBox(0, "error", _WinAPI_GetLastError() & " " & _WinAPI_GetLastErrorMessage())
    _DLLStructDisplay($ptr, "dword;char[260];char[260];char[260]")

    [/autoit][autoit][/autoit][autoit]

    If $signed[0] Then
    MsgBox(0,"",$signed[0]) ;debug only
    MsgBox(0,"Signed?",DllStructGetData($ptr,2) & @LF & DllStructGetData($ptr,3) & @LF & DllStructGetData($ptr,4))
    Else
    MsgBox(0,"Error","DllCall")
    Endif

    [/autoit]

    Ist von unseren englischen Usern geklaut, funktioniert leider auch nicht!

    PS: Bei der DISM API habe statt einen Pointer auf eine Struktur bei allen Funktionen immer einen 0 Pointer benutzt. Danach dann die Speicherstelle aus dem Array was mir DLLCall zurückgibt ausgelesen!

    • Offizieller Beitrag

    Interessant:
    Gestern führte mich dein MSDN-Link zur Funktion "SetupVerifyInfFile". Heute lande ich in Hilfe & Support mit dem Hinweis

    Zitat

    System Tip
    This article applies to a different version of Windows than the one you are using. Content in this article may not be relevant to you.

    (Ich nutze Windows 7)
    Daraus schließe ich mal, dass diese Funktion unter Windows 7 keine Anwendung findet.

    Edit:
    Da war ich auf den anderen Link gerutscht :D
    Aber warum soll der nicht mehr gültig sein? Mir wird gesagt das klappt nicht mit Win7 - also gehe ich auch mal aus, dass diese Funktion für Win7 nicht zur Verfügung steht.

  • Das Problem ist, wenn ich mir nicht 100% sicher bin, dann schließe ich eine Funktion nicht aus.
    Auf der MSDN Seite steht nicht eindeutig geschrieben, dass die Funktion unter Windows 7 nicht unterstützt wird oder?

    Wird die Funktion also nicht unterstützt BugFix? Gibt es eine andere API oder Workaround, um zu prüfen, ob eine INF Datei signiert/ unsigniert ist?

  • so funktioniert es bei mir (Win 8.1 SP1 x64)
    [autoit]

    #include <Array.au3>
    #include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $s_InfPath = "D:\x\android_usb.inf"

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $d_MAX_PATH = Int(0x00000104)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $tag_SP_INF_SIGNER_INFO_V2 = "struct;DWORD cbSize;CHAR CatalogFile[" & $d_MAX_PATH & "];CHAR DigitalSigner[" & $d_MAX_PATH & "];CHAR DigitalSignerVersion[" & $d_MAX_PATH & "];DWORD SignerScore;endstruct;"
    Global $strct_SP_INF_SIGNER_INFO_V2 = DllStructCreate($tag_SP_INF_SIGNER_INFO_V2)
    $strct_SP_INF_SIGNER_INFO_V2.cbSize = DllStructGetSize($strct_SP_INF_SIGNER_INFO_V2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $a_Ret = DllCall("setupapi.dll", "int", "SetupVerifyInfFile", "str", $s_InfPath, "ptr", Null, "ptr", DllStructGetPtr($strct_SP_INF_SIGNER_INFO_V2))
    $x = _WinAPI_GetLastError()
    $y = _WinAPI_GetLastErrorMessage()

    [/autoit] [autoit][/autoit] [autoit]

    If $x Then ; Falls Fehler aufgetreten ist
    _ArrayDisplay($a_Ret, $x & ": " & $y)
    Else
    MsgBox(0, "", "Die Datei " & $s_InfPath & " ist " & ($a_Ret[0] ? "" : "nicht ") & "signiert")
    EndIf

    [/autoit]
  • Hey vielen Dank für deine Mühe, bei mir tut sich leider nichts. Er returnt immer 0. Könntest du mal bitte deine ".inf" Datei und deine setupapi.dll hochladen. Das wäre super!

    Edit: Funktioniert doch sorry, die Funktion setzt voraus, dass die dazugehörige CAT Datei im Verzeichnis der INF Datei beiliegt.

    Dann habe ich mal eine andere Frage: Ich arbeite mit der DISM API und füge Treiber einem WIM Image mit der Funktion DismAddDriver hinzu. Einer der Parameter ist ein Boolean:

    Ich habe aktuell ForceUnsigned = False
    Das Image, welches ich gemeounted habe, ist x64. Wie kommt es, das er manche INF Dateien, denen keine CAT Datei beiliegt, ohne Fehler hinzufügt, bei anderen, wo auch keine CAT im INF Verzeichnis beiliegt wirft er einen (unsupported->unsigned) Fehler. Wenn ich dann die passende CAT in den Ordner, wo die INF liegt kopiere, fügt er diese auch ohne Fehler hinzu.

    Hier mal eine Beispiel Datei, die er ohne Fehler hinzufügt, obwohl keine CAT im Ordner liegt:


    Es scheint als nutzt DISM die setup API. Hier ist der log zu der INF, nachdem ich sie mit DismAddDriver hinzugefügt habe:

    Hast du eine Idee, wieso das so ist?

    3 Mal editiert, zuletzt von Trolleule1337 (31. Juli 2014 um 18:27)

  • Hey vielen Dank für deine Mühe, bei mir tut sich leider nichts. Er returnt immer 0. Könntest du mal bitte deine ".inf" Datei und deine setupapi.dll hochladen. Das wäre super!
    Edit: Funktioniert doch sorry, die Funktion setzt voraus, dass die dazugehörige CAT Datei im Verzeichnis der INF Datei beiliegt.

    Du musst auch darauf achten, dass du x64-Treiber nur mit einem x64-Skript und x86-Treiber nur mit einem x86-Skript prüfen kannst (zumindestens so wie es jetzt aufgebaut ist).

    Zu der anderen Frage: Kenne ich nicht und weiß auch nicht worum es geht.

  • ok Danke für den Tipp. Du sagst, so wie es jetzt aufgebaut ist, wie könnte es denn für beide Architekturen aussehen? Muss ich für einen x64 Treiber, das Skript nur in x64 kompilieren und auf einem x64 OS ausführen?

  • Also ich hab das Skript als x64 und x86 kompiliert und einen x64 treiber abgefragt, den DismAddDriver ohne Fehler zum Image hinzufügt hätte, trotz fehlender CATALOG Datei. Habe das x64 Skript auf einem x64 System und das x86 Skript auf einem x86 System getestet und auf beiden System gibt das Skript 0 zurück.

    Wieso kann DismAddDriver diesen treiber hinzufügen (obwohl er laut SetupVerifyInfFile UNSIGNED ist) und andere nicht? Ich weiß net weiter ?(

  • Es ist nicht direkt eine Installation, sondern eine Integration in ein WIM Image. (DISM UDF) -> ergänzt die WIMGAPI UDF.

    Aber ich glaube ich weiß, wo das Problem liegt. Weisst du, ob es in der setup API eine Funktion gibt, mit der ich die zu kopierenden Files die in den folgenden sections meine INF drin stehen, identifizieren kann?

    Zitat

    [SourceDisksNames.amd64]
    0=%Desc_amd640%

    [SourceDisksFiles.amd64]
    ahcix64s.sys=1,

    Dann könnte ich nämlich abfragen, ob sich diese Dateien im Ordner der INF Datei befinden, wenn nicht, wird meine DismAddDriver Funktion nämlich einen Fehler schmeissen.

    Danke schonmal!