使用CreateFile打开设备名称

opc*_*0de 8 windows winapi driver

我正在研究一个简单的设备驱动程序,我希望使用IRP从用户模式与驱动程序通信.

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

但是当我尝试打开它时:

hand := CreateFile('\Device\MyDevice', GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  
Run Code Online (Sandbox Code Playgroud)

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

我做错了什么?我知道驱动程序有效,因为我可以看到它在DebugView中运行和打印.那么任何提示?

在此输入图像描述

Ser*_*bry 10

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

表单\Device\xxx的名称是Win32无法访问的内部NT对象管理器名称.只有在\Device\MyDevice\??\目录创建符号链接时,您才能访问设备.\??\内核目录中的对象\\.\在Win32中显示.在DDK中使用Winobj(或从www.sysinternals.com下载)进行检查.

  • *只有在从 \??\ 目录创建到 \Device\MyDevice 的符号链接时,您才能访问您的设备* - 这是错误的。不需要任何符号链接。并且任何 NT 路径对于 win32 都是**可访问的**,因为在 *\GLOBAL??* 中退出 `GLOBALROOT` 符号链接到命名空间的根目录。所以我们可以从 win32 `CreateFileW` 访问任何路径,如果附加路径为 `"\\\\?\\Global\\GLOBALROOT"` 或 `"\\\\?\\GLOBALROOT"` (两者都有效)所以如果我们想要访问“\\Device\\xxx” - 我们可以通过“\\\\?\\GLOBALROOT\\Device\\xxx”名称来做到这一点 (3认同)