Открытие ручки для водителя из пользовательского режима - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть драйвер, и я создал для него символическое имя.Символическое имя ...

L"\\DosDevices\\hook"

Когда я пытаюсь получить доступ к объекту устройства с помощью CreateFile() из usermode, я всегда получаю ошибку, "The system cannot find the file specified".

Я пыталсяиспользуя CreateFile() со следующими путями ...

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

, но это все равно не работает.Однако если я попробую тот же вызов API в Visual Basic 6, «\\. \\ hook» работает правильно, однако в документации сказано, что это должен быть «\\\\. \\ hook».В чем здесь проблема?Какова цель всех этих «\» и как мне заставить его работать с Visual C ++?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Сначала приходит то, на что указывал Крис

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

Таким образом, третий вариант, который вы дали, должен был сработать."\\Device\\hook" определенно не будет работать с Win32 API.Они ограничены тем, что находится под \\DosDevices или \\?? и его вариациями (пространства имен для каждой сессии).\\DosDevices и \\?? обычно являются одним и тем же местоположением, причем одно из них является символической ссылкой на другую, в зависимости от конкретной версии ОС.

Существует несколько возможных причин, по которым это не удается.Одним из них является пространство имен, и вы ошибаетесь.Внутренне путь \\.\ (я здесь исключил синтаксическое экранирование обратной косой черты) преобразуется в \??\, что делается на границе между Win32 и собственным API.Последний путь (\??\...) - это то, что понимают нативный API и сама ОС.Любая другая причина потребует, чтобы вы опубликовали фактический код, который вы пытаетесь запустить (в частности, вызов CreateFile).Таким образом, потребуется больше информации.Одним из вопросов будет то, случайно ли вы передали широкую строку в функцию ANSI и, таким образом, в итоге будете искать путь, который не существует.И есть множество других возможностей, все из которых было бы легко исключить, когда вы публикуете свой код.

\\DosDevices\... также является собственным путем к объекту.Не используйте его из Win32 API.См. DefineDosDevice / QueryDosDevice для ознакомления с механизмами внизу.

Для экспериментов я рекомендую WinObj от Sysinternals и для прочтения серии книг Windows Internals или любой книги.на Windows драйверы должны иметь разбивку по темам.

0 голосов
/ 18 апреля 2011

В C / C ++, когда символ \ встречается в строковом литерале, он вводит escape-последовательность.

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

\\, таким образом, необходимо представлять один символ \в фактической строке.

Итак, строковый литерал VB "\\.\\hook", будет преобразован в строковый литерал C: L"\\\\.\\\\hook".

...