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 포함) |