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 代码之一。
返回代码 | 说明 |
---|---|
|
操作已成功完成。 |
|
请求处于挂起状态,将在 LAM 生成操作完成时调用 RequestCompletion 参数中指定的 函数 (NDK_FN_REQUEST_COMPLETION) 。 |
|
从起始虚拟地址到 Length 参数中指定的字节数的 MDL 链部分并不表示几乎连续的内存区域。 |
|
由于资源不足,请求失败。
重要 请求可能会内联失败,也可能会以异步方式失败,并显示此状态代码。
|
|
*pLAMSize 参数指示的缓冲区大小太小,无法容纳 LAM。 在这种情况下, *pLAMSize 的值将更新为所需的缓冲区大小。 |
|
出现了错误。 |
注解
从起始虚拟地址到 Length 参数中指定的字节数的 MDL 链部分必须表示几乎连续的内存区域。 否则,NDK 提供程序必须使请求失败。 NDK 使用者有责任确保 MDL 链被锁定。 也就是说,MDL 更改的页固定在物理内存中。
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 |