Pubblicazione dello schema di eventi per un provider classico

I provider classici devono usare il formato MOF ( Managed Object Format ) per pubblicare il layout dei dati degli eventi. I consumer possono quindi leggere il layout pubblicato da WMI in fase di esecuzione e usarlo per leggere i dati dell'evento.

Se si usa MOF per pubblicare il layout dei dati degli eventi in WMI, in genere si creano i tre tipi di classi MOF seguenti nello spazio dei nomi root\wmi:

Classi MOF del provider

Se si pubblica il layout dei dati dell'evento, è necessario creare una classe MOF che identifichi il provider. Questa classe deve derivare dalla classe MOF EventTrace e deve essere vuota (nessuna proprietà o metodi). La classe deve includere anche il qualificatore Guid che identifica in modo univoco il provider. Si tratta dello stesso GUID usato quando si chiama la funzione RegisterTraceGuids per registrare il provider.

Classi MOF di eventi

Una classe MOF di evento definisce una classe di eventi fornita dal provider. Questa classe deriva dalla classe MOF del provider e deve essere vuota (nessuna proprietà o metodi). La classe deve includere anche il qualificatore Guid che identifica in modo univoco la classe di eventi definiti dalle classi figlio. Il provider usa questo stesso GUID quando si imposta il membro Guid della struttura EVENT_TRACE_HEADER .

Classi MOF del tipo di evento

Una classe MOF di tipo evento definisce i dati effettivi dell'evento. Questa classe deriva dalla classe MOF dell'evento padre. Quando si assegna alla classe MOF il tipo di evento, la convenzione consiste nell'usare il nome della classe MOF dell'evento all'inizio del nome della classe MOF del tipo di evento. Ad esempio, se il nome della classe MOF dell'evento è HWConfig e il tipo di evento MOF classe rappresenta le informazioni sulla CPU, è necessario assegnare al tipo di evento il nome MOF classe, HWConfig_CPU.

Usare il qualificatore EventType nella classe MOF del tipo di evento per identificare il tipo di evento. Se più tipi di evento usano gli stessi dati dell'evento, possono usare la stessa classe MOF. Il provider utilizza lo stesso valore del tipo di evento per identificare l'evento quando si imposta il membro Class.Type della struttura EVENT_TRACE_HEADER .

La classe MOF del tipo di evento contiene proprietà. L'ordine di queste proprietà definisce il layout dei dati dell'evento. La tabella seguente identifica i tipi di dati e i qualificatori che è possibile usare per definire le proprietà. Per altre informazioni sui qualificatori di proprietà e di classe che è possibile usare, vedere Qualificatori MOF di traccia eventi.

Tipo di dati Qualificatori Descrizione
sint8, uint8 Formato Dichiara un numero intero decimale a 1 byte. Per dichiarare un carattere ANSI, usare il qualificatore Format e impostarne il valore su "c".
sint16, uint16 Formato Dichiara un numero intero decimale a 2 byte. Per indicare che il numero è un numero esadecimale, usare il qualificatore Format . Ad esempio, format("x").
sint32, uint32 Formato Dichiara un numero intero decimale a 4 byte. Per indicare che il numero è un numero esadecimale, usare il qualificatore Format e impostarne il valore su "x".
sint64, uint64 Formato Dichiara un numero intero decimale a 8 byte. Per indicare che il numero è un numero esadecimale, usare il qualificatore Format e impostarne il valore su "x".
boolean Dichiara un valore booleano. Il consumer di eventi deve interpretare il valore come BOOL (intero a 4 byte).
char16 Dichiara un carattere wide. Il consumer di eventi deve interpretare le matrici char16 negli eventi del kernel come stringhe di caratteri wide. Usare le dimensioni della matrice per copiare la stringa. Alcune stringhe possono contenere caratteri NULL iniziali.
object Estensione Dichiara un BLOB binario. Il qualificatore di estensione indica il tipo di dati nel BLOB.
string Format, StringTermination Dichiara un valore stringa. Per indicare che la stringa è una stringa di caratteri wide, usare il qualificatore Format e impostarne il valore su "w". La stringa viene considerata una stringa ANSI se non si specifica il qualificatore di formato . Per indicare la modalità di terminazione della stringa, usare il qualificatore StringTermination .

 

Per specificare una matrice, è possibile usare parentesi quadre, []. Le parentesi quadre possono includere le dimensioni della matrice. Ad esempio:

