Definizione ed esportazione di nuovi GUID
Si definisce un nuovo GUID per un elemento che il driver esporta in altri componenti di sistema, driver o applicazioni. Ad esempio, si definisce un nuovo GUID per un evento PnP personalizzato in uno dei dispositivi. Per definire ed esportare un nuovo GUID, è necessario eseguire le operazioni seguenti:
Scegliere un nome simbolico per il GUID.
Scegliere un nome che rappresenta lo scopo del GUID. Ad esempio, il sistema operativo usa nomi come GUID_BUS_TYPE_PCI e PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID.
Generare un valore per il GUID usando Uuidgen.exe o Guidgen.exe. Quando si installa il Microsoft Windows SDK, Uuidgen.exe viene installato automaticamente.
Queste utilità generano una stringa univoca formattata che rappresenta un valore a 128 bit. L'opzione "-s" su Uuidgen.exe restituisce il GUID formattato come struttura C.
Definire il GUID in un file di intestazione appropriato.
Usare la macro DEFINE_GUID (definita in Guiddef.h) per associare il nome simbolico GUID al relativo valore (vedere l'esempio 1).
Esempio 1: Definizione di GUID in un file di intestazione 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 il GUID è definito in un file di intestazione che contiene istruzioni diverse dalle definizioni GUID, è necessario eseguire un passaggio aggiuntivo per assicurarsi che il GUID venga creato un'istanza nei driver che includono il file di intestazione. L'istruzione DEFINE_GUID deve essere eseguita all'esterno di qualsiasi istruzione #ifdef che impedisca l'inclusione multipla. In caso contrario, se il file di intestazione è incluso in un'intestazione precompilata, il GUID non verrà creata un'istanza nei driver che usano il file di intestazione. Vedere l'esempio 2 per una definizione GUID di esempio in un file di intestazione mista.
Esempio 2: Definizione di GUID in un file di intestazione mista
#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
L'inserimento di una definizione GUID all'esterno di istruzioni che impediscono l'inclusione multipla non causa più istanze del GUID in un driver perché DEFINE_GUID definisce il GUID come variabile EXTERN_C. Sono consentite più dichiarazioni di una variabile EXTERN purché i tipi corrispondano.
Quando si crea un GUID per una nuova classe di configurazione del dispositivo o una classe dell'interfaccia del dispositivo, si applicano le regole seguenti:
Non usare un singolo GUID per identificare sia una classe di installazione del dispositivo che una classe di interfaccia del dispositivo.
Quando si crea un nome simbolico da associare al GUID, usare la convenzione seguente:
Per le classi di installazione del dispositivo, usare il formato GUID_DEVCLASS_XXX.
Per le classi dell'interfaccia del dispositivo, usare il formato GUID_DEVINTERFACE_XXX.