一些支持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
问题是
- @paulsm4 says that
CreateFile
should work - @larryostermm同意,甚至给出设备路径语法(例如
DeviceXxx
) - 除了它不起作用
这意味着CreateFile
不是“支持 Device Xxx的NT命名空间绝对路径格式的API”之一。
但是,可以使用支持格式为“ Device Xxx”格式的NT命名空间绝对路径的任何API向该设备打开句柄。
什么是API?
本杰明 -
- 简单的事实是,您可以在Windows中打开“特殊设备文件”,就像在* nix中一样。这是我在原始回复中试图说的。我支持我在第一篇文章中所说的一切。我相信我在那里提到的MSDN链接也很好地解释了这一点。
- * nix设备文件的语法是“/ dev / SOME_DEVICE”。多个设备(按照惯例,不是必需的)区分为“/ dev / SOME_DEVICE0”,“/ dev / SOME_DEVICE1”等。设备文件也可以使用* nix“符号链接”“别名”。
- 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的主要内容,如果未能解决你的问题,请参考以下文章