Envoyer IOCTL à des pilotes de périphérique Windows - CreateFile échoue

Je veux envoyer un IOCTL commande à un PC/SC lecteur connecté à mon ordinateur (win7 64 bits).
Pour envoyer une commande IOCTL j'ai besoin d'une POIGNÉE de l'appareil, dont je ne suis pas en mesure de créer.

Le périphérique est répertorié comme "les lecteurs omnikey 1021" dans le gestionnaire de périphérique, le périphérique physique nom de l'objet est "\Device\USBPDO-15". À l'aide de la "WinObj" de l'outil, je peux détecter les 2 liens symboliques:
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}

Mon problème: je ne peux pas créer un descripteur valide pour cet appareil avec la fonction CreateFile:

J'ai trouvé plusieurs formats possibles sur MSDN/Google à utiliser comme lpFileName param de la fonction CreateFile, mais aucun d'entre eux semblent fonctionner:

\\?\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}

Exemple de Code:

#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;
}

Notes:

  • Le handle retourné est toujours invalide
  • Toujours en cours d'exécution en tant qu'Administrateur, de sorte que les privilèges ne devrait pas être un problème

edit:

Solution:

  • PC/SC service prend possession exclusive des appareils, de sorte que toute tentative de faire appel 'CreateFile' échouera toujours.
  • La solution est un espace noyau conducteur, il vous permet de passer de l'IRP pour le pilote. (J'ai été en mesure de mettre en œuvre un KMDF pilote de filtre pour modifier les données envoyées/reçues vers/à partir de l'appareil)
Avez-vous essayer d'envoyer un contrôle d'accès? E. g. GENERIC_READ au lieu de 0?
Il a été suggéré quelque part sur le site web MSDN à 0 lors de l'utilisation de CreateFile en combinaison avec un pilote de périphérique. Cependant, j'ai essayé GENERIC_READ, GENERIC_READ | GENERIC_WRITE et 0 sans résultat.
Qu'est-ce que le code d'erreur? Accès refusé? Fichier non trouvé?
selon le format de l'appareil de la chaîne, je reçois 3 différentes erreurs: Le système ne peut pas trouver le fichier spécifié, Le nom de fichier, le nom du répertoire ou de la syntaxe du nom de volume est incorrecte ou Le chemin réseau n'a pas été trouvé
Certains pilotes de périphérique d'accepter seulement les noms qui ont plus connu-seulement-pour-leur des trucs dans les noms après "nom du périphérique\". Il y a peut être d'autres des moyens spéciaux pour l'ouverture. Je me demande si vous pouvez en savoir plus en utilisant le débogueur de noyau (WinDbg), définition de points d'arrêt, ici et là, et en regardant ce qui est passé à/à partir du pilote.

OriginalL'auteur bmotmans | 2011-11-24