1

を使用DriverPackageUninstallして、ドライバーをアンインストールしました。このAPIでは、入力として「InfPath」を指定する必要があります。そして、このパスを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 Explorer などの Windows シェル アプリケーションで動作するとは限らないことに注意してください。このため、Windows シェル アプリケーションから通常利用できるパスよりも幅広いパスがあり、これを利用する Windows アプリケーションは、これらの名前空間規則を使用して開発できます。

ファイル I/O の場合、パス文字列の "\?\" プレフィックスは、すべての文字列解析を無効にし、それに続く文字列をファイル システムに直接送信するよう Windows API に指示します。たとえば、ファイル システムが大きなパスとファイル名をサポートしている場合、Windows API によって適用される MAX_PATH 制限を超えることができます。通常の最大パス制限の詳細については、前のセクション「最大パス長の制限」を参照してください。

パス文字列の自動展開がオフになるため、"\?\" プレフィックスは ".." および "." の使用も許可します。これは、完全修飾パスの一部として予約済みの相対パス指定子を使用して、ファイルに対して操作を実行しようとする場合に役立ちます

Win32 デバイスの名前空間

"\.\" プレフィックスは、Win32 ファイルの名前空間ではなく、Win32 デバイスの名前空間にアクセスします。これは、API がこのタイプのアクセスをサポートしている場合、ファイル システムを経由せずに、物理ディスクおよびボリュームへのアクセスが直接行われる方法です。この方法で、ディスク以外の多くのデバイスにアクセスできます (たとえば、CreateFile 関数と DefineDosDevice 関数を使用します)。

たとえば、システムのシリアル通信ポート 1 を開く場合は、CreateFile 関数の呼び出しで "COM1" を使用できます。これは、COM1 ~ COM9 が NT 名前空間の予約名の一部であるため機能しますが、"\.\" プレフィックスを使用すると、これらのデバイス名でも機能します。比較すると、100 ポートのシリアル拡張ボードがインストールされていて、COM56 を開きたい場合、COM56 用の事前定義された NT 名前空間がないため、「COM56」を使用して開くことはできません。「\.\」は事前定義されたエイリアスを見つけようとせずにデバイスの名前空間に直接移動するため、「\.\COM56」を使用して開く必要があります。

Win32 デバイスの名前空間を使用するもう 1 つの例は、"\.\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 に答える