发送IOCTL到Windows设备驱动程序 – CreateFile失败

我想发送一个IOCTL命令到连接到我的电脑(win7 64位)的PC / SC阅读器。 为了发送一个IOCTL命令,我需要一个HANDLE的设备,我无法创build。

该设备在设备pipe理器中被列为“OMNIKEY 1021”,物理设备对象名称为“\ Device \ 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#{a5dcbf10-6530-11d2-901f-00c04fb951ed}使用“WinObj”工具,可以检测2个符号链接:

我的问题:我不能用CreateFile函数创build一个有效的句柄给这个设备:

我在MSDN / Google上find了几种可能的格式来作为CreateFile函数的lpFileName参数,但是它们都不起作用:

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

笔记:

  • 返回的句柄总是无效的
  • 总是以pipe理员身份运行,所以权限不应该成为问题

编辑:

解:

  • PC / SC服务占用设备的独占所有权,因此任何尝试调用“CreateFile”的尝试都将失败。
  • 该解决scheme是一个内核空间驱动程序,它允许您将IRP传递给驱动程序。 (我能够实现一个KMDFfilter驱动程序来更改发送到设备的数据/从设备接收数据)

试试我的方式。 我使用安装程序API来枚举系统中的所有USB活动设备并获取路径。 这样你可以找出它是否是CreateFile不喜欢的路径或其他参数。

如果有人感兴趣,我会稍后添加一些评论。

 HDEVINFO hDevInfo = SetupDiGetClassDevs( &_DEVINTERFACE_USB_DEVICE, 0, 0, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if(hDevInfo == INVALID_HANDLE_VALUE) { return ERR_FAIL; } std::vector<SP_INTERFACE_DEVICE_DATA> interfaces; for (DWORD i = 0; true; ++i) { SP_DEVINFO_DATA devInfo; devInfo.cbSize = sizeof(SP_DEVINFO_DATA); BOOL succ = SetupDiEnumDeviceInfo(hDevInfo, i, &devInfo); if (GetLastError() == ERROR_NO_MORE_ITEMS) break; if (!succ) continue; SP_INTERFACE_DEVICE_DATA ifInfo; ifInfo.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA); if (TRUE != SetupDiEnumDeviceInterfaces(hDevInfo, &devInfo, &(_DEVINTERFACE_USB_DEVICE), 0, &ifInfo)) { if (GetLastError() != ERROR_NO_MORE_ITEMS) break; } interfaces.push_back(ifInfo); } std::vector<SP_INTERFACE_DEVICE_DETAIL_DATA*> devicePaths; for (size_t i = 0; i < interfaces.size(); ++i) { DWORD requiredSize = 0; SetupDiGetDeviceInterfaceDetail(hDevInfo, &(interfaces.at(i)), NULL, NULL, &requiredSize, NULL); SP_INTERFACE_DEVICE_DETAIL_DATA* data = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc(requiredSize); assert (data); data->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &(interfaces.at(i)), data, requiredSize, NULL, NULL)) { continue; } devicePaths.push_back(data); } 

试试CreateFile(L"\\\\.\\{GUID}",etc..