首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >支持"\Device\Xxx“格式的NT命名空间绝对路径的一些API

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

Stack Overflow用户
提问于 2010-08-23 09:29:06
回答 3查看 2.6K关注 0票数 3

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

为了使这些设备对象可以被Windows应用程序访问,设备驱动程序在Win32命名空间“全局??”中创建一个符号链接(符号链接),指向它们各自的设备对象。例如,COM0和COM1在“全球?”子目录只是指向Serial0和Serial1的符号链接,"C:“是指向HarddiskVolume1的符号链接,"Physicaldrive0”是指向DR0的符号链接,等等。如果没有符号链接,任何使用Win32命名空间约定的指定设备"Xxx“都不会像前面所描述的那样可用。但是,可以使用任何支持“\\Xxx”格式的NT命名空间绝对路径的API打开该设备的句柄。

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

例如,我们可以在GLOBAL??命名空间中设置一个设备:

代码语言:javascript
运行
复制
GLOBAL??\
   COM227

这个设备我们可以使用CreateFile成功地打开

代码语言:javascript
运行
复制
//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??命名空间中的所有其他设备)实际上是指向“真实”设备的符号链接:

代码语言:javascript
运行
复制
GLOBAL??\
   COM227 (SymbolicLink) ==> \Device\VCP0
Device\
   VCP0  (Device)

因此,我们尝试打开这个真正的设备:

代码语言:javascript
运行
复制
HANDLE hdev = CreateFile("\\.\Device\VCP0", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
   raise new EWin32Exception(GetLastError);

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

短:

  • Works:COM227 (\Device\VCP0的别名)
  • 失败:\Device\VCP0

问题是

  • 工作
  • @larryostermm同意,甚至给出了设备路径语法(例如\Device\Xxx)
  • 除了不能工作

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

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

什么是

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-25 19:53:03

本杰明-

  1. 简单的事实是,您可以在Windows中打开一个“特殊设备文件”,就像在*nix中一样。这就是我在原来的答覆中所想说的。我坚持我在第一篇文章中所说的一切。我相信,我提到的MSDN链接也很好地解释了这一点。
  2. *nix设备文件的语法是“/dev/”。多个设备(按照惯例,而不是必要性)被区分为“/dev/symbolic 0”、“/dev/symbolic 1”等。设备文件也可以使用*nix“符号链接”来“别名”。
  3. Windows设备文件的语法是UNC名称。我确信您熟悉UNC的共享(例如,"\myserver\c$")。在我们前面讨论的所有示例中,服务器恰好是本地主机。因此"\.\SOME_RESOURCE_NAME“。

就这么简单。

而且确实有用。

如果你还有什么问题,请告诉我。

谢谢你提前..。PSM

票数 1
EN

Stack Overflow用户

发布于 2014-04-30 21:47:40

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

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

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

如果要访问仅在NT命名空间中找到的设备,请使用NtOpenFile。这确实是一个非常老的API调用,并且在用户空间头文件中来回漂移。它再次可用,工作正常。

票数 6
EN

Stack Overflow用户

发布于 2010-08-23 15:28:56

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

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

有几个例子:

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

代码语言:javascript
运行
复制
  CreateFile
  WriteFile
  ReadFile
  CloseHandle
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3546261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档