WHvWriteGpaRange

パーティションのゲスト物理アドレス空間に最大 WHV_READ_WRITE_GPA_RANGE_MAX_SIZE バイトを書き込みます。

構文

// Guest physical address
typedef UINT64 WHV_GUEST_PHYSICAL_ADDRESS;

//
// Maximum data size used by WHvReadGpaRange and WHvWriteGpaRange
//
#define WHV_READ_WRITE_GPA_RANGE_MAX_SIZE 16

typedef enum WHV_CACHE_TYPE {
    WHvCacheTypeUncached         = 0,
    WHvCacheTypeWriteCombining   = 1,
    WHvCacheTypeWriteThrough     = 4,

#if defined(_AMD64_)
    WHvCacheTypeWriteProtected   = 5,
#endif

    WHvCacheTypeWriteBack        = 6
} WHV_CACHE_TYPE;

typedef union WHV_INPUT_VTL
{
    UINT8 AsUINT8;
    struct
    {
        UINT8 TargetVtl    : 4;
        UINT8 UseTargetVtl : 1;
        UINT8 Reserved     : 3;
    };
} WHV_INPUT_VTL;

//
// Control flags used by WHvReadGpaRange and WHvWriteGpaRange
//
typedef union WHV_ACCESS_GPA_CONTROLS
{
    UINT64 AsUINT64;
    struct
    {
        //
        // Cache type for access
        //
        WHV_CACHE_TYPE CacheType;

        //
        // VTL whose GPA is to be accessed
        //
        WHV_INPUT_VTL InputVtl;
        UINT8 Reserved;
        UINT16 Reserved1;
    };
} WHV_ACCESS_GPA_CONTROLS;

HRESULT
WINAPI
WHvWriteGpaRange(
    _In_ WHV_PARTITION_HANDLE Partition,
    _In_ UINT32 VpIndex,
    _In_ WHV_GUEST_PHYSICAL_ADDRESS GuestAddress,
    _In_ WHV_ACCESS_GPA_CONTROLS Controls,
    _In_reads_bytes_(DataSizeInBytes) const VOID* Data,
    _In_ UINT32 DataSizeInBytes
    );

Parameters

Partition

パーティション オブジェクトへのハンドル。

VpIndex

アクセスが実行されるコンテキスト内の仮想プロセッサのインデックスを指定します。

GuestAddress

書き込みを開始するゲスト物理アドレスを指定します。

Controls

WHV_ACCESS_GPA_CONTROLS値として、アクセスのキャッシュの種類とターゲット VTL を指定します。

Data

ゲストの物理アドレス範囲に書き込むバイト数を指定します。

DataSizeInBytes

書き込むバイト数を指定します。 この値は 0 より大きく、 WHV_READ_WRITE_GPA_RANGE_MAX_SIZE以下にする必要があります。

戻り値

関数が成功した場合、戻り値は S_OK

この関数は、次のエラー コードを返すことができます。

  • E_INVALIDARGDataSizeInBytesWHV_READ_WRITE_GPA_RANGE_MAX_SIZEより大きい場合、ControlsCacheTypeが有効なキャッシュの種類ではない、ControlsInputVtlが現在の VTL を参照しない、または Controls の予約済みフィールドが設定されている。
  • E_ACCESSDENIED — ゲストの物理アドレス範囲がマップされていないか、アクセスが許可されていません。

Remarks

WHvWriteGpaRange関数は、仮想プロセッサのコンテキストでゲスト物理メモリに最大WHV_READ_WRITE_GPA_RANGE_MAX_SIZE (16) バイトを書き込みます。 この制限されたアクセス サイズにより、関数は一括メモリ転送ではなく命令オペランドをエミュレートするのに適しています。 より大きな転送の場合は、 WHvMapGpaRange または WHvMapGpaRange2 によって作成されたホスト マッピングを使用してゲスト物理メモリをバックアップし、直接アクセスします。

書き込みは、 VpIndexによって識別される仮想プロセッサのコンテキストで実行されるため、 Controlsで指定されたキャッシュの種類や VTL など、そのプロセッサに適用されるメモリ アクセス セマンティクスを監視します。 対象のページがまだ常駐していない場合、関数はそれをエラーにしてアクセスを再試行します。

Requirements

要件 価値
サポートされている最小Windows Windows 10バージョン 20H2 (x64);Windows 11、バージョン 24H2、ビルド 26100.3915 (Arm64)
Header WinHvPlatform.h
図書館 WinHvPlatform.lib
DLL WinHvPlatform.dll
Architecture x64、Arm64

こちらも参照ください