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 获取循环中的每个通道,这是因为 Channels 中每个元素的大小也因每个 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) |