NDK_FN_BUILD_LAM回调函数 (ndkpi.h)

NdkBuildLam (NDK_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

指向 NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION) 回调函数的指针。

[in, optional] RequestContext

提供程序传递回 RequestCompletion 参数中指定的 NdkRequestCompletion 回调函数的上下文值。

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 更改的页固定在物理内存中。

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

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

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

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

如果提供程序在处理 NdkBuildLam 请求时出错,则提供程序必须释放它目前在内部生成的任何部分映射,然后才能在失败的情况下完成请求。

要求

要求
最低受支持的客户端 不支持,在 NDIS 6.30 及更高版本中受支持。
最低受支持的服务器 Windows Server 2012
目标平台 Windows
标头 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