1

我用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" 不起作用。

4

2 回答 2

5

您在字符串常量中有错误:

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
于 2012-09-06T11:44:40.823 回答
2

\\?\如果它比MAX_PATH字符长,您只需要在路径前添加。

于 2012-09-06T11:37:00.233 回答