【问题标题】:prepend the "\\?\" string to the path - DriverPackageUninstall在路径前添加“\\?\”字符串 - DriverPackageUninstall
【发布时间】:2012-08-31 05:12:15
【问题描述】:

我使用DriverPackageUninstall 来卸载我的驱动程序。对于这个 API,我需要提供“Inf Path”作为输入。我需要将此路径作为 UNICODE 字符串。为此,我参考了 MSDN 中的以下声明。

对于 Unicode 字符串,最大长度为 32,767 个字符。如果你 使用 Unicode 版本,将“\?\”字符串添加到路径中。为了 有关文件路径字符串格式的一般信息,请参阅命名 MSDN 库中的文件。

但是当我在我的代码中尝试相同的方法时,它不起作用。有人可以给我一些关于如何在路径前添加“\?\”的例子吗?谢谢..

更新:

我尝试使用以下代码作为示例

#define UNICODE
#define _UNIOCDE
#define WINVER 0x501

    #include <stdio.h>
    #include <windows.h>
    #include <tchar.h>

    int main () {
        PTCHAR DriverPackageInfPath = TEXT("\\?\\c:\\Documents and Settings\\Desktop\\My.inf");

        FILE * Log;
         Log = _wfopen( TEXT(DriverPackageInfPath, TEXT("a"));

         if ( Log == NULL ) {
           MessageBox(NULL, TEXT ( "Unable to open INF file\n" ),
               TEXT ( "Installation Error" ), 0 | MB_ICONSTOP );
           exit ( 1 );
         } else {
                printf ("INF file opened successfully\n");
         }

         return 0;
    }

更新:

".\dist\Driver\My.inf" 如何在这种路径前添加“\\?\”? "\\?\.\dist\Driver\My.inf" 不起作用。

【问题讨论】:

  • 你的字符串是 Unicode 吗?

标签: c winapi unicode wdk


【解决方案1】:

字符串常量有错误:

TEXT("\\?\\c:\\Documents ...."

应该是

TEXT("\\\\?\\c:\\Documents  ...."

仔细阅读,小心逃离:http://msdn.microsoft.com/en-us/library/windows/hardware/ff552316%28v=vs.85%29.aspx

更新:

来自http://msdn.microsoft.com/en-us/library/aa365247.aspx

Win32 文件命名空间

本节和下一节总结了 Win32 命名空间前缀和约定,并说明了它们的使用方式。请注意,这些示例旨在与 Windows API 函数一起使用,并不一定都适用于 Windows shell 应用程序,例如 Windows 资源管理器。由于这个原因,可能的路径范围比 Windows shell 应用程序通常可用的路径范围更广,并且可以使用这些命名空间约定来开发利用这一点的 Windows 应用程序。

对于文件 I/O,路径字符串的“\?\”前缀告诉 Windows API 禁用所有字符串解析并将其后面的字符串直接发送到文件系统。例如,如果文件系统支持大路径和文件名,则您可以超过由 Windows API 强制执行的 MAX_PATH 限制。有关正常最大路径限制的更多信息,请参阅上一节最大路径长度限制。

因为它关闭了路径字符串的自动扩展,“\?\”前缀也允许使用“..”和“.”在路径名中,如果您尝试对文件执行操作,并且这些其他保留的相对路径说明符作为完全限定路径的一部分,这将很有用。

Win32 设备命名空间

“\.\”前缀将访问 Win32 设备命名空间,而不是 Win32 文件命名空间。如果 API 支持这种类型的访问,这就是直接访问物理磁盘和卷的方式,无需通过文件系统。您可以通过这种方式访问​​磁盘以外的许多设备(例如,使用 CreateFile 和 DefineDosDevice 函数)。

例如,如果要打开系统的串行通讯端口 1,可以在调用 CreateFile 函数时使用“COM1”。这是因为 COM1–COM9 是 NT 命名空间中保留名称的一部分,尽管使用“\.\”前缀也适用于这些设备名称。相比之下,如果您安装了一个 100 端口串行扩展板,并且想要打开 COM56,则无法使用“COM56”打开它,因为 COM56 没有预定义的 NT 命名空间。您需要使用“\.\COM56”打开它,因为“\.\”会直接进入设备命名空间,而不会尝试查找预定义的别名。

另一个使用 Win32 设备命名空间的示例是使用带有“\.\PhysicalDiskX”(其中 X 是有效整数值)或“\.\CdRomX”的 CreateFile 函数。这允许您绕过文件系统直接访问这些设备。这是因为这些设备名称是由系统在枚举这些设备时创建的,并且一些驱动程序还会在系统中创建其他别名。例如,实现名称“C:\”的设备驱动程序有自己的命名空间,也恰好是文件系统。

通过 CreateFile 函数的 API 通常使用“\.\”前缀,因为 CreateFile 是用于打开文件和设备的函数,具体取决于您使用的参数。

如果您使用的是 Windows API 函数,则应使用“\.\”前缀来仅访问设备而非文件。

大多数 API 不支持“\.\”;只有那些设计用于设备名称空间的人才能识别它。请务必检查每个 API 的参考主题。

所以你的相对路径可以是

\\?\.\dist\driver\My.inf

转义形式是

\\\\?\\.\\dist\\driver\\My.inf

【讨论】:

  • ".\\dist\\Driver\\My.inf" 如何在这种路径前添加“\\\\?\\”? "\\\\?\\.\\dist\\Driver\\My.inf" 不起作用。
  • 我将 \\?\.\dist\driver\My.inf 作为路径并得到以下错误。[警告] 未知转义序列:'\.' [默认启用] [警告] 未知转义序列:'\d' [默认启用] [警告] 未知转义序列:'\D' [默认启用]
  • @user1317084 一次又一次地使用转义形式 \\\\?\\.\\dist\\driver\\My.inf 每次在 C/C++ 中使用转义字符串
  • 很抱歉用愚蠢的问题打扰您。 \\\\?\\.\\dist\\driver\\My.inf,我之前用过这个,路径没有被识别。这是我的第一条评论。如果我给出完整路径,则路径会被识别。 "\\\\?\\c:\\dist\\driver\\My.inf"。
【解决方案2】:

如果路径长于MAX_PATH 个字符,您只需在路径前添加\\?\

【讨论】:

  • 那么我需要检查我的路径是否是MAX_PATH吗?
  • @user1317084 我不清楚您是否真的在使用长路径。
  • ".\\dist\\Driver\\My.inf" 如何在这种路径前添加“\\\\?\\”? "\\\\?\\.\\dist\\Driver\\My.inf" 不起作用。
  • 谢谢尼尔,你/任何人都可以提供一些参考链接吗?其他人可以证实尼尔所说的话吗?
  • 如果路径以反斜杠开头,则为绝对路径,前面可选驱动器号。所有带有两个反斜杠的 UNC 名称也是绝对路径。请参阅 MSDN(搜索 Fully Qualified vs. Relative Paths)。
猜你喜欢
  • 2022-12-10
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多