[WmiDataId(1), read] uint8 MyGuid[16];

È anche possibile usare il qualificatore Max per specificare le dimensioni di una matrice. Ad esempio:

[WmiDataId(1), Max(16), read] uint8 MyGuid[];

Se si includono le dimensioni della matrice tra parentesi quadre, il compilatore MOF genera automaticamente il qualificatore Max.

È importante usare il qualificatore Description per ogni proprietà. La descrizione deve contenere un nome visualizzato che il consumer può usare quando vengono visualizzati i valori della proprietà.

Nell'esempio seguente viene illustrato il contenuto di un file MOF che descrive un provider, un evento e una classe MOF di tipo evento.

#pragma namespace("\\\\.\\root\\wmi")

[dynamic: ToInstance, Description("Defines my event provider"),
 Guid("{7C214FB1-9CAC-4b8d-BAED-7BF48BF63BB3}")]
class MyProvider : EventTrace
{
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."): Amended,
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}")]
class MyCategory : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1)]
class MyCategory_MyEvent : MyCategory
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Class identifier"): Amended, read, Extension("Guid")] object ID;
};

Si noti che i nomi della classe MOF del provider, dell'evento e del tipo di evento devono essere univoci all'interno dell'intero spazio dei nomi. Per evitare conflitti di denominazione, è consigliabile usare un nome univoco e descrittivo per tutti i nomi di classe. Le proprietà della classe devono anche essere descrittive e univoche all'interno della gerarchia di classi, ovvero una classe figlio che contiene lo stesso nome di proprietà di una classe padre sovrascrive la proprietà della classe padre.

Dopo aver definito le classi MOF, usare il compilatore MOF per generare lo schema eventi e aggiungerlo al repository CIM. I consumer possono quindi leggere lo schema dal repository e leggere i dati dell'evento a livello di codice. Per una descrizione completa della sintassi MOF e dell'uso del compilatore MOF (Mofcomp.exe) per aggiungere le classi MOF al repository CIM, vedere Managed Object Format.For a complete description of the MOF syntax and using the MOF compiler (Mofcomp.exe) to add your MOF classes to the CIM repository, see Managed Object Format. Per informazioni sull'uso di Wbemtest.exe per accedere al repository CIM, vedere Strumentazione gestione Windows (WMI).

Classe MOF di controllo delle versioni

Se si aggiunge o si modifica un tipo di evento classe MOF, la convenzione prevede la versione sia della classe MOF dell'evento che delle classi MOF del tipo di evento figlio. Per eseguire la versione della classe MOF dell'evento corrente, aggiungere _Vn al nome della classe, dove n è un numero incrementale a partire da 0. Se si tratta della prima revisione della classe , aggiungere _V0 al nome della classe. È inoltre necessario aggiungere il qualificatore EventVersion alla classe . Usare lo stesso numero di versione usato nel nome della classe per il valore del qualificatore EventVersion .

La nuova versione della classe MOF dell'evento deve usare lo stesso nome e il qualificatore Guid della classe originale. La nuova classe può facoltativamente aggiungere il qualificatore EventVersion . La classe MOF dell'evento che non contiene il qualificatore EventVersion viene considerata la versione più recente oppure se tutte le versioni della classe contengono un qualificatore EventVersion , la classe con il numero di versione più alto viene considerata la versione più recente. Il provider usa il membro Class.Version della struttura EVENT_TRACE_HEADER per identificare la versione dell'evento incluso nella traccia.

Nell'esempio seguente viene illustrato come eseguire la versione di una classe MOF dell'evento.

#pragma namespace("\\\\.\\root\\wmi")
#pragma classflags("forceupdate")

[dynamic: ToInstance, Description("Defines my event provider"),
 Guid("{7C214FB1-9CAC-4b8d-BAED-7BF48BF63BB3}")]
class MyProvider : EventTrace
{
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."),
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}"),
 EventVersion(1)]
class MyCategory : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1),
 EventName("MyEvent")]
class MyCategory_MyEvent : MyCategory
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Identifier"): Amended, read, Extension("Guid")] object ID;
    [WmiDataId(6), Description("Buffer Size"): Amended, read] uint32 Size;
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."): Amended,
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}"),
 EventVersion(0)]
class MyCategory_V0 : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1)]
class MyCategory_V0_MyEvent : MyCategory_V0
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Identifier"): Amended, read, Extension("Guid")] object ID;
};