定义和导出新 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 位值的唯一格式化字符串。 打开的“-s”开关 Uuidgen.exe 输出格式化为 C 结构的 GUID。

  3. 在适当的头文件中定义 GUID。

    使用 guiddef.h) 中定义的DEFINE_GUID宏 (将 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 时,以下规则适用:

    • 不要使用单个 GUID 来标识设备设置类和设备接口类。

    • 创建要与 GUID 关联的符号名称时,请使用以下约定:

      对于设备安装类,请使用 GUID_DEVCLASS_XXX 格式。

      对于设备接口类,请使用 GUID_DEVINTERFACE_XXX 格式。