为驱动程序导出到其他系统组件、驱动程序或应用程序的项目定义新的 GUID。 例如,您为某个设备上的自定义 PnP 事件定义了一个新的 GUID。 若要定义和导出新的 GUID,必须执行以下作:
选择 GUID 的符号名称。
选择表示 GUID 用途的名称。 例如,操作系统使用如GUID_BUS_TYPE_PCI和PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID等名称。
使用 Uuidgen.exe 或 Guidgen.exe为 GUID 生成值。 安装 Microsoft Windows SDK 时,会自动安装 Uuidgen.exe。
这些实用工具生成一个唯一格式的字符串,表示 128 位值。 “-s”开关 Uuidgen.exe 输出格式化为 C 结构的 GUID。
在适当的头文件中定义 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 变量的多个声明。
为新的 设备设置类 或 设备接口类创建 GUID 时,将应用以下规则:
不要使用单个 GUID 来标识设备设置类和设备接口类。
创建要与 GUID 关联的符号名称时,请使用以下约定:
对于设备设置类,请使用GUID_DEVCLASS_XXX 格式。
对于设备接口类,请使用 GUID_DEVINTERFACE_XXX 格式。