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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些支持NT名称空间绝对路径格式为“ Device Xxx”的API相关的知识,希望对你有一定的参考价值。

在这份文件中,http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#paths

为了使Windows应用程序可以访问这些设备对象,设备驱动程序在Win32命名空间中创建一个符号链接(符号链接),“Global ??”,它们各自的设备对象。例如,COM0和COM1下的“Global ??”子目录只是Serial0和Serial1的符号链接,“C:”是HarddiskVolume1的符号链接,“Physicaldrive0”是DR0的符号链接,依此类推。如果没有符号链接,指定的设备“Xxx”将无法使用Win32命名空间约定的任何Windows应用程序,如前所述。但是,可以使用支持格式为“ Device Xxx”格式的NT命名空间绝对路径的任何API向该设备打开句柄。

什么是API?请告诉我一些这样的功能。


例如,我们可以让一个设备位于GLOBAL??名称空间中:

GLOBAL??
   COM227

我们可以使用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);

此设备(以及Win32 Global ??命名空间中的所有其他设备)实际上是指向“真实”设备的符号链接:

GLOBAL??
   COM227 (SymbolicLink) ==> DeviceVCP0
Device
   VCP0  (Device)

所以我们尝试打开这个真实的设备:

HANDLE hdev = CreateFile("\.DeviceVCP0", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
   raise new EWin32Exception(GetLastError);

但它失败了,错误代码为3(系统找不到指定的文件)。

短:

  • 作品:COM227(这是DeviceVCP0的别名)
  • 失败:DeviceVCP0

问题是

这意味着CreateFile不是“支持 Device Xxx的NT命名空间绝对路径格式的API”之一。

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

什么是API?

答案

本杰明 -

  1. 简单的事实是,您可以在Windows中打开“特殊设备文件”,就像在* nix中一样。这是我在原始回复中试图说的。我支持我在第一篇文章中所说的一切。我相信我在那里提到的MSDN链接也很好地解释了这一点。
  2. * nix设备文件的语法是“/ dev / SOME_DEVICE”。多个设备(按照惯例,不是必需的)区分为“/ dev / SOME_DEVICE0”,“/ dev / SOME_DEVICE1”等。设备文件也可以使用* nix“符号链接”“别名”。
  3. Windows设备文件的语法是UNC名称。我确定你熟悉UNC的股票(例如,“\ myserver c $”)。在我们上面讨论的所有示例中,服务器恰好是本地主机。因此“\。 SOME_RESOURCE_NAME”。

它真的很简单。

它有效。

如果您有任何其他问题,请与我们联系。

提前谢谢.. PSM

另一答案

到目前为止提供的答案充其量是误导性的。他们不回答您的问题或涵盖NT命名空间和其他命名空间之间的重要区别。

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

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

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

另一答案

将“设备”视为“文件”的概念在* nix(Unix,Linux,Mac OS等)中很常见。

基本上,MSDN文章意味着任何打开“文件”(本地磁盘文件或UNC资源)的Win32 API都可以轻松打开“特殊设备”。

几个例子:

http://msdn.microsoft.com/en-us/library/aa363858%28VS.85%29.aspx

  CreateFile
  WriteFile
  ReadFile
  CloseHandle

以上是关于一些支持NT名称空间绝对路径格式为“ Device Xxx”的API的主要内容,如果未能解决你的问题,请参考以下文章

Python os模块--路径文件系统命令等操作

c# 文件操作

Python - 模块

如何在 .NET 中获得绝对或规范化的文件路径?

node rename绝对路径

cad完整路径改成相对路径改不了怎么办