Ben*_*min 3 windows filesystems winapi device device-driver
在本文档中, http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#paths
为了使 Windows 应用程序可以访问这些设备对象,设备驱动程序在 Win32 命名空间“Global??”中创建了一个符号链接(symlink),指向它们各自的设备对象。例如“Global??”下的COM0 和COM1 子目录只是指向 Serial0 和 Serial1 的符号链接,“C:”是指向 HarddiskVolume1 的符号链接,“Physicaldrive0”是指向 DR0 的符号链接,依此类推。如果没有符号链接,使用 Win32 命名空间约定的任何 Windows 应用程序将无法使用指定的设备“Xxx”,如前所述。但是,可以使用任何支持格式为“\Device\Xxx”的 NT 命名空间绝对路径的 API 打开该设备的句柄。
什么是 API?请让我知道一些这样的功能。
例如,我们可以在GLOBAL??命名空间中放置一个设备:
GLOBAL??\
COM227
Run Code Online (Sandbox Code Playgroud)
我们可以使用CreateFile以下方法成功打开此设备:
//Note: we have to prefix it with \\.\ in order to tell CreateFile that
//we want to open something from the Global device namespace.
//Otherwise it will try to open a file
HANDLE hdev = CreateFile("\\.\COM227", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
raise new EWin32Exception(GetLastError);
Run Code Online (Sandbox Code Playgroud)
这个设备(连同 Win32 Global??命名空间中的所有其他设备),实际上是到“真实”设备的符号链接:
GLOBAL??\
COM227 (SymbolicLink) ==> \Device\VCP0
Device\
VCP0 (Device)
Run Code Online (Sandbox Code Playgroud)
所以我们尝试打开这个真机:
HANDLE hdev = CreateFile("\\.\Device\VCP0", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
raise new EWin32Exception(GetLastError);
Run Code Online (Sandbox Code Playgroud)
但它失败并显示错误代码 3(系统找不到指定的文件)。
短的:
COM227这是 的别名\Device\VCP0)\Device\VCP0问题是
CreateFile 应该可以\Device\Xxx)这意味着,CreateFile是不是在一个“的API,支持\设备的NT命名空间绝对路径格式\ XXX”。
但是,可以使用任何支持格式为“\Device\Xxx”的 NT 命名空间绝对路径的 API 打开该设备的句柄。
什么是API?
小智 5
到目前为止提供的答案充其量只是误导。它们没有回答您的问题,也没有涵盖 NT 名称空间与其他名称空间之间的重要区别。
在访问 NT 命名空间时,如果要访问仅在内核的 NT 命名空间中找到的设备,则需要使用以 Nt 开头的 API 调用,例如 NtOpenFile。例如,\Devices 中的设备在 \GLOBAL?? 中没有符号链接。
如果您正在访问 Win32 设备命名空间,上面提到的其他调用工作正常,但这些调用需要驱动程序在该命名空间中创建符号链接。
如果要访问仅在 NT 命名空间中找到的设备,请使用NtOpenFile。这确实是一个非常古老的 API 调用,并且已经在用户空间头文件中进进出出。它再次可用并且运行良好。
| 归档时间: |
|
| 查看次数: |
2341 次 |
| 最近记录: |