IOCTL_EMI_GET_METADATA IOCTL (emi.h)
Der IOCTL_EMI_GET_METADATA-Steuerelementcode ruft EMI-Metadaten von einem Gerät ab. Die Metadaten beschreiben, wie EMI-Kanäle des anfordernden Geräts interpretiert werden sollen, und andere zugehörige Informationen.
Eingabepuffer
Keine.
Eingabepufferlänge
Keine.
Ausgabepuffer
Das AssociatedIrp.SystemBuffer-Element gibt die Adresse eines vom Aufrufer zugewiesenen Puffers an, der verwendet wird, um die gerätespezifischen Metadaten abzurufen, die basierend auf der Schnittstellenversion um EMI_METADATA_V1 oder EMI_METADATA_V2 erweitert wurden. Bei der Ausgabe enthält diese Struktur die Metadaten der Kanäle des anfordernden Geräts.
Länge des Ausgabepuffers
Die Länge des Puffers sollte gleich oder größer als der von IOCTL_EMI_GET_METADATA_SIZE abgerufene Wert sein, und er wird im Parameter.DeviceIoControl.OutputBufferLength-Element angegeben.
Hinweise
Um die Metadaten erfolgreich abzurufen, sollte der Aufrufer zunächst die Version der Metadaten durch IOCTL_EMI_GET_VERSION und zweitens die Größe der Metadaten durch IOCTL_EMI_GET_METADATA_SIZE
Eine der wichtigen Informationen in den Metadaten ist die Kanäle . Jeder Kanal stellt eine instance eines Energiemessungsindikators dar, der vom Gerät verfügbar gemacht wird. Der Aufrufer sollte die Kanäle dynamisch gemäß der Version interpretieren.
Für EMI_VERSION_V1 beschreiben die Metadaten einen einzelnen Kanal durch EMI_METADATA_V1 Struktur.
Für EMI_VERSION_V2 beschreiben die Metadaten mehrere Kanäle nach EMI_METADATA_V2 Struktur, die eine gerätespezifische Struktur ist. Daher variiert die Größe je nach Treiberinplemenetation. Die Anzahl der Kanäle wird durch ChannelCount in den Metadaten angegeben, auf die verwiesen werden sollte, um die Kanäle in den Metadaten aufzulisten. Außerdem sollte der Aufrufer EMI_CHANNEL_V2_NEXT_CHANNEL verwenden, um jeden Kanal in einer Schleife abzurufen. Dies liegt daran, dass die Größe der einzelnen Elemente in den Kanälen auch je nach ChannelName variiert, z. B.:
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);
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar ab Windows 10. |
Kopfzeile | emi.h (emi.h einschließen) |