Suivi d’événements WMI
Cette section décrit les extensions WMI de WDM (prises en charge par Windows 2000 et versions ultérieures) que les pilotes en mode noyau, en tant que fournisseurs d’informations, peuvent utiliser pour fournir des informations aux consommateurs d’informations. Les pilotes fournissent généralement des informations qu’un consommateur utilise pour déterminer la configuration et l’utilisation des ressources du pilote. En plus des extensions WMI pour WDM, une API en mode utilisateur prend en charge les fournisseurs ou les consommateurs d’informations sur les événements WMI. Pour plus d’informations, consultez le Kit de développement logiciel (SDK) Windows.
L’enregistreur d’événements prend en charge jusqu’à 32 instances. L’une des instances est réservée au suivi du noyau. L’enregistreur d’événements prend en charge le suivi d’un taux d’événements élevé.
Les événements de trace sont définis de la même manière que les autres événements WMI. Les événements WMI sont décrits dans le fichier MOF. Pour plus d’informations sur les descriptions des événements WMI, consultez Syntaxe MOF pour les données et les blocs d’événements WMI.
Processus par lequel les informations de journalisation des pilotes en mode noyau sont intégrées à l’infrastructure WMI existante. Pour journaliser les événements de trace, un pilote effectue les opérations suivantes :
Inscrivez-vous en tant que fournisseur WMI en appelant IoWMIRegistrationControl.
Marquez les événements comme pouvant être suivis en définissant WMIREG_FLAG_TRACED_GUID dans le membre Flags de la structure WMIREGGUID qui est passée lorsque le pilote inscrit des événements auprès de WMI.
Spécifiez un événement comme événement de contrôle pour l’activation/désactivation globale d’un ensemble d’événements de trace en définissant WMIREG_FLAG_TRACE_CONTROL_GUID dans le membre Indicateurs de la structure WMIREGGUID qui est passé lorsque le pilote inscrit des événements auprès de WMI.
Lors de la réception d’une demande de WMI pour activer les événements où le GUID correspond au GUID du contrôle de trace, le pilote doit stocker le handle dans l’enregistreur d’événements. La valeur sera nécessaire lors de l’écriture d’un événement. Pour plus d’informations sur l’utilisation de ce handle, consultez l’étape 6. La valeur de handle de l’enregistreur d’événements est contenue dans le membre HistoricalContext de la partie WNODE_HEADER de la mémoire tampon WMI qui fait partie des paramètres de la demande d’activation des événements.
Déterminez si l’événement de trace sera envoyé aux consommateurs d’événements WMI ou s’il est ciblé uniquement pour l’enregistreur d’événements WMI. Cela détermine d’où doit provenir la mémoire de la structure EVENT_TRACE_HEADER . Cette mémoire finira par être passée à IoWMIWriteEvent.
Si l’événement est un événement de journal uniquement, la mémoire n’est pas supprimée par WMI. Dans ce cas, le pilote doit passer une mémoire tampon sur la pile ou réutiliser une mémoire tampon allouée à cet effet. Pour des raisons de performances, le pilote doit réduire les appels inutiles pour allouer ou libérer de la mémoire. Le non-respect de cette recommandation compromettra l’intégrité des informations de minutage contenues dans le fichier journal.
Si l’événement doit être envoyé à la fois à l’enregistreur d’événements et aux consommateurs d’événements WMI, la mémoire doit être allouée à partir d’un pool non paginé. Dans ce cas, l’événement est envoyé à l’enregistreur d’événements, puis transféré à WMI pour être envoyé aux consommateurs d’événements WMI qui ont demandé une notification de l’événement. La mémoire de l’événement est alors libérée par WMI en fonction du comportement d’IoWMIWriteEvent.
Une fois la mémoire de l’EVENT_TRACE_HEADER et les données d’événement de pilote, le cas échéant, sécurisées, les informations suivantes doivent être définies :
Définissez le membre Size sur sizeof(EVENT_TRACE_HEADER) plus la taille des données d’événement de pilote supplémentaires qui seront ajoutées à la fin de EVENT_TRACE_HEADER.
Définissez le membre Indicateurs sur WNODE_FLAG_TRACED_GUID pour que l’événement soit envoyé à l’enregistreur d’événements. Si l’événement doit également être envoyé aux consommateurs d’événements WMI, définissez le WNODE_FLAG_LOG_WNODE. Notez qu’il n’est pas nécessaire de définir WNODE_FLAG_TRACED_GUID si vous définissez WNODE_FLAG_LOG_WNODE. Si les deux sont définis, WNODE_FLAG_TRACED_GUID est prioritaire et l’événement n’est pas envoyé aux consommateurs d’événements WMI.
Définissez le guid ou le membre GuidPtr . Si vous utilisez GuidPtr, définissez WNODE_FLAG_USE_GUID_PTR dans le membre Indicateurs .
Si vous le souhaitez, spécifiez une valeur pour TimeStamp. Si le pilote ne spécifie pas de valeur TimeStamp , l’enregistreur d’événements la renseigne. Si le pilote ne souhaite pas que l’enregistreur d’événements définisse l’horodatage, il doit définir WNODE_FLAG_USE_TIMESTAMP dans le membre Indicateurs .
Définissez l’un des membres EVENT_TRACE_HEADER suivants qui ont une signification pour le pilote : Class.Type, Class.Level et Class.Version.
Enfin, castez le EVENT_TRACE_HEADER en WNODE_HEADER et définissez la valeur HistoricalContext du Wnode sur le handle d’enregistreur d’événements enregistré à l’étape 4 ci-dessus.
Appelez IoWMIWriteEvent avec le pointeur vers la structure EVENT_TRACE_HEADER .
Le pilote doit continuer à journaliser les événements de trace associés au GUID de contrôle jusqu’à ce qu’il reçoive une notification pour désactiver la journalisation des événements via une demande de IRP_MN_DISABLE_EVENTS .