Compartilhar via


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)

Confira também

EMI_METADATA_V2
Interface de medição de energia