Definindo e exportando novos GUIDs

Você define um novo GUID para um item que o driver exporta para outros componentes, drivers ou aplicativos do sistema. Por exemplo, você define um novo GUID para um evento PnP personalizado em um de seus dispositivos. Para definir e exportar um novo GUID, você deve fazer o seguinte:

  1. Escolha um nome simbólico para o GUID.

    Escolha um nome que represente a finalidade do GUID. Por exemplo, o sistema operacional usa nomes como GUID_BUS_TYPE_PCI e PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID.

  2. Gere um valor para o GUID usando Uuidgen.exe ou Guidgen.exe. Quando você instala o SDK do Microsoft Windows, Uuidgen.exe é instalado automaticamente.

    Esses utilitários geram uma cadeia de caracteres exclusiva e formatada que representa um valor de 128 bits. A opção "-s" ativada Uuidgen.exe gera o GUID formatado como uma estrutura C.

  3. Defina o GUID em um arquivo de cabeçalho apropriado.

    Use a macro DEFINE_GUID (definida em Guiddef.h) para associar o nome simbólico guid ao seu valor (consulte o Exemplo 1).

    Exemplo 1: definindo GUIDs em um arquivo de cabeçalho 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 );
    
    :
    

    Se o GUID for definido em um arquivo de cabeçalho que contenha instruções diferentes de definições de GUID, você deverá executar uma etapa extra para garantir que o GUID seja instanciado em drivers que incluam o arquivo de cabeçalho. A instrução DEFINE_GUID deve ocorrer fora de qualquer instrução #ifdef que impeça a inclusão múltipla. Caso contrário, se o arquivo de cabeçalho estiver incluído em um cabeçalho pré-compilado, o GUID não será instanciado em drivers que usam o arquivo de cabeçalho. Consulte o Exemplo 2 para obter uma definição de GUID de exemplo em um arquivo de cabeçalho misto.

    Exemplo 2: definindo GUIDs em um arquivo de cabeçalho misto

    #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
    

    Colocar uma definição de GUID fora de instruções que impedem várias inclusões não causa várias instâncias do GUID em um driver porque DEFINE_GUID define o GUID como uma variável EXTERN_C. Várias declarações de uma variável EXTERN são permitidas desde que os tipos correspondam.

  4. Ao criar um GUID para uma nova classe de configuração de dispositivo ou classe de interface de dispositivo, as seguintes regras se aplicam:

    • Não use um único GUID para identificar uma classe de configuração de dispositivo e uma classe de interface do dispositivo.

    • Ao criar um nome simbólico para associar ao GUID, use a seguinte convenção:

      Para classes de configuração de dispositivo, use o formato GUID_DEVCLASS_XXX.

      Para classes de interface do dispositivo, use o formato GUID_DEVINTERFACE_XXX.