Senden von IOCTL, um Windows-Geräte-Treiber - CreateFile fehlschlägt

Ich möchte zum senden einer IOCTL-Befehl an einen PC/SC-Leser angeschlossen an meinem computer (win7 64 bit).
Zum senden einer IOCTL-Befehl ich brauche einen HANDLE für das Gerät, das ich nicht in der Lage bin zu erstellen.

Den Geräte-als aufgeführt ist "OMNIKEY 1021" im Geräte-manager die physischen device object name "\Device\USBPDO-15". Mit dem "WinObj" - Werkzeug kann ich erkennen, 2 symlinks:
USB#VID_076B&PID_1021#5&291f6990&0&1#{50dd5230-ba8a-11d1-bf5d-0000f805f530}
USB#VID_076B&PID_1021#5&291f6990&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

Mein problem: ich kann nicht erstellen Sie ein gültiges handle für das Gerät mit der CreateFile-Funktion:

Fand ich mehrere mögliche Formate auf MSDN/Google zu nutzen als die lpFileName param von der CreateFile-Funktion, aber keiner von Ihnen scheint zu funktionieren:

\\?\Device\USBPDO-15
\\.\Device\USBPDO-15
\\GLOBAL??\Device\USBPDO-15
\GLOBAL??\Device\USBPDO-15
\\.\USBPDO-15
\\?\USB#VID_076B&PID_1021#5&291f6990&0&1#{50dd5230-ba8a-11d1-bf5d-0000f805f530}
\\.\USB#VID_076B&PID_1021#5&291f6990&0&1#{50dd5230-ba8a-11d1-bf5d-0000f805f530}
\\GLOBAL??\USB#VID_076B&PID_1021#5&291f6990&0&1#{50dd5230-ba8a-11d1-bf5d-0000f805f530}
\GLOBAL??\USB#VID_076B&PID_1021#5&291f6990&0&1#{50dd5230-ba8a-11d1-bf5d-0000f805f530}
\\?\USB#VID_076B&PID_1021#5&291f6990&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
\\.\USB#VID_076B&PID_1021#5&291f6990&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
\\GLOBAL??\USB#VID_076B&PID_1021#5&291f6990&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
\GLOBAL??\USB#VID_076B&PID_1021#5&291f6990&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

Code-Beispiel:

#include <iostream>
#include <Windows.h>

int main (int argc, char* argv[])
{
    HANDLE handle = CreateFile (
        L"\\\\.\\Device\\USBPDO-15",
        0,
        FILE_SHARE_READ, //FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        0, //FILE_FLAG_OVERLAPPED,
        NULL
    );

    if (handle == INVALID_HANDLE_VALUE)
        std::cout << "INVALID HANDLE" << std::endl;
    else
        std::cout << "HANDLE: " << std::hex << handle << std::endl;
}

Hinweise:

  • Das zurückgegebene handle ist immer ungültig
  • Immer als Administrator ausgeführt, also die Rechte sollten kein problem sein

edit:

Lösung:

  • Die PC/SC-Dienst nimmt die alleinigen Eigentümer der Geräte, so dass jeder Versuch zu nennen, 'CreateFile', wird immer scheitern.
  • Die Lösung ist ein kernel-space-Treiber, dieser ermöglicht die übergabe IRP dem Treiber. (Ich war in der Lage, implementieren eine KMDF filter driver zu verändern, Daten gesendet/empfangen zum/vom Gerät)
  • Haben Sie versucht, senden Sie eine Zutrittskontrolle? E. g. GENERIC_READ anstelle von 0?
  • Es wurde vorgeschlagen, irgendwo auf der MSDN-Website zu verwenden, 0 bei Verwendung von CreateFile in Kombination mit einem Gerätetreiber. Jedoch habe ich versucht, GENERIC_READ, GENERIC_READ | GENERIC_WRITE und 0 ohne Ergebnis.
  • Was ist der Fehler code? Zugriff verweigert? Datei nicht gefunden?
  • je nach format des Geräts string, bekomme ich 3 verschiedene Fehler: Das system kann nicht die angegebene Datei gefunden, wird Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch oder Der Netzwerkpfad wurde nicht gefunden
  • Einige Treiber akzeptieren nur Namen, die haben extra bekannt-nur-um-Sie Zeug in den Namen nach der "device name\". Es können auch andere spezielle Möglichkeiten für die Eröffnung als auch. Ich Frage mich, ob Sie herausfinden können, mehr über den kernel-debugger (WinDbg), setzen von breakpoints und hier und da schauen, was wird übergeben/von der Fahrer.
  • Alex : das war in der Tat der Fall ist, zusammen mit der Lösung von @Violet-giraffe, die ich herausgefunden, dass \\slot0 muss an das Ende der Geräte-string. Aber jetzt bekomme ich die Fehlermeldung Zugriff verweigert (als admin)
  • Ich habe versucht, zu verwenden diese Lösung, aber es funktioniert nicht: stackoverflow.com/questions/17465038/...

InformationsquelleAutor bmotmans | 2011-11-24
Schreibe einen Kommentar