windows - GetRawInputDeviceInfo 在 Windows XP 中返回错误的 USB HID 设备名称语法

标签 windows winapi usb raw-input

我正在使用 GetRawInputDeviceInfo获取 USB HID 设备名称的设备名称。

出于某种原因,当我在 Windows XP 下运行我的代码时,我得到一个以 \??\ 开头的设备名称而不是 \\?\ .

这当然意味着,当我尝试使用此设备名称(例如 CreateFile)时,它不起作用。如果我编辑设备名称并手动将其修复为 \\?\,一切正常。

这在 Windows 7 中不会发生。在 Win7 中一切正常。

我还测试了 GetLastError每次 API 调用后都没有发生错误。

我所有的操作系​​统都是 32 位的,我的项目是用 unicode 编译的。

有什么建议我做错了吗?这是我的控制台应用程序的代码片段,它获取设备名称。

nResult = GetRawInputDeviceInfo( pDeviceList[i].hDevice, RIDI_DEVICENAME, NULL, &nBufferSize );
if( nResult < 0 )
{
cout << "ERR: Unable to get Device Name character count.." << endl;
return false;
}
WCHAR* wcDeviceName = new WCHAR[ nBufferSize + 1 ];
if( wcDeviceName == NULL )
{
cout << "ERR: Unable to allocate memory for Device Name.." << endl;
return false;
}
nResult = GetRawInputDeviceInfo( pDeviceList[i].hDevice, RIDI_DEVICENAME, wcDeviceName, &nBufferSize );
if( nResult < 0 )
{
cout << "ERR: Unable to get Device Name.." << endl;
delete [] wcDeviceName;
return false;
}
wcDeviceName[1]='\\';
//This is the manual fix for the device name in WinXP. How do I get rid of it????
pDesc->hHandle = CreateFile(wcDeviceName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
...

...

最佳答案

你没有做错什么。

只需将第二个字符更改为 \ 即可。您看到的是原始格式的原始设备路径 (\??\...)。当你有 \\?\ 的形式时,它是 MS 发明的一个拐杖,当 NT 出现时,尽管 Win32 子系统对 \?? 对象目录。

请阅读 Russinovich 的“Windows Internals”(任何旧版本都可以)的几章,并使用 Sysinternals 中的 winobj.exe 探索 Windows 的对象命名空间,看看我在说什么。

旁注:当您调用 CreateFile 时,kernel32.dll 中的代码将逐字撤消建议的更改,并在 native 函数获取之前将其转换回其 native 形式看到路径。所以你所做的就是让 Win32 层理解路径。

关于windows - GetRawInputDeviceInfo 在 Windows XP 中返回错误的 USB HID 设备名称语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10798798/

相关文章:

java - 如何将 PATH 环境变量设置为指向 JRE 1.5 版

windows - 将端口 21 更改为 30 后,FileZilla FTP 服务器错误 "425 Can' t 打开数据连接

windows - 暂停命令在 .bat 脚本中不起作用

winapi - 如何正确初始化 Win32 HANDLE?

c++ - 在 win32 应用程序中动态设置 DPI 感知级别

linux - 有没有办法检查 USB 驱动器是否已停止?

windows - 如何批量获取上次修改文件的前一个(第n个)

c - nedmalloc:mem>=fm 从何而来?

linux - 如何在 linux 内核编程中从 'device struct' 获取 'dev_t'?

c++ - WinUsb_初始化错误 8 - ERROR_NOT_ENOUGH_MEMORY