2010-08-23 20 views
2

在这个文件中, http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#paths支持格式的NT命名空间绝对路径某些API“设备 XXX”

为了使这些设备通过Windows应用程序对象访问,设备驱动程序创建符号链接(符号链接)在Win32名称空间“Global ??”中分配给它们各自的设备对象。例如,“Global ??”下的COM0和COM1子目录只是对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??\ 
    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

问题是

这意味着CreateFile“支持\设备\(XXX)的NT命名空间绝对路径格式的API”之一。

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

什么的API?

+0

请考虑更改您接受的答案。 @罗伯特的答案是正确的。您只能通过Win32 API通过'\\。\'前缀访问设备的受限子集;特别是不支持NT命名空间的API。 – MicroVirus 2015-09-12 14:49:47

回答

1

本杰明 -

  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

+0

谢谢paulsm&Larry。我误解了MSDN中的句子。 – Benjamin 2010-08-25 21:12:49

1

将*设备视为“文件”的概念在* 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 
+0

CreateFileW(L“\\ Device \\ Xxx”,...)有可能吗?我不这么认为。 它必须是一个在GLOBAL的象征性舔?命名空间。 – Benjamin 2010-08-23 22:53:50

+0

看看我引用的MSDN链接 - 我相信你会找到一个例子! 记住:“CreateFile()”实际上是“开放资源”的同义词。这并不一定意味着你从头开始创建资源。 – paulsm4 2010-08-24 05:26:39

+2

但您确实需要使用不同的语法:\\。\ device \ Xxx。 – 2010-08-24 05:42:35

2

到目前为止提供的答案在最好的误导。他们没有回答你的问题,也没有涵盖NT命名空间和其他命名空间之间的重要区别。

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

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

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

+0

这是问题的唯一正确答案。您可以使用普通的Win32 API和前缀'\\。\'来打开名称在'\ GLOBAL ??'中发布的任何设备,但这只是一组受限制的设备,因为驱动程序本身必须发布该设备按照这里所述的方式。 – MicroVirus 2015-09-12 14:46:36

+0

“\ GLOBAL中没有符号链接的设备中的设备” - 但\ GLOBAL ??有符号链接到globalroot,不是吗? – Anixx 2017-02-20 07:50:41