将“\\?\”字符串添加到路径 - DriverPackageUninstall

时间:2012-09-06 11:31:45

标签: c winapi unicode wdk

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

  

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

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

更新:

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

#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”无效。

2 个答案:

答案 0 :(得分: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外壳应用程序(如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设备命名空间的另一个示例是将CreateFile函数与“\。\ PhysicalDiskX”(其中X是有效整数值)或“\。\ CdRomX”一起使用。这允许您绕过文件系统直接访问这些设备。这是因为这些设备名称是由系统在枚举这些设备时创建的,并且某些驱动程序还将在系统中创建其他别名。例如,实现名称“C:\”的设备驱动程序有自己的命名空间,也恰好是文件系统。

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

如果您正在使用Windows API函数,则应使用“\。\”前缀仅访问设备而不是文件。

大多数API不支持“\。\”;只有那些旨在使用设备命名空间的设备才能识别它。请务必查看每个API的参考主题。

所以你的相对路径可以是

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

转义表单是

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

答案 1 :(得分:2)

如果路径超过\\?\个字符,则只需将MAX_PATH添加到路径中。