【问题标题】:Open device name using CreateFile使用 CreateFile 打开设备名称
【发布时间】:2014-02-11 13:44:55
【问题描述】:

我正在开发一个简单的设备驱动程序,我想使用 IRP 从用户模式与驱动程序通信。

我无法打开设备驱动程序。使用 DeviceTree 我可以看到设备名称,例如 \Device\MyDevice。

但是当我尝试这样打开它时:

hand := CreateFile('\Device\MyDevice', GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  

我总是得到INVALID_HANDLE_VALUE 而GetLastError 是(系统找不到指定的路径)

我做错了什么?我知道驱动程序可以工作,因为我可以看到它在 DebugView 中运行和打印内容。那么有什么建议吗?

【问题讨论】:

  • 我猜设备的路径是错误的。你是怎么检查的?
  • 不应该有双反斜杠 (\\Device\MyDevice) 吗?
  • @TLama 我没有找到网络路径
  • @DavidHeffernan 是的,我使用 DeviceTree 进行了检查,请参阅上面的链接,我现在将截屏
  • 所以你可能和discussed here处于同一位置。

标签: windows winapi driver


【解决方案1】:

这是Tim Robinson, MVP (Windows SDK)的一个很好的解释:

\Device\xxx 形式的名称是内部 NT 对象管理器名称,它们是 Win32 无法访问。您将只能访问您的设备,如果它 从\??\ 目录创建到\Device\MyDevice 的符号链接。对象 在\??\ 内核目录中通过\\.\ 在 Win32 中显示。在中使用 Winobj DDK(或从 www.sysinternals.com 下载)进行检查。

注意:现在 NT 命名空间根通过 GLOBALROOT 符号链接公开,因此 Win32 可以访问任何 NT 路径,包括 \Device\xxx:使用 \\.\GLOBALROOT\Device\xxx。在这种情况下不需要设备符号链接。

【讨论】:

  • 只有从 \??\ 目录创建到 \Device\MyDevice 的符号链接,您才能访问您的设备 - 这是错误的。不需要任何符号链接。并且任何 NT 路径对于 win32 都是可访问,因为将 \GLOBAL?? 中的GLOBALROOT 符号链接退出到命名空间的根目录。所以我们可以访问来自 win32 CreateFileW 的任何路径,如果使用 "\\\\?\\Global\\GLOBALROOT""\\\\?\\GLOBALROOT" 附加路径(两者都有效)所以如果我们想访问“\\Device\\xxx” - 我们可以通过“\\\ \?\\GLOBALROOT\\Device\\xxx" 名称
  • @RbMm 不错且非常重要的补充!谢谢!
猜你喜欢
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多