新しい GUID の定義とエクスポート

ドライバーから他のシステム コンポーネント、ドライバー、またはアプリケーションにエクスポートされる項目に対しては、新しい GUID を定義します。 たとえば、デバイスの 1 つにあるカスタム PnP イベントに対して新しい GUID を定義します。 新しい GUID を定義してエクスポートするには、次の操作を行う必要があります。

  1. GUID のシンボル名を選択します。

    GUID の目的を表す名前を選択します。 たとえば、オペレーティング システムでは、GUID_BUS_TYPE_PCI や PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID. などの名前が使用されます。

  2. Uuidgen.exe または Guidgen.exe を使用して GUID の値を生成します。 Microsoft Windows SDK をインストールすると、Uuidgen.exe が自動的にインストールされます。

    これらのユーティリティは、128 ビット値を表す一意の書式設定された文字列を生成します。 Uuidgen.exe の "-s" スイッチは、C 構造体の形式で GUID を出力します。

  3. 適切なヘッダー ファイルで GUID を定義します。

    DEFINE_GUID マクロ (Guiddef.h で定義) を使用して、GUID シンボリック名をその値に関連付けます (例 1 を参照)。

    例 1: GUID のみのヘッダー ファイルでの GUID の定義

    :
    
    DEFINE_GUID( GUID_BUS_TYPE_PCMCIA, 0x09343630L, 0xaf9f, 0x11d0, 
        0x92,0x9f, 0x00, 0xc0, 0x4f, 0xc3, 0x40, 0xb1 );
    DEFINE_GUID( GUID_BUS_TYPE_PCI, 0xc8ebdfb0L, 0xb510, 0x11d0, 
        0x80,0xE9, 0x00, 0x00, 0xf8, 0x1e, 0x1b, 0x30 );
    
    :
    

    GUID 定義以外のステートメントを含むヘッダー ファイルで GUID が定義されている場合、ヘッダー ファイルを含むドライバーで GUID がインスタンス化されるように、追加の手順を実行する必要があります。 DEFINE_GUID ステートメントは、多重インクルードを防止する #ifdef ステートメントの外側で実行する必要があります。 そうしないければ、ヘッダー ファイルがプリコンパイルされたヘッダーに含まれている場合、そのヘッダー ファイルを使用するドライバーで GUID がインスタンス化されません。 混合ヘッダー ファイルのサンプル GUID 定義については、例 2 を参照してください。

    例 2: 混合ヘッダー ファイルでの GUID の定義

    #ifndef _NTDDSER_    // this ex. is from a serial driver .h file
    #define _NTDDSER_
    
    :
    // Put other header file definitions here.
    :
    
    #endif  // _NTDDSER_
    
    #ifdef DEFINE_GUID   // Do not break compiles of drivers that 
                         // include this header but that do not
                         // want the GUIDs.
    //
    // Put GUID definitions outside of the multiple inclusion 
    // protection.
    
    DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c,
        0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);
    
    DEFINE_GUID (GUID_SERENUM_BUS_ENUMERATOR, 0x4D36E978, 0xE325, 
        0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18);
    
    :
    #endif  // DEFINE_GUID
    

    DEFINE_GUID は GUID を EXTERN_C 変数として定義するため、多重インクルードを防止するステートメントの外側に GUID 定義を置いても、ドライバー内で GUID のインスタンスが複数発生することはありません。 型が一致する限り、EXTERN 変数の多重宣言が許可されます。

  4. 新しいデバイス セットアップ クラスまたはデバイス インターフェイス クラスの GUID を作成する場合は、次の規則が適用されます。

    • 1 つの GUID を、デバイス セットアップ クラスとデバイス インターフェイス クラスの両方の識別子として使用しないでください。

    • GUID に関連付けるシンボリック名を作成する場合は、次の規則を使用します。

      デバイス セットアップ クラスには、GUID_DEVCLASS_XXX の形式を使用します

      デバイス インターフェイス クラスには、GUID_DEVINTERFACE_XXX の形式を使用します