定义和导出新的 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。

    使用 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 时,将应用以下规则:

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

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

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

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