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

ドライバーが他のシステム コンポーネント、ドライバー、またはアプリケーションにエクスポートする項目の新しい GUID を定義します。 たとえば、いずれかのデバイスでカスタム 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-Only ヘッダー ファイルでの 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
    

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

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

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

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

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

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