다음을 통해 공유


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

메타데이터에 포함된 중요한 정보 중 하나는 채널입니다. 각 채널은 디바이스에서 노출하는 에너지 측정 카운터의 instance 나타내며 호출자는 버전에 따라 채널을 동적으로 해석해야 합니다.

EMI_VERSION_V1 경우 메타데이터는 EMI_METADATA_V1 구조별 단일 채널을 설명합니다.

EMI_VERSION_V2 경우 메타데이터는 디바이스별 구조인 EMI_METADATA_V2 구조로 여러 채널을 설명하므로 크기는 드라이버의 임피니티에 따라 다르며, 채널 수는 메타데이터의 ChannelCount 에 의해 지정되며, 메타데이터의 채널을 열거하기 위해 참조되어야 합니다. 또한 호출자는 EMI_CHANNEL_V2_NEXT_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 포함)

추가 정보

EMI_METADATA_V2
에너지 계량 인터페이스