2011-04-18 4 views
0

드라이버가있어서 심볼 이름을 만들었습니다. 기호 이름은 내가 ...사용자 모드에서 드라이버 핸들 열기

다음 경로에 CreateFile()를 사용하여 시도 "The system cannot find the file specified".

, 내가 usermode에서 CreateFile()를 사용하여 장치 개체에 액세스하려고 할 때

L"\\DosDevices\\hook" 

, 난 항상 오류가 발생입니다 ...

"\\.\hook" 
"\\Device\\hook" 
"\\\\.\\hook" 
"\\.\hook" 

하지만 여전히 작동하지 않습니다. 그러나 Visual Basic 6에서 동일한 API 호출을 시도하면 "\\. \\ hook"이 올바르게 작동하지만 "\\. \\ hook"이어야한다고 나와 있습니다. 여기에 무슨 문제가 있습니까? 이 모든 "\"의 목적은 무엇이며 Visual C++에서 어떻게 작동하게합니까?

답변

2

먼저 크리스 따라서 당신이 준 세 번째 변형이 일을해야

"\\.\hook"  -> "\\\\.\\hook" 

을 지적 있었는지 온다. "\\Device\\hook"은 Win32 API와 함께 작동하지 않을 것입니다. 이는 \\DosDevices 또는 \\?? 및 그 변형 (세션 별 네임 스페이스) 아래로 제한됩니다. \\DosDevices\\??은 일반적으로 동일한 위치이며 정확한 OS 버전에 따라 다른 하나에 대한 심볼릭 링크입니다.

실패 할 수있는 몇 가지 이유가 있습니다. 하나는 네임 스페이스이고 다른 하나는 틀린 것입니다. 내부적으로 경로 \\.\ (여기서 백 슬래시의 구문 이스케이프를 생략 함)은 \??\으로 변환되며 Win32와 기본 API 사이의 경계에서 수행됩니다. 후자의 경로 (\??\...)는 네이티브 API와 OS 자체가 이해하는 것입니다. 다른 이유로는 실행하려는 실제 코드를 게시해야합니다 (특히 CreateFile 호출). 따라서 더 많은 정보가 요구됩니다. 하나의 질문은 실수로 넓은 문자열을 ANSI 함수에 전달했는지 여부와 존재하지 않는 경로를 찾는 것입니다. 그리고 코드를 게시 할 때 쉽게 배제 할 수있는 다양한 다른 가능성이 있습니다.

\\DosDevices\...도 개체의 기본 경로입니다. Win32 API에서 사용하지 마십시오. 아래의 메커니즘을 살펴 보려면 DefineDosDevice/QueryDosDevice을 참조하십시오.

실험을 위해서는 Sysinternals의 WinObj을 사용하고 "Windows Internals"시리즈의 책을 읽거나 Windows 드라이버의 모든 책은 항목을 분석해야합니다.

+0

실제로 문제는 간단한 문자열을 유니 코드 함수에 전달하는 것이 었습니다. 마지막으로 Visual C++에서 작동하는 문자열은 "L"\\\\입니다.장치 이름 타입 LPCTSTR이어야한다 때문에 주로 "후크 및 헤더 나처럼 발견 \\ 다음 - LPCWSTR LPCTSTR 타입 정의 UNICODE #ifdef와; #else LPCSTR LPCTSTR 타입 정의 ; – whatisinaname

+0

#endif 다음 @ user250687 : 아 멋지다. 나는 가능성 목록 ("한 가지 질문은 실수로 넓은 문자열을 ANSI 함수에 전달했는지, 따라서 존재하지 않는 경로를 찾느냐가 문제가 될 것입니다.)입니다." 다행 이네. 다행이야. – 0xC0000022L

0

C/C++에서 \ 문자가 문자열 리터럴에서 발견되면 이스케이프 시퀀스가 ​​도입됩니다.

`\r` - embed a CR 
`\n` - embeds a LF 
`\040` - embeds an character using an octal code 

\\ 실제 문자열 \ 단일 문자를 표시하는 것이 필요하다.

따라서 VB 문자열 리터럴 "\\.\\hook"은 C 문자열 리터럴 L"\\\\.\\\\hook"으로 변환됩니다.

관련 문제