我有一个驱动程序,我为它创建了一个符号名称。符号名称是......
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 ++一起使用?
答案 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"
。