Отправить IOCTL в драйвер устройства Windows - сбой CreateFile

Я хочу отправить команду IOCTL считывателю PC / SC, подключенному к моему компьютеру (64-разрядная версия Win7). Чтобы отправить команду IOCTL, мне нужен HANDLE на устройство, которое я не могу создать.

Устройство отображается как «OMNIKEY 1021» в диспетчере устройств, имя объекта физического устройства - «\ Device \ USBPDO-15».С помощью инструмента «WinObj» я могу обнаружить 2 символические ссылки: USB # VID_076B & PID_1021 # 5 & 291f6990 & 0 & 1 # {50dd5230-ba8a-11d1-bf5d-0000f805f530} USB # VID_076B & PID1 -11d2-901f-00c04fb951ed}

Моя проблема: я не могу создать действительный дескриптор этого устройства с помощью функции CreateFile:

Я нашел несколько возможных форматов в MSDN / Google для использования в качестве параметра lpFileName функции CreateFile, но ни один из них, похоже, не работает:

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

Пример кода :

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

Примечания:

  • Возвращенный дескриптор всегда недействителен
  • Всегда работает от имени администратора, поэтому привилегии не должны быть проблемой

edit:

Решение:

  • Служба PC / SC принимает исключительное владение устройствами, поэтому любая попытка вызвать CreateFile всегда будет неудачной.
  • Решением является драйвер пространства ядра, который позволяет передавать IRP драйверу. (Мне удалось реализовать драйвер фильтра KMDF для изменения данных, отправляемых / получаемых на / от устройства)
9
задан bmotmans 30 November 2011 в 20:39
поделиться