0

我有一个驱动程序,并为它创建了一个符号名称。象征性的名字是...

L"\\DosDevices\\hook"

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

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

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

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

4

2 回答 2

2

首先是克里斯指出的

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

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

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

\\DosDevices\...也是对象的本机路径。不要从 Win32 API 使用它。请参阅DefineDosDevice/QueryDosDevice了解下面的机制。

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

于 2011-04-18T17:33:22.867 回答
0

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

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

\\因此有必要在实际字符串中表示单个\字符。

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

于 2011-04-18T12:03:21.623 回答