Определение и экспорт новых идентификаторов GUID
Вы определяете новый GUID для элемента, который драйвер экспортирует в другие системные компоненты, драйверы или приложения. Например, вы определяете новый GUID для пользовательского события PnP на одном из его устройств. Чтобы определить и экспортировать новый GUID, необходимо выполнить следующие действия.
Выберите символьное имя для GUID.
Выберите имя, представляющее назначение GUID. Например, операционная система использует такие имена, как GUID_BUS_TYPE_PCI и PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID.
Создайте значение для GUID с помощью Uuidgen.exe или Guidgen.exe. При установке Microsoft Windows SDK Uuidgen.exe устанавливается автоматически.
Эти служебные программы создают уникальную отформатированную строку, представляющую 128-разрядное значение. Переключатель "-s" для Uuidgen.exe выводит GUID в формате структуры C.
Определите GUID в соответствующем файле заголовка.
Используйте макрос DEFINE_GUID (определенный в Guiddef.h), чтобы связать символьное имя GUID со значением (см. пример 1).
Пример 1. Определение идентификаторов GUID в файле заголовка GUID-Only
: 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.