代码之家  ›  专栏  ›  技术社区  ›  Benjamin

一些API支持格式为“device\xxx”的NT命名空间绝对路径

  •  2
  • Benjamin  · 技术社区  · 14 年前

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

    为了使这些设备对象可由Windows应用程序访问,设备驱动程序在win32命名空间中创建一个符号链接(symlink),即“全局”??“,发送到各自的设备对象。例如,在“global”下的com0和com1?“子目录只是到serial0和serial1的符号链接,”c:“是到硬盘卷1的符号链接,”physicaldrive0“是到dr0的符号链接,依此类推。如果没有符号链接,使用win32名称空间约定的任何Windows应用程序都将无法使用指定的设备“xxx”,如前所述。 但是,可以使用任何支持NT命名空间绝对路径格式的API向该设备打开句柄“\device\xxx”。

    什么是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(系统找不到指定的文件)。

    Short:

    • 作品 : COM227 (它是 \Device\VCP0 )
    • 失败 : \VCP0

    问题是

    也就是说 创建文件 其中之一 “支持\device\xxx的NT命名空间绝对路径格式的API” .

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

    什么 API?

    3 回复  |  直到 7 年前
        1
  •  1
  •   paulsm4    14 年前

    本杰明-

    1. 简单的事实是,您可以在Windows中打开“特殊设备文件”,就像在*nix中一样。这就是我在原始回复中试图说的。我支持我在第一篇文章中所说的一切。我相信我提到的msdn链接也很好地解释了这一点。

    2. *nix设备文件的语法是“/dev/some_device”。多个设备(按惯例,不是必须的)可区分为“/dev/some_device0”、“/dev/some_device1”等。设备文件也可以使用*nix“符号链接”进行“别名”。

    3. Windows设备文件的语法是UNC名称。 我确信您熟悉UNC共享(例如,“\\myserver\c$”。 在上面讨论的所有示例中,服务器恰好是本地主机。因此,“一些资源名称”。

    就这么简单。

    它确实有效。

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

    提前谢谢。PSM

        2
  •  2
  •   MicroVirus    9 年前

    目前提供的答案充其量是误导性的。它们不会回答您的问题,也不会覆盖NT名称空间和其他名称空间之间的重要区别。

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

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

    如果要访问仅在NT命名空间中找到的设备,请使用 NtOpenFile . 这是一个非常古老的API调用,已经在用户空间头文件中来回移动。它又有了,而且工作得很好。

        3
  •  1
  •   paulsm4    14 年前

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