IOCTL_EMI_GET_METADATA IOCTL (emi.h)
Код элемента управления IOCTL_EMI_GET_METADATA извлекает метаданные EMI с устройства. Метаданные описывают, как следует интерпретировать каналы EMI запрашивающего устройства и другие связанные сведения.
Входной буфер
Нет.
Длина входного буфера
Нет.
Выходной буфер
Член AssociatedIrp.SystemBuffer указывает адрес буфера, выделенного вызывающим объектом, который используется для получения метаданных конкретного устройства, которые были расширены EMI_METADATA_V1 или EMI_METADATA_V2 в зависимости от версии интерфейса. В выходных данных эта структура содержит метаданные каналов запрашивающего устройства.
Длина выходного буфера
Длина буфера должна быть равна или больше значения, полученного из IOCTL_EMI_GET_METADATA_SIZE и указывается в элементе Parameters.DeviceIoControl.OutputBufferLength .
Комментарии
Чтобы успешно получить метаданные, вызывающий объект должен, во-первых, получить версию метаданных по IOCTL_EMI_GET_VERSION и, во-вторых, размер метаданных по IOCTL_EMI_GET_METADATA_SIZE
Одной из важных сведений, включенных в метаданные, являются каналы . Каждый канал представляет экземпляр счетчика измерения энергии, который предоставляется устройством. Вызывающий объект должен динамически интерпретировать каналы в соответствии с версией.
Для EMI_VERSION_V1 метаданные описывают один канал по EMI_METADATA_V1 структуре.
Для EMI_VERSION_V2 метаданные описывают несколько каналов по EMI_METADATA_V2 структуре, которая является структурой для конкретного устройства, поэтому размер зависит от реализации драйвера. Количество каналов определяется ChannelCount в метаданных, на которые следует ссылаться для перечисления каналов в метаданных. Кроме того, вызывающий объект должен использовать EMI_CHANNEL_V2_NEXT_CHANNEL для получения каждого канала в цикле. Это связано с тем, что размер каждого элемента в Channel также зависит от каждого ChannelName , например:
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);
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно начиная с Windows 10. |
Верхняя часть | emi.h (включая Emi.h) |