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 既没有用户模式虚拟地址,也没有内核模式虚拟地址。 如果调用此函数的驱动程序需要虚拟地址来操作虚拟机中的内存,该驱动程序必须稍后调用 MmMapLockedPagesSpecifyCacheMmGetSystemAddressForMdlSafe,以及相应的解锁函数(如 MmUnmapLockedPages)。 使用虚拟地址的替代方法是将 MDL 向下传递到使用该 MDL 进行直接内存访问的驱动程序。

调用此函数的驱动程序不需要释放 MDL。 调用 VmbChannelPacketComplete 函数时,该函数无效。 KMCL (内核模式客户端库) 稍后发布。

重要

此函数通过 VMBus 内核模式客户端库 (KMCL) 接口调用,由 Vmbkmcl.sys 总线驱动程序提供。 这是从 KMCL_CLIENT_INTERFACE_V1 结构访问的客户端函数。

有关详细信息,请参阅 KMCL_CLIENT_INTERFACE_V1的“备注”部分。

要求

要求
最低受支持的客户端 Windows 10 版本 1803
标头 vmbuskernelmodeclientlibapi.h

另请参阅

MmGetSystemAddressForMdlSafe

MmMapLockedPagesSpecifyCache

MmProbeAndLockPages

MmUnmapLockedPages

VmbChannelPacketComplete