定义和导出新 GUID
为驱动程序导出到其他系统组件、驱动程序或应用程序的项定义新的 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。
使用 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 变量进行多个声明。
为新的 设备安装类 或 设备接口类创建 GUID 时,以下规则适用:
不要使用单个 GUID 来标识设备设置类和设备接口类。
创建要与 GUID 关联的符号名称时,请使用以下约定:
对于设备安装类,请使用 GUID_DEVCLASS_XXX 格式。
对于设备接口类,请使用 GUID_DEVINTERFACE_XXX 格式。