Поделиться через


Определение и экспорт новых идентификаторов GUID

Вы определяете новый GUID для элемента, который драйвер экспортирует в другие системные компоненты, драйверы или приложения. Например, вы определяете новый GUID для пользовательского события PnP на одном из его устройств. Чтобы определить и экспортировать новый GUID, необходимо выполнить следующие действия.

  1. Выберите символьное имя для GUID.

    Выберите имя, представляющее назначение GUID. Например, операционная система использует такие имена, как GUID_BUS_TYPE_PCI и PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID.

  2. Создайте значение для GUID с помощью Uuidgen.exe или Guidgen.exe. При установке Microsoft Windows SDK Uuidgen.exe устанавливается автоматически.

    Эти служебные программы создают уникальную отформатированную строку, представляющую 128-разрядное значение. Переключатель "-s" для Uuidgen.exe выводит GUID в формате структуры C.

  3. Определите 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, если типы совпадают.

  4. При создании GUID для нового класса настройки устройства или класса интерфейса устройства применяются следующие правила:

    • Не используйте один GUID для идентификации класса настройки устройства и класса интерфейса устройства.

    • При создании символьного имени для связи с GUID используйте следующее соглашение:

      Для классов настройки устройств используйте формат GUID_DEVCLASS_XXX.

      Для классов интерфейса устройства используйте формат GUID_DEVINTERFACE_XXX.