次の方法で共有


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

メタデータに含まれる重要な情報の 1 つは Channels です。各チャネルは、デバイスによって公開されるエネルギー測定カウンターのインスタンスを表します。呼び出し元は、バージョンに従って チャネル を動的に解釈する必要があります。

EMI_VERSION_V1の場合、メタデータは構造体によって 1 つのチャネル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 以降で使用できます。
Header emi.h (Emi.h を含む)

こちらもご覧ください

EMI_METADATA_V2
エネルギーメータリングインタフェース