次の方法で共有


FN_VMB_CHANNEL_PACKET_GET_EXTERNAL_DATA コールバック関数 (vmbuskernelmodeclientlibapi.h)

[一部の情報はリリース前の製品に関することであり、正式版がリリースされるまでに大幅に変更される可能性があります。 ここに記載された情報について、Microsoft は明示または黙示を問わずいかなる保証をするものでもありません。]

VmbChannelPacketGetExternalData 関数は、パケット処理中にパケットに関連付けられている外部メモリ記述子Lists (MDL) を取得します。

構文

FN_VMB_CHANNEL_PACKET_GET_EXTERNAL_DATA FnVmbChannelPacketGetExternalData;

NTSTATUS FnVmbChannelPacketGetExternalData(
  VMBPACKETCOMPLETION PacketCompletionContext,
  UINT32 Flags,
  PMDL *Mdl
)
{...}

パラメーター

PacketCompletionContext

受信パケットを識別し、処理が完了するとパケットを参照するために使用されるハンドル。

Flags

MDL のマップ方法を制御するフラグ。 使用可能なフラグ値は次のとおりです。

意味
VMBUS_CHANNEL_PACKET_EXTERNAL_DATA_FLAG_READ_ONLY
MDL を読み取り専用としてマップします。

Mdl

マップされた MDL へのポインター。

戻り値

VmbChannelPacketGetExternalData は状態コードを返します。 この関数がSTATUS_PENDINGを返す場合、呼び出し元はパケット処理コールバックからを返す必要があります。このコールバックは、外部データの準備ができたときに、別の IRQL で再度呼び出されます。 この時点で、この関数の呼び出しは成功し、外部データが返されます。

注釈

このトランザクションで記述されたメモリを表す MDL を作成すると、仮想マシンのこれらのリージョンは、トランザクションの有効期間の残りの間、メモリに固定されます。 これは、仮想マシンのリージョンをページングする必要があるため、関数がSTATUS_PENDINGを返す原因となる可能性があります。

この関数によって返される MDL は、既に所定の位置にロックされているメモリを記述します。 そのため、 MmProbeAndLockPages 関数を呼び出す必要はありません。 ただし、MDL には、ユーザー モードの仮想アドレスもカーネル モードの仮想アドレスもありません。 この関数を呼び出すドライバーが仮想マシン内のメモリを操作するために仮想アドレスを必要とする場合、そのドライバーは MmMapLockedPagesSpecifyCache または MmGetSystemAddressForMdlSafe を呼び出し、対応するロック解除関数 ( MmUnmapLockedPages など) を後で呼び出す必要があります。 仮想アドレスを使用する代わりに、MDL を直接メモリ アクセスに使用するドライバーに渡すだけです。

この関数を呼び出すドライバーは、MDL を解放するために必要ありません。 VmbChannelPacketComplete 関数を呼び出すと無効になります。 カーネル モード クライアント ライブラリ (KMCL) は後でリリースします。

重要

この関数は、Vmbkmcl.sys バス ドライバーによって提供される VMBus カーネル モード クライアント ライブラリ (KMCL) インターフェイスを介して呼び出されます。 これは、 KMCL_CLIENT_INTERFACE_V1 構造体からアクセスされるクライアント関数です。

詳細については、 KMCL_CLIENT_INTERFACE_V1の「解説」セクションを参照してください。

要件

要件
サポートされている最小のクライアント Windows 10 バージョン 1803
Header vmbuskernelmodeclientlibapi.h

こちらもご覧ください

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnmapLockedPages

VmbChannelPacketComplete