DXGKARG_BUILDPAGINGBUFFER结构(d3dkmddi.h)
DXGKARG_BUILDPAGINGBUFFER 结构描述 DxgkDdiBuildPagingBuffer** 回调的参数,该回调生成用于内存传输作的分页缓冲区。
语法
typedef struct _DXGKARG_BUILDPAGINGBUFFER {
VOID *pDmaBuffer;
UINT DmaSize;
VOID *pDmaBufferPrivateData;
UINT DmaBufferPrivateDataSize;
DXGK_BUILDPAGINGBUFFER_OPERATION Operation;
UINT MultipassOffset;
union {
struct {
HANDLE hAllocation;
UINT TransferOffset;
SIZE_T TransferSize;
struct {
UINT SegmentId;
union {
LARGE_INTEGER SegmentAddress;
MDL *pMdl;
};
} Source;
struct {
UINT SegmentId;
union {
LARGE_INTEGER SegmentAddress;
MDL *pMdl;
};
} Destination;
DXGK_TRANSFERFLAGS Flags;
UINT MdlOffset;
} Transfer;
struct {
HANDLE hAllocation;
SIZE_T FillSize;
UINT FillPattern;
struct {
UINT SegmentId;
LARGE_INTEGER SegmentAddress;
} Destination;
} Fill;
struct {
HANDLE hAllocation;
DXGK_DISCARDCONTENTFLAGS Flags;
UINT SegmentId;
PHYSICAL_ADDRESS SegmentAddress;
} DiscardContent;
struct {
UINT SegmentId;
PHYSICAL_ADDRESS PhysicalAddress;
} ReadPhysical;
struct {
UINT SegmentId;
PHYSICAL_ADDRESS PhysicalAddress;
} WritePhysical;
struct {
HANDLE hDevice;
HANDLE hAllocation;
UINT SegmentId;
SIZE_T OffsetInPages;
SIZE_T NumberOfPages;
PMDL pMdl;
DXGK_MAPAPERTUREFLAGS Flags;
ULONG MdlOffset;
} MapApertureSegment;
struct {
HANDLE hDevice;
HANDLE hAllocation;
UINT SegmentId;
SIZE_T OffsetInPages;
SIZE_T NumberOfPages;
PHYSICAL_ADDRESS DummyPage;
} UnmapApertureSegment;
struct {
HANDLE hAllocation;
UINT TransferOffset;
SIZE_T TransferSize;
struct {
UINT SegmentId;
union {
LARGE_INTEGER SegmentAddress;
MDL *pMdl;
};
} Source;
struct {
UINT SegmentId;
union {
LARGE_INTEGER SegmentAddress;
MDL *pMdl;
};
} Destination;
DXGK_TRANSFERFLAGS Flags;
UINT SwizzlingRangeId;
UINT SwizzlingRangeData;
} SpecialLockTransfer;
struct {
HANDLE hAllocation;
struct {
UINT SegmentId;
union {
LARGE_INTEGER SegmentAddress;
MDL *pMdl;
};
PVOID VirtualAddress;
D3DGPU_VIRTUAL_ADDRESS GpuVirtualAddress;
} Destination;
} InitContextResource;
DXGK_BUILDPAGINGBUFFER_TRANSFERVIRTUAL TransferVirtual;
DXGK_BUILDPAGINGBUFFER_FILLVIRTUAL FillVirtual;
DXGK_BUILDPAGINGBUFFER_UPDATEPAGETABLE UpdatePageTable;
DXGK_BUILDPAGINGBUFFER_FLUSHTLB FlushTlb;
DXGK_BUILDPAGINGBUFFER_COPYPAGETABLEENTRIES CopyPageTableEntries;
DXGK_BUILDPAGINGBUFFER_UPDATECONTEXTALLOCATION UpdateContextAllocation;
DXGK_BUILDPAGINGBUFFER_NOTIFYRESIDENCY NotifyResidency;
DXGK_BUILDPAGINGBUFFER_SIGNALMONITOREDFENCE SignalMonitoredFence;
struct {
HANDLE hDevice;
HANDLE hAllocation;
UINT SegmentId;
SIZE_T OffsetInPages;
SIZE_T NumberOfPages;
DXGK_ADL Adl;
DXGK_MAPAPERTUREFLAGS Flags;
ULONG AdlOffset;
PVOID CpuVisibleAddress;
} MapApertureSegment2;
DXGK_BUILDPAGINGBUFFER_NOTIFY_FENCE_RESIDENCY NotifyFenceResidency;
DXGK_BUILDPAGINGBUFFER_MAPMMU MmapMmu;
DXGK_BUILDPAGINGBUFFER_UNMAPMMU UnmapMmu;
DXGK_BUILDPAGINGBUFFER_NOTIFYRESIDENCY2 NotifyResidency2;
DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC NotifyAllocation;
struct {
UINT Reserved[64];
} Reserved;
};
HANDLE hSystemContext;
D3DGPU_VIRTUAL_ADDRESS DmaBufferGpuVirtualAddress;
UINT DmaBufferWriteOffset;
} DXGKARG_BUILDPAGINGBUFFER;
成员
pDmaBuffer
[in/out]分页缓冲区中第一个可用字节的虚拟地址。 首次使用新的分页缓冲区调用驱动程序时,此虚拟地址在 4 KB 上对齐。 驱动程序在分页缓冲区中紧密打包作,直到分页缓冲区已满,然后使用新的分页缓冲区。 因此,如果图形处理单元(GPU)需要对分页缓冲区提交进行特定对齐,驱动程序应通过填充写入到分页缓冲区的作来强制实施这种对齐方式。 在 DxgkDdiBuildPagingBuffer 函数返回之前,驱动程序应更新 pDmaBuffer 以指向写入到分页缓冲区的最后一个字节。
DmaSize
[in/out]pDmaBuffer 指定的分页缓冲区的大小(以字节为单位)。
pDmaBufferPrivateData
[in/out]指向与直接内存访问(DMA)缓冲区(即分页缓冲区)关联的驱动程序驻留专用数据结构的指针,该缓冲区 pDmaBuffer 指定。
DmaBufferPrivateDataSize
[in/out]pDmaBufferPrivateData 指向当前作的专用数据结构中保留的字节数。
Operation
[in]指示要执行的内存作类型的 DXGK_BUILDPAGINGBUFFER_OPERATION类型值。
MultipassOffset
[in/out]一个 UINT 值,该值指定需要多个分页缓冲区时分页作的进度。 驱动程序设置此值以指示拆分为多个分页缓冲区进行多个传输作。 例如,驱动程序可以存储上次传输的基于分页传输的页码。
Transfer
[in]描述传输作的结构。
Transfer.hAllocation
[in]驱动程序 DxgkDdiCreateAllocation 函数在 DXGK_ALLOCATIONINFO 结构的 hAllocation 成员中返回的分配句柄,该成员是 DXGKARG_CREATEALLOCATION 结构的 pAllocationInfo 成员的一部分。 分配句柄指向包含传输的专用驱动程序数据的缓冲区。
Transfer.TransferOffset
[in]分配中传输的第一页的偏移量(以字节为单位)。 此偏移量仅适用于段位置描述的位置。 此偏移量不适用于内存范围的 MDL 说明。 如果驱动程序需要多个分页缓冲区来完成传输(也就是说,驱动程序从其 DxgkDdiBuildPagingBuffer 函数返回STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER),TransferOffset 对于每次调用 DxgkDdiBuildPagingBuffer 相同。
Transfer.TransferSize
[in]要传输的内存信息的大小(以字节为单位)。
Transfer.Source
[in]描述源分配的结构。 此结构包含一个 SegmentId 成员和一个联合,该成员包含源分配(SegmentAddress)段的偏移量,或指向源的 MDL 的指针(pMdl)。
Transfer.Source.SegmentId
[in]源分配中段的标识符;如果源分配由 Source 包含的联合的 pMdl 成员描述源分配,则为零。
Transfer.Source.SegmentAddress
[in]如果 源 的 SegmentId 成员为非零,则源段地址。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。
Transfer.Source.pMdl
[in]指向包含 MDL 结构的缓冲区的指针,该结构描述源的系统内存页(如果 SegmentIdSource 的成员为零)。
Transfer.Destination
[in]描述目标分配的结构。 此结构包含一个 SegmentId 成员和一个联合,该成员包含目标分配段(SegmentAddress)的偏移量或指向目标 MDL 的指针(pMdl)。
Transfer.Destination.SegmentId
[in]目标分配中段的标识符;如果目标分配由 目标 包含的联合的 pMdl 成员描述目标分配,则为零。
Transfer.Destination.SegmentAddress
[in]如果 目标 的 SegmentId 成员为非零,则目标段地址。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。
Transfer.Destination.pMdl
[in]指向包含 MDL 结构的缓冲区的指针,该结构描述目标的系统内存页(如果 SegmentIdDestination 的成员为零)。
Transfer.Flags
[in]一个 DXGK_TRANSFERFLAGS 结构,用于标识要执行的特殊锁传输作的类型(在位字段标志中)。
Transfer.MdlOffset
[in]系统内存页中的偏移量(在 MDL 结构中,pMdl 成员指向)指向当前作的第一个系统内存页。 驱动程序可以通过调用 [MmGetMdlPfnArray](/windows-hardware/drivers/kernel/mm-bad-pointer#mmgetmdlpfnarray 函数来获取第一个系统内存页的物理地址,如下所示。
MmGetMdlPfnArray(pMdl)[MdlOffset];
Fill
[in]描述填充作的结构。
Fill.hAllocation
[in]包含要填充的内容的分配的句柄。
Fill.FillSize
[in]要填充的内存信息的大小(以字节为单位)。
Fill.FillPattern
[in]要填充目标的模式。 视频内存管理器使用此信息在首次分页时将视频内存初始化为特定模式。 在这种情况下,填充请求不存在任何源, 只有目标存在。
Fill.Destination
[in]描述填充作的目标分配的结构。
Fill.Destination.SegmentId
[in]目标分配中段的标识符。
Fill.Destination.SegmentAddress
[in]目标段地址。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。
DiscardContent
[in]描述放弃内容作的结构。
DiscardContent.hAllocation
[in]包含要丢弃的内容的分配的句柄。
DiscardContent.Flags
[in]一个 DXGK_DISCARDCONTENTFLAGS 结构,用于标识要执行的放弃内容作的类型(在位字段标志中)。
DiscardContent.SegmentId
[in]要从中放弃内容的分配中的段的标识符。
DiscardContent.SegmentAddress
[in]指示段地址的PHYSICAL_ADDRESS数据类型(定义为LARGE_INTEGER)。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。 此位置是从中丢弃内容的位置。
ReadPhysical
[in]描述读取物理作的结构。
ReadPhysical.SegmentId
[in]从中读取数据的段的标识符。
ReadPhysical.PhysicalAddress
[in]PHYSICAL_ADDRESS数据类型(定义为LARGE_INTEGER),指示 SegmentId 指定的段内的物理地址,其中读取数据。
WritePhysical
[in]描述写入物理作的结构。
WritePhysical.SegmentId
[in]数据写入到的段的标识符。
WritePhysical.PhysicalAddress
[in]PHYSICAL_ADDRESS数据类型(定义为LARGE_INTEGER),用于指示 SegmentId 指定的段内的物理地址,其中写入了数据。
MapApertureSegment
[in]描述使用 MDL 的 map-aperture 段作的结构。
MapApertureSegment.hDevice
[in]拥有 hAllocation 分配的设备句柄指定映射到 SegmentId 指定的光圈段。
对于共享分配,hDevice 设置为视频内存管理器确定为分配所有者的设备。
hDevice 为主分配 NULL。
MapApertureSegment.hAllocation
[in]映射到 SegmentId 指定的光圈段的分配句柄。
当 DMA 缓冲区映射到光圈段时,hAllocationNULL,因为驱动程序未显式创建 DMA 缓冲区。
MapApertureSegment.SegmentId
[in]要配置的光圈段的标识符。
MapApertureSegment.OffsetInPages
[in]从段开头到要映射的第一页的偏移量(以页为单位)。
MapApertureSegment.NumberOfPages
[in]要映射的页数。
MapApertureSegment.pMdl
[in]指向包含 MDL 结构的缓冲区的指针,该结构描述要映射到光圈段的物理系统内存页。
MapApertureSegment.Flags
[in]一个 DXGK_MAPAPERTUREFLAGS 结构,用于标识位字段标志中要执行的地图光圈段作的类型。
MapApertureSegment.MdlOffset
[in]系统内存页中的偏移量(在 MDL 结构中,pMdl 成员指向)指向当前作的第一个系统内存页。 驱动程序可以通过调用 [MmGetMdlPfnArray](/windows-hardware/drivers/kernel/mm-bad-pointer#mmgetmdlpfnarray 函数来获取第一个系统内存页的物理地址,如下所示。
MmGetMdlPfnArray(pMdl)[MdlOffset];
UnmapApertureSegment
[in]描述 unmap-aperture-segment作的结构。
UnmapApertureSegment.hDevice
[in]拥有 hAllocation 分配的设备句柄指定从 SegmentId 指定的光圈段取消映射。
对于共享分配,hDevice 设置为视频内存管理器确定为分配所有者的设备。
hDevice 为主分配 NULL。
UnmapApertureSegment.hAllocation
[in]从 SegmentId 指定的光圈段取消映射的分配句柄。
hAllocation 在从光圈段取消映射 DMA 缓冲区时 NULL,因为驱动程序未显式创建 DMA 缓冲区。
UnmapApertureSegment.SegmentId
[in]要配置的光圈段的标识符。
UnmapApertureSegment.OffsetInPages
[in]从段开头到第一页到取消映射的偏移量(以页为单位)。
UnmapApertureSegment.NumberOfPages
[in]要取消映射的页数。
UnmapApertureSegment.DummyPage
[in]PHYSICAL_ADDRESS数据类型(定义为LARGE_INTEGER),指示驱动程序应映射未映射的范围的占位符页的物理地址。
SpecialLockTransfer
[in]描述特殊锁传输作的结构。
SpecialLockTransfer.hAllocation
[in]驱动程序 DxgkDdiCreateAllocation 函数在 DXGK_ALLOCATIONINFO 结构的 hAllocation 成员中返回的分配句柄,该成员是 DXGKARG_CREATEALLOCATION 结构的 pAllocationInfo 成员的一部分。 分配句柄指向包含专用驱动程序数据的缓冲区,用于特殊锁传输。
SpecialLockTransfer.TransferOffset
[in]分配中传输的第一页的偏移量(以字节为单位)。 此偏移量仅适用于段位置描述的位置。 此偏移量不适用于内存范围的 MDL 说明。 如果驱动程序需要多个分页缓冲区来完成传输(也就是说,驱动程序从其 DxgkDdiBuildPagingBuffer 函数返回STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER),TransferOffset 对于每次调用 DxgkDdiBuildPagingBuffer 相同。
SpecialLockTransfer.TransferSize
[in]要传输的内存信息的大小(以字节为单位)。
SpecialLockTransfer.Source
[in]描述源分配的结构。 此结构包含一个 SegmentId 成员和一个联合,该成员包含源分配(SegmentAddress)段的偏移量,或指向源的 MDL 的指针(pMdl)。
SpecialLockTransfer.Source.SegmentId
[in]源分配中段的标识符;如果源分配由 Source 包含的联合的 pMdl 成员描述源分配,则为零。
SpecialLockTransfer.Source.(未命名的联合)
[in]包含源分配段(SegmentAddress)的偏移量或指向源 MDL(pMdl)的指针的联合。
SpecialLockTransfer.Source.SegmentAddress
[in]如果 源 的 SegmentId 成员为非零,则源段地址。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。
SpecialLockTransfer.Source.pMdl
[in]指向包含 MDL 结构的缓冲区的指针,该结构描述源的系统内存页(如果 SegmentIdSource 的成员为零)。
SpecialLockTransfer.Destination
[in]描述目标分配的结构。 此结构包含一个 SegmentId 成员和一个联合,该成员包含目标分配段(SegmentAddress)的偏移量或指向目标 MDL 的指针(pMdl)。
SpecialLockTransfer.Destination.SegmentId
[in]目标分配中段的标识符;如果目标分配由 目标 包含的联合的 pMdl 成员描述目标分配,则为零。
SpecialLockTransfer.Destination。(未命名的联合)
[in]包含目标分配段(SegmentAddress)的偏移量或指向目标(pMdl)MDL 的指针的联合。
SpecialLockTransfer.Destination.SegmentAddress
[in]如果 目标 的 SegmentId 成员为非零,则目标段地址。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。
SpecialLockTransfer.Destination.pMdl
[in]指向包含 MDL 结构的缓冲区的指针,该结构描述目标的系统内存页(如果 SegmentIdDestination 的成员为零)。
SpecialLockTransfer.Flags
[in]一个 DXGK_TRANSFERFLAGS 结构,用于标识要执行的特殊锁传输作的类型(在位字段标志中)。
SpecialLockTransfer.SwizzlingRangeId
[in]标识重排范围的 UINT 值。
SpecialLockTransfer.SwizzlingRangeData
[in]一个指定重排范围的数据的 UINT 值。
InitContextResource
[in]描述上下文初始化作的结构。 从 Windows 8 开始支持。
InitContextResource.hAllocation
[in]调用 DxgkCbCreateContextAllocation时创建的上下文分配的句柄。 此分配的句柄在 DXGKARGCB_CREATECONTEXTALLOCATION 结构的 hAllocation 成员中返回。 驱动程序在调用 dxgkCbCreateContextAllocation 时,在ContextAllocation 参数中传递指向此结构的指针。
InitContextResource.Destination
[in]描述目标上下文分配的结构。 此结构包含 SegmentId 成员和一个联合,该成员包含目标上下文分配(SegmentAddress)段的偏移量或指向目标 MDL 的指针(pMdl)。
InitContextResource.Destination.SegmentId
[in]目标上下文分配中的段的标识符;如果目标上下文分配由 目标 包含的联合的 pMdl 成员描述,则为零。
InitContextResource.Destination。(未命名的联合)
[in]一个联合,其中包含目标上下文分配(SegmentAddress)段的偏移量,或指向目标 MDL 的指针(pMdl)。
InitContextResource.Destination.SegmentAddress
[in]如果 目标 的 SegmentId 成员为非零,则目标段地址。 DirectX 图形内核子系统将段地址计算为段偏移量和段基址的总和:SegmentAddress = SegmentOffset + Segment.BaseAddr
。
InitContextResource.Destination.pMdl
[in]指向包含 MDL 结构的缓冲区的指针,该结构描述目标的系统内存页(如果 SegmentIdDestination 的成员为零)。
InitContextResource.Destination.VirtualAddress
[in]目标上下文分配的虚拟地址。 此地址在上下文分配的生存期内有效。
按照 DxgkCbCreateContextAl location 主题的“目标上下文分配”部分中的过程作,确保虚拟地址有效。
InitContextResource.Destination.GpuVirtualAddress
要初始化的上下文资源的 GPU 虚拟地址。
TransferVirtual
描述用于在内存中位置之间传输分配内容的作的 DXGK_BUILDPAGINGBUFFER_TRANSFERVIRTUAL 结构。
FillVirtual
描述用于使用模式填充分配的作的 DXGK_BUILDPAGINGBUFFER_FILLVIRTUAL 结构。
UpdatePageTable
描述用于更新页表的作的 DXGK_BUILDPAGINGBUFFER_UPDATEPAGETABLE 结构。
FlushTlb
描述用于刷新翻译外观缓冲区的作的 DXGK_BUILDPAGINGBUFFER_FLUSHTLB 结构。
CopyPageTableEntries
一个 DXGK_BUILDPAGINGBUFFER_COPYPAGETABLEENTRIES 结构,描述使用的作将页表条目从一个位置复制到另一个位置。
UpdateContextAllocation
描述用于更新上下文或设备分配内容的作的 DXGK_BUILDPAGINGBUFFER_UPDATECONTEXTALLOCATION 结构。
NotifyResidency
描述驻留分配更改作的 DXGK_BUILDPAGINGBUFFER_NOTIFYRESIDENCY 结构。
SignalMonitoredFence
[in]描述 GPU 指令的 DXGK_BUILDPAGINGBUFFER_SIGNALMONITOREDFENCE 结构,用于向 DMA 缓冲区发出分页监视围栏对象的信号。 从 Windows 10 版本 1703(WDDM 2.2)开始可用。
MapApertureSegment2
MapApertureSegment2.hDevice
[in]拥有 hAllocation 分配的设备句柄指定映射到 SegmentId 指定的光圈段。
对于共享分配,hDevice 设置为视频内存管理器确定为分配所有者的设备。
hDevice 为主分配 NULL。
MapApertureSegment2.hAllocation
[in]映射到 SegmentId 指定的光圈段的分配的驱动程序句柄。
当 DMA 缓冲区映射到光圈段时,hAllocationNULL,因为驱动程序未显式创建 DMA 缓冲区。
MapApertureSegment2.SegmentId
[in]要配置的光圈段的标识符。
MapApertureSegment2.OffsetInPages
[in]从段开头到要映射的第一页的偏移量(以页为单位)。
MapApertureSegment2.NumberOfPages
[in]在分配中映射的范围的大小(以页为单位)。
MapApertureSegment2.Adl
[in]一个具有地址描述符列表(ADL)的 DXGK_ADL 结构,用于描述分配内存的逻辑地址映射(pages)。 此 ADL 可以是连续的,也可以是页数组;驱动程序必须能够处理这两种情况。
MapApertureSegment2.Flags
[in]一个 DXGK_MAPAPERTUREFLAGS 结构,用于标识位字段标志中要执行的地图光圈段作的类型。
MapApertureSegment2.AdlOffset
[in]ADL 中的偏移量 到要为当前作映射的逻辑地址范围的开头(在系统内存页中指定的)。 如果 ADL 是连续的 ADL,则 ADL 的 BasePageNumber 成员是连续内存范围的起始地址。 否则,将 ADL 的 Pages 成员用于非连续内存。
MapApertureSegment2.CpuVisibleAddress
如果使用设置了 MapApertureCpuVisible 标志创建驱动程序分配,CpuVisibleAddress 是指向系统映射的内核模式虚拟地址的非 null 指针,用于 DXGK_OPERATION_MAP_APERTURE_SEGMENT2作。 只要分配映射到光圈段,此地址就有效,并且将在相应 DXGK_OPERATION_UNMAP_APERTURE_SEGMENT 调用相同的分配后立即释放。
如果未指定 MapApertureCpuVisible,DXGK_OPERATION_MAP_APERTURE_SEGMENT2作的 CpuVisibleAddress 为 NULL。
NotifyFenceResidency
MmapMmu
UnmapMmu
NotifyResidency2
NotifyAllocation
Reserved
此成员是保留的,不应使用。
Reserved.Reserved[64]
此成员是保留的,不应使用。
hSystemContext
[in]分页作的系统上下文的句柄。
DmaBufferGpuVirtualAddress
一种 D3DGPU_VIRTUAL_ADDRESS 数据类型,指示对 DMA 缓冲区进行分页的虚拟地址。 如果物理地址为零,则 DMA 缓冲区未正确分页。
DmaBufferWriteOffset
当前作偏移量(以字节为单位)从 DMA 缓冲区的开头。
言论
MDL 在 Windows 驱动程序模型(WDM) 文档中定义。
WDDM 同步类:
- BuildPagingBuffer 提交类型的第一级 GPU 计划程序类。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows Vista 开始支持。 |
标头 | d3dkmddi.h (包括 D3dkmddi.h) |
另请参阅
DXGKARGCB_CREATECONTEXTALLOCATION
DXGK_BUILDPAGINGBUFFER_COPYPAGETABLEENTRIES
DXGK_BUILDPAGINGBUFFER_FILLVIRTUAL
DXGK_BUILDPAGINGBUFFER_FLUSHTLB
DXGK_BUILDPAGINGBUFFER_NOTIFYRESIDENCY
DXGK_BUILDPAGINGBUFFER_TRANSFERVIRTUAL
DXGK_BUILDPAGINGBUFFER_UPDATECONTEXTALLOCATION
DXGK_BUILDPAGINGBUFFER_UPDATEPAGETABLE
[mmGetMdlPfnArray](/windows-hardware/drivers/kernel/mm-bad-pointer#mmgetmdlpfnarray