【问题标题】:Opening a handle to a driver from user mode从用户模式打开驱动程序的句柄
【发布时间】:2011-04-18 09:52:46
【问题描述】:

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

L"\\DosDevices\\hook"

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

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

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

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

【问题讨论】:

    标签: winapi visual-c++ vb6 wdk


    【解决方案1】:

    首先是克里斯指出的

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

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

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

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

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

    【讨论】:

    • 实际上,问题是我将一个简单的字符串传递给一个 Unicode 函数。最终在 Visual C++ 中工作的字符串是 "L"\\\\.\\hook" 主要是因为设备的名称必须是 LPCTSTR 类型,并且在标题中我发现它如下所示:- #ifdef UNICODE typedef LPCWSTR LPCTSTR;#else typedef LPCSTR LPCTSTR;#endif
    • @user250687:啊酷。我确实在可能性列表中有那个(“一个问题是你是否不小心将一个宽字符串传递给一个 ANSI 函数,从而最终寻找一个不存在的路径”)。这是一个经典。很高兴它对你有用。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 2019-04-04
      • 2020-09-24
      • 2013-12-16
      相关资源
      最近更新 更多