2012-05-29 4 views
4

GetRawInputDeviceInfo을 사용하여 USB HID 장치 이름의 장치 이름을 가져옵니다.GetRawInputDeviceInfo가 Windows XP에서 USB HID 장치 이름의 잘못된 구문을 반환합니다.

Windows XP에서 코드를 실행하면 \??\으로 시작하고 \\?\이 아닌 장치 이름이 나타납니다. 내가 예 "가 작동하지 않습니다에 대한 CreateFile이 장치 이름을 (사용하려고하면. 내가 장치 이름을 편집하고 수동으로 \\?\ 모든 것이 잘 작동 할 문제를 해결할 경우 있음을 물론 수단의

이.

이 없습니다. 모든 것이 잘 작동 Win7에에서 윈도우 7에

나는 또한 모든 API 호출 후에 GetLastError 테스트를 발생 않으며 오류가 발생하지 않습니다.

내 모든 운영 체제의 32 비트이며, 내 프로젝트는 유니 코드로 컴파일된다.

어떤 제안을 내 잘못하고 있습니까 ?? 다음은 장치 이름을 가져 오는 내 콘솔 응용 프로그램의 코드 조각입니다.

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); 
... 

... 

답변

6

잘못된 것은 아닙니다.

두 번째 문자를 \으로 변경하면 설정됩니다. 네이티브 형식의 원시 장치 경로 (\??\...)가 나타납니다. Win32 하위 시스템이 \?? 오브젝트 디렉토리로 제한되었지만 NT가 도착했을 때 Win32에서 긴 경로 이름을 사용할 수 있도록 창안 된 신원 미상의 MS 인 양식 \\?\을 가지고있을 때.

Russinovich (이전 버전에서 할 것입니다)의 "Windows Internals"장을 읽어보고 Sysinternals의 winobj.exe를 사용하여 Windows의 개체 네임 스페이스를 탐색하여 내가 말하는 것을 확인하십시오.

사이드 노트 : CreateFile으로 전화 할 때 kernel32.dll의 코드는 원래 변경된 기능을 그대로 사용하고 네이티브 기능이 경로를 보게됩니다. 따라서이 작업은 Win32 계층이 경로를 이해하도록하는 것입니다.

+0

10x 많이 있습니다. 나는 제안 된 독서의 verison을 발견하고 이렇게 할 것이다 .... 그러나, 왜 winXP와 win7의 차이가 있니? – user1423622

+0

@ user1423622 : 나는 * why *에서만 추측 할 수 있습니다. 블로그 작성자에게 질문을 던져야합니다 : The Old New Thing :) – 0xC0000022L