从用户模式打开驱动程序的句柄

时间:2011-04-18 09:52:47

标签: winapi visual-c++ vb6 wdk

我有一个驱动程序,我为它创建了一个符号名称。符号名称是......

L"\\DosDevices\\hook"

当我尝试使用CreateFile()中的usermode访问设备对象时,我总是收到错误"The system cannot find the file specified".

我尝试使用以下路径CreateFile() ...

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

但它仍然无效。 但是,如果我在Visual Basic 6中尝试相同的API调用,“\\。\\ hook”正常工作,但文档说它应该是“\\\\。\\ hook”。 这里有什么问题 ?所有这些“\”的目的是什么?如何使它与Visual C ++一起使用?

2 个答案:

答案 0 :(得分:2)

首先是克里斯指出的

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

因此,您提供的第三个变体应该有效。 "\\Device\\hook"绝对不能与Win32 API一起使用。这些仅限于\\DosDevices\\??及其变体(每会话命名空间)之下的内容。 \\DosDevices\\??通常是相同的位置,其中一个是另一个的符号链接,具体取决于操作系统的确切版本。

失败有几个可能的原因。一个是名称空间,你错了。在内部路径\\.\(我在这里省略了反斜杠的句法转义)转换为\??\,这是在Win32和本机API之间的边界处完成的。后一个路径(\??\...)是本机API和操作系统本身所理解的。任何其他原因都要求您发布您尝试运行的实际代码(特别是CreateFile调用)。因此,需要更多信息。一个问题是你是否意外地将宽字符串传递给ANSI函数,从而最终寻找不存在的路径。当您发布代码时,还有很多其他可能性很容易排除。

\\DosDevices\...也是该对象的本机路径。不要在Win32 API中使用它。有关下方机制的一瞥,请参见DefineDosDevice / QueryDosDevice

对于实验,我建议来自Sysinternals的WinObj并阅读“Windows Internals”系列书籍或任何关于Windows驱动程序的书籍都应该有主题细分。

答案 1 :(得分:0)

在C / C ++中,当在字符串文字中遇到\字符时,它会引入转义序列。

`\r`   - embed a CR
`\n`   - embeds a LF
`\040` - embeds an character using an octal code
因此,需要

\\来表示实际字符串中的单个\字符。

因此,VB字符串文字"\\.\\hook"将转换为C字符串文字:L"\\\\.\\\\hook"