在本文档中,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??
命名空间中设置一个设备:
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) ==> \Device\VCP0
Device\
VCP0 (Device)
因此,我们尝试打开这个真正的设备:
HANDLE hdev = CreateFile("\\.\Device\VCP0", GENERIC_READ, 0, null, OPEN_EXISTING, 0, 0);
if (hdev == INVALID_HANDLE_VALUE)
raise new EWin32Exception(GetLastError);
但是错误代码3(系统找不到指定的文件)失败了。
短:
COM227
(\Device\VCP0
的别名)\Device\VCP0
问题是
\Device\Xxx
)这意味着CreateFile
是而不是,它是“支持\Device\Xxx的NT命名空间绝对路径格式的API”之一。
但是,可以使用任何支持"\ device \Xxx“格式的NT命名空间绝对路径的API打开该设备的句柄。
什么是?
发布于 2010-08-25 19:53:03
本杰明-
就这么简单。
而且确实有用。
如果你还有什么问题,请告诉我。
谢谢你提前..。PSM
发布于 2014-04-30 21:47:40
到目前为止,所提供的答案充其量只能是误导。它们没有回答您的问题,也没有涉及NT命名空间与其他名称空间之间的重要区别。
当访问Nt命名空间时,如果希望访问仅在内核的NT命名空间中找到的设备,则需要使用以NT开头的API调用(如NtOpenFile )。例如,在\GLOBAL??中没有符号链接的设备in \设备。
如果您正在访问Win32设备命名空间,那么上面提到的其他调用可以正常工作,但这些调用要求驱动程序在该命名空间中创建一个符号链接。
如果要访问仅在NT命名空间中找到的设备,请使用NtOpenFile。这确实是一个非常老的API调用,并且在用户空间头文件中来回漂移。它再次可用,工作正常。
发布于 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
CreateFile
WriteFile
ReadFile
CloseHandle
https://stackoverflow.com/questions/3546261
复制相似问题