Я хочу отправить команду IOCTL на устройство чтения ПК / SC, подключенное к моему компьютеру (win7 64 bit).Чтобы отправить команду IOCTL, мне нужна РУЧКА на устройство, которое я не могу создать.
Устройство указано как «OMNIKEY 1021» в диспетчере устройств, имя объекта физического устройства - «\ Device \ USBPDO-15" .Использование "Winobj" инструмент, я могу обнаружить 2 символические ссылки: 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}
Моя проблема: я не могу создать действительный дескриптор этого устройства с помощью функции 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:
Решение:
- Служба ПК / SC получает исключительное право собственности на устройства, поэтому любая попытка вызова CreateFile всегда будет неудачной.
- Решением является драйвер пространства ядра, это позволяет вам передавать IRP водителю.(Мне удалось реализовать драйвер фильтра KMDF для изменения данных, отправляемых / полученных на / с устройства)