一些支持格式为“\Device\Xxx”的 NT 命名空间绝对路径的 API

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不是在一个“的API,支持\设备的NT命名空间绝对路径格式\ XXX”

但是,可以使用任何支持格式为“\Device\Xxx”的 NT 命名空间绝对路径的 API 打开该设备的句柄。

什么API?

小智 5

到目前为止提供的答案充其量只是误导。它们没有回答您的问题,也没有涵盖 NT 名称空间与其他名称空间之间的重要区别。

在访问 NT 命名空间时,如果要访问仅在内核的 NT 命名空间中找到的设备,则需要使用以 Nt 开头的 API 调用,例如 NtOpenFile。例如,\Devices 中的设备在 \GLOBAL?? 中没有符号链接。

如果您正在访问 Win32 设备命名空间,上面提到的其他调用工作正常,但这些调用需要驱动程序在该命名空间中创建符号链接。

如果要访问仅在 NT 命名空间中找到的设备,请使用NtOpenFile。这确实是一个非常古老的 API 调用,并且已经在用户空间头文件中进进出出。它再次可用并且运行良好。