IOCTL_EMI_GET_METADATA IOCTL (emi.h)
O código de controle IOCTL_EMI_GET_METADATA recupera metadados EMI de um dispositivo. Os metadados descrevem como os canais emI do dispositivo solicitante devem ser interpretados e outras informações relacionadas.
Buffer de entrada
Nenhum.
Comprimento do buffer de entrada
Nenhum.
Buffer de saída
O membro AssociatedIrp.SystemBuffer especifica o endereço de um buffer alocado pelo chamador que é usado para recuperar os metadados específicos do dispositivo estendidos por EMI_METADATA_V1 ou EMI_METADATA_V2 com base na versão da interface. Na saída, essa estrutura contém os metadados dos canais do dispositivo solicitante.
Comprimento do buffer de saída
O comprimento do buffer deve ser igual ou maior que o valor recuperado de IOCTL_EMI_GET_METADATA_SIZE e é especificado no membro Parameters.DeviceIoControl.OutputBufferLength .
Comentários
Para obter com êxito os metadados, o chamador deve primeiro obter a versão dos metadados IOCTL_EMI_GET_VERSION e, em segundo lugar, o tamanho dos metadados por IOCTL_EMI_GET_METADATA_SIZE
Uma das informações importantes incluídas nos metadados é os Canais , cada canal representa uma instância de um contador de medição de energia exposto pelo dispositivo, o chamador deve interpretar os Canais dinamicamente de acordo com a versão.
Para EMI_VERSION_V1 , os metadados descrevem um único canal por EMI_METADATA_V1 estrutura.
Por EMI_VERSION_V2 , os metadados descrevem vários canais por EMI_METADATA_V2 estrutura, que é uma estrutura específica do dispositivo, portanto, o tamanho varia com base na implemenetação do driver, o número de canais é especificado por ChannelCount nos metadados, que devem ser referenciados para enumerar os Canais nos metadados. Além disso, o chamador deve usar EMI_CHANNEL_V2_NEXT_CHANNEL para obter cada canal em um loop, isso ocorre porque o tamanho de cada elemento nos Canais também varia de acordo com cada ChannelName , por exemplo:
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);
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Disponível a partir do Windows 10. |
Cabeçalho | emi.h (inclua Emi.h) |