GetRawInputDeviceInfo возвращает неверный синтаксис имени устройства HID USB в Windows XP

Я использую 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);
...

...

1 ответ

Вы не делаете ничего плохого.

Просто измените второго персонажа на \ и вы настроены То, что вы видите, это необработанный путь к устройству в его исходной форме (\??\...). Когда у вас есть форма \\?\ это опора MS, изобретенная, чтобы сделать длинные имена путей доступными на Win32, когда NT прибыла, несмотря на ограничение подсистемы Win32 для \?? каталог объектов.

Пожалуйста, прочитайте несколько глав "Windows Internals" Руссиновича (подойдет любая старая редакция) и используйте winobj.exe из Sysinternals, чтобы изучить пространство имен объектов Windows, чтобы понять, о чем я говорю.

Примечание: когда вы звоните CreateFile код в kernel32.dll буквально отменит предлагаемое изменение и преобразует его обратно в исходную форму, прежде чем собственные функции смогут увидеть путь. Таким образом, все, что вы делаете с этим, это чтобы слой Win32 понимал путь.

Другие вопросы по тегам