IOCTL_EMI_GET_METADATA IOCTL (emi.h)
Le code de contrôle IOCTL_EMI_GET_METADATA récupère les métadonnées EMI d’un appareil. Les métadonnées décrivent la façon dont les canaux EMI de l’appareil demandeur doivent être interprétés, ainsi que d’autres informations connexes.
Mémoire tampon d'entrée
Aucun.
Longueur de la mémoire tampon d’entrée
Aucun.
Mémoire tampon de sortie
Le membre AssociatedIrp.SystemBuffer spécifie l’adresse d’une mémoire tampon allouée à l’appelant qui est utilisée pour récupérer les métadonnées spécifiques à l’appareil qui ont été étendues par EMI_METADATA_V1 ou EMI_METADATA_V2 en fonction de la version de l’interface. Sur la sortie, cette structure contient les métadonnées des canaux de l’appareil demandeur.
Longueur de la mémoire tampon de sortie
La longueur de la mémoire tampon doit être égale ou supérieure à la valeur récupérée à partir de IOCTL_EMI_GET_METADATA_SIZE et elle est spécifiée dans le membre Parameters.DeviceIoControl.OutputBufferLength .
Remarques
Pour obtenir les métadonnées avec succès, l’appelant doit d’abord obtenir la version des métadonnées par IOCTL_EMI_GET_VERSION et, deuxièmement, la taille des métadonnées par IOCTL_EMI_GET_METADATA_SIZE
L’une des informations importantes incluses dans les métadonnées est les Canaux , chaque canal représente une instance d’un compteur de mesure d’énergie exposé par l’appareil, l’appelant doit interpréter les canaux dynamiquement en fonction de la version.
Pour EMI_VERSION_V1 , les métadonnées décrivent un canal unique par EMI_METADATA_V1 structure.
Pour EMI_VERSION_V2 , les métadonnées décrivent plusieurs canaux par EMI_METADATA_V2 structure, qui est une structure spécifique à l’appareil. Par conséquent, la taille varie en fonction de l’implémentation du pilote, le nombre de canaux est spécifique par ChannelCount dans les métadonnées, qui doivent être référencées pour énumérer les canaux dans les métadonnées. En outre, l’appelant doit utiliser EMI_CHANNEL_V2_NEXT_CHANNEL pour obtenir chaque canal dans une boucle, car la taille de chaque élément dans les canaux varie également en fonction de chaque ChannelName , par exemple :
BOOL Status;
EMI_METADATA_SIZE MetadataSize;
EMI_METADATA_V2* MetaData;
ZeroMemory(&MetadataSize, sizeof(EMI_METADATA_SIZE));
//
// Retrieve the size of metadata.
//
Status = DeviceIoControl(DeviceHandle,
IOCTL_EMI_GET_METADATA_SIZE,
NULL,
NULL,
&MetadataSize,
sizeof(EMI_METADATA_SIZE),
BytesReturned,
NULL);
if (!Status) {
return Status;
}
//
// Caller allocated buffer to retrieve the metadata.
//
MetaData = (EMI_METADATA_V2*)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
MetadataSize.MetadataSize);
if (NULL == MetaData) {
SetLastError(ERROR_OUTOFMEMORY);
return FALSE;
}
//
// Retrieve the metadata.
//
Status = DeviceIoControl(DeviceHandle,
IOCTL_EMI_GET_METADATA,
NULL,
NULL,
MetaData,
MetadataSize.MetadataSize,
BytesReturned,
NULL);
//
// Enumerate channels.
//
EMI_CHANNEL_V2* Channel = &MetaData->Channels[0];
for (int i = 0 ; i < MetaData->ChannelCount ; i++) {
//
// Get each EMI channel.
//
Channel = EMI_CHANNEL_V2_NEXT_CHANNEL(Channel);
}
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible à partir de Windows 10. |
En-tête | emi.h (inclure Emi.h) |