IOCTL_EMI_GET_METADATA IOCTL (emi.h)

IOCTL_EMI_GET_METADATA控制代码从设备检索 EMI 元数据。 元数据描述应如何解释请求设备的 EMI 通道以及其他相关信息。

输入缓冲区

无。

输入缓冲区长度

无。

输出缓冲区

AssociatedIrp.SystemBuffer 成员指定调用方分配的缓冲区的地址,该缓冲区用于检索根据接口版本EMI_METADATA_V1EMI_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)

另请参阅

EMI_METADATA_V2
能量计量接口