NDK_FN_BUILD_LAM回调函数 (ndkpi.h)

NdkBuildLamNDK_FN_BUILD_LAM) 函数从虚拟连续内存区域的 NDK 提供程序获取适配器逻辑地址映射 (LAM)。

语法

NDK_FN_BUILD_LAM NdkFnBuildLam;

NTSTATUS NdkFnBuildLam(
  [in]           NDK_ADAPTER *pNdkAdapter,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext,
                 NDK_LOGICAL_ADDRESS_MAPPING *pNdkLAM,
                 ULONG *pLAMSize,
  [out]          ULONG *pFBO
)
{...}

参数

[in] pNdkAdapter

指向 NDK 适配器对象的指针(NDK_ADAPTER)。

[in] Mdl

内存描述符列表(MDL)或 MDL 链。 从起始虚拟地址到 Length 参数中字节数的 MDL 链部分必须表示几乎连续的内存区域。

[in] Length

从第一个 MDL 的虚拟地址开始映射的字节数。 可以使用 MmGetMdlVirtualAddress 宏获取 MDL 虚拟地址。 长度 不能超过 MDL 链表示的总字节数。

[in] RequestCompletion

指向 NdkRequestCompletionNDK_FN_REQUEST_COMPLETION) 回调函数的指针。

[in, optional] RequestContext

提供程序的上下文值,用于传递回 NdkRequestCompletion 回调函数,该函数是在 RequestCompletion 参数中指定的。

pNdkLAM

指向包含适配器页数组的 NDK_LOGICAL_ADDRESS_MAPPING 结构的缓冲区的指针。 适配器页数组存储在 AdapterPageArray 成员中,AdapterPageCount 成员包含适配器页元素的数目。

pLAMSize

输入的 pNdkLAM 参数的缓冲区大小(以字节为单位)或为输出写入的实际字节数。

[out] pFBO

此位置返回第一个字节偏移量 (FBO) 值。 FBO 是第一个适配器页中的起始偏移量。

返回值

NdkBuildLam 函数返回以下 NTSTATUS 代码之一。

返回代码 描述
STATUS_SUCCESS
作已成功完成。
STATUS_PENDING
请求挂起,当 LAM 生成作完成时,将在 RequestCompletion 参数(NDK_FN_REQUEST_COMPLETION)中指定的函数调用。
STATUS_INVALID_PARAMETER
从起始虚拟地址到 Length 参数中指定的字节数的 MDL 链部分并不表示几乎连续的内存区域。
STATUS_INSUFFICIENT_RESOURCES
请求由于资源不足而失败。
重要 请求可以内联失败,以及使用此状态代码异步失败。
 
STATUS_BUFFER_TOO_SMALL
*pLAMSize 参数指示的缓冲区大小太小,无法容纳 LAM。 在这种情况下,*pLAMSize 的值将更新为所需的缓冲区大小。
其他状态代码
发生错误。

言论

从起始虚拟地址到 Length 参数中指定的字节数的 MDL 链部分必须表示几乎连续的内存区域。 否则,NDK 提供程序必须失败请求。 NDK 使用者有责任确保 MDL 链已锁定。 也就是说,MDL 更改的页面固定在物理内存中。

重要 NDK 使用者在等待完成 NdkBuildLam 时不得使用 MDL 链。
 
适配器使用逻辑地址访问物理内存。 这类似于使用虚拟地址访问物理内存的 CPU。 如果 NDK 使用者将直接使用物理内存页作为发送、接收、读取或写入请求中的本地数据缓冲区,则必须从 NDK 提供程序获取 NDK 适配器逻辑地址映射,并使用逻辑地址,而不是物理地址。 同样,NDK 使用者还必须在快速注册请求中使用逻辑地址。

NDK 使用者可以调用 NdkGetPrivilegedMemoryRegionTokenNDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) 函数,从 NDK 提供程序获取特权内存区域令牌。

NDK 提供程序返回的所有适配器页的长度必须为 PAGE_SIZE 字节,其中 PAGE_SIZE 是 wdm.h 中定义的主机平台支持的内存页大小。

提供程序必须将 MmGetMdlVirtualAddress 宏返回的虚拟地址值视为要映射的内存区域的开头的索引。 提供程序不得将虚拟地址值用作读取或写入缓冲区内容的有效虚拟地址。

如果提供程序在处理 NdkBuildLam 请求时出错,则提供程序必须在完成请求失败之前释放其内部生成的任何部分映射。

要求

要求 价值
最低支持的客户端 NDIS 6.30 及更高版本不支持。
支持的最低服务器 Windows Server 2012
目标平台 窗户
标头 ndkpi.h (包括 Ndkpi.h)
IRQL <=DISPATCH_LEVEL

另请参阅

mmGetMdlVirtualAddress

NDKPI 对象生存期要求

NDK_ADAPTER

NDK_ADAPTER_DISPATCH

NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN

NDK_FN_RELEASE_LAM

NDK_FN_REQUEST_COMPLETION

NDK_LOGICAL_ADDRESS_MAPPING