Publication de votre schéma d’événement pour un fournisseur classique
Les fournisseurs classiques doivent utiliser le format MOF ( Managed Object Format ) pour publier la disposition de leurs données d’événement. Les consommateurs peuvent ensuite lire la disposition publiée à partir de WMI au moment de l’exécution et l’utiliser pour lire les données d’événement.
Si vous utilisez MOF pour publier la disposition de vos données d’événement dans WMI, vous créez généralement les trois types de classes MOF suivants dans l’espace de noms root\wmi :
- Classe MOF du fournisseur
- Une ou plusieurs classes MOF d’événement
- Une ou plusieurs classes MOF de type d’événement
Classes MOF du fournisseur
Si vous publiez la disposition de vos données d’événement, vous devez créer une classe MOF qui identifie votre fournisseur. Cette classe doit dériver de la classe MOF EventTrace et doit être vide (aucune propriété ou méthode). La classe doit également inclure le qualificateur GUID qui identifie de manière unique le fournisseur. Il s’agit du même GUID que celui que vous utilisez lorsque vous appelez la fonction RegisterTraceGuids pour inscrire votre fournisseur.
Classes MOF d’événement
Une classe MOF d’événement définit une classe d’événements que le fournisseur fournit. Cette classe dérive de la classe MOF du fournisseur et doit être vide (aucune propriété ou méthode). La classe doit également inclure le qualificateur GUID qui identifie de manière unique la classe d’événements que ses classes enfants définissent. Le fournisseur utilise ce même GUID lors de la définition du membre GUID de la structure EVENT_TRACE_HEADER .
Classes MOF de type d’événement
Une classe MOF de type d’événement définit les données d’événement réelles. Cette classe dérive de sa classe MOF d’événement parent. Lorsque vous nommez la classe MOF de type d’événement, la convention consiste à utiliser le nom de la classe MOF de l’événement au début du nom de la classe MOF de type d’événement. Par exemple, si le nom de la classe MOF de l’événement est HWConfig et que la classe MOF de type d’événement représente des informations sur le processeur, vous devez nommer le type d’événement classe MOF, HWConfig_CPU.
Utilisez le qualificateur EventType sur la classe MOF de type d’événement pour identifier le type d’événement. Si plusieurs types d’événements utilisent les mêmes données d’événement, ils peuvent utiliser la même classe MOF. Le fournisseur utilise la même valeur de type d’événement pour identifier l’événement lors de la définition du membre Class.Type de la structure EVENT_TRACE_HEADER .
La classe MOF de type d’événement contient des propriétés. L’ordre de ces propriétés définit la disposition des données d’événement. Le tableau suivant identifie les types de données et les qualificateurs que vous pouvez utiliser pour définir les propriétés. Pour plus d’informations sur les qualificateurs de propriété et de classe que vous pouvez utiliser, consultez Qualificateurs MOF de suivi d’événements.
Type de données | Qualificateurs | Description |
---|---|---|
sint8, uint8 | Format | Déclare un entier décimal de 1 octet. Pour déclarer un caractère ANSI, utilisez le qualificateur Format et définissez sa valeur sur « c ». |
sint16, uint16 | Format | Déclare un entier décimal de 2 octets. Pour indiquer que le nombre est un nombre hexadécimal, utilisez le qualificateur Format . Par exemple, format(« x »). |
sint32, uint32 | Format | Déclare un entier décimal de 4 octets. Pour indiquer que le nombre est un nombre hexadécimal, utilisez le qualificateur Format et définissez sa valeur sur « x ». |
sint64, uint64 | Format | Déclare un entier décimal de 8 octets. Pour indiquer que le nombre est un nombre hexadécimal, utilisez le qualificateur Format et définissez sa valeur sur « x ». |
boolean | Déclare une valeur booléenne. Le consommateur d’événements doit interpréter la valeur comme BOOL (entier de 4 octets). | |
char16 | Déclare un caractère large. Le consommateur d’événements doit interpréter les tableaux char16 dans les événements du noyau comme des chaînes à caractères larges. (Utilisez la taille du tableau pour copier la chaîne. Certaines chaînes peuvent contenir des caractères NULL de début.) | |
object | Extension | Déclare un objet blob binaire. Le qualificateur d’extension indique le type de données dans l’objet blob. |
string | Format, StringTermination | Déclare une valeur de chaîne. Pour indiquer que la chaîne est une chaîne à caractères larges, utilisez le qualificateur Format et définissez sa valeur sur « w ». La chaîne est considérée comme une chaîne ANSI si vous ne spécifiez pas le qualificateur Format . Pour indiquer comment la chaîne est terminée, utilisez le qualificateur StringTermination . |
Pour spécifier un tableau, vous pouvez utiliser des crochets, []. Les crochets peuvent inclure la taille du tableau. Exemple :
[WmiDataId(1), read] uint8 MyGuid[16];
Vous pouvez également utiliser le qualificateur Max pour spécifier la taille d’un tableau. Exemple :
[WmiDataId(1), Max(16), read] uint8 MyGuid[];
Si vous incluez la taille du tableau entre crochets, le compilateur MOF génère le qualificateur Max pour vous.
Il est important d’utiliser le qualificateur Description pour chaque propriété. La description doit contenir un nom complet que le consommateur peut utiliser lors de l’affichage des valeurs de propriété.
L’exemple suivant montre le contenu d’un fichier MOF qui décrit un fournisseur, un événement et une classe MOF de type d’événement.
#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;
};
Notez que les noms de la classe MOF du fournisseur, de l’événement et du type d’événement doivent être uniques au sein de l’espace de noms entier. Pour éviter les conflits de noms, vous devez utiliser un nom unique et descriptif pour tous les noms de classe. Les propriétés de classe doivent également être descriptives et uniques au sein de sa hiérarchie de classes : une classe enfant qui contient le même nom de propriété qu’une classe parente remplace la propriété de la classe parente.
Après avoir défini vos classes MOF, utilisez le compilateur MOF pour générer votre schéma d’événement et l’ajouter au référentiel CIM. Les consommateurs peuvent ensuite lire le schéma à partir du référentiel et lire par programmation les données d’événement. Pour obtenir une description complète de la syntaxe MOF et l’utilisation du compilateur MOF (Mofcomp.exe) pour ajouter vos classes MOF au référentiel CIM, consultez Format d’objet managé. Pour plus d’informations sur l’utilisation de Wbemtest.exe pour accéder au référentiel CIM, consultez Windows Management Instrumentation (WMI).
Contrôle de version de la classe MOF
Si vous ajoutez ou modifiez une classe MOF de type d’événement, la convention consiste à versionner à la fois la classe MOF d’événement et ses classes MOF de type d’événement enfant. Pour versionner la classe MOF de l’événement actuel, ajoutez _Vn au nom de la classe, où n est un nombre incrémentiel commençant à 0. S’il s’agit de la première révision de la classe, ajoutez _V0 au nom de la classe. Vous devez également ajouter le qualificateur EventVersion à la classe . Utilisez le même numéro de version que celui que vous avez utilisé dans le nom de classe pour la valeur du qualificateur EventVersion .
La nouvelle version de la classe MOF d’événement doit utiliser le même nom et qu’un qualificateur GUID que la classe d’origine. La nouvelle classe peut éventuellement ajouter le qualificateur EventVersion . La classe MOF d’événement qui ne contient pas le qualificateur EventVersion est considérée comme la dernière version, ou si toutes les versions de la classe contiennent un qualificateur EventVersion , la classe avec le numéro de version le plus élevé est considérée comme la dernière version. Le fournisseur utilise le membre Class.Version de la structure EVENT_TRACE_HEADER pour identifier la version de l’événement inclus dans la trace.
L’exemple suivant montre comment versionner une classe MOF d’événement.
#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;
};