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
提供程序的上下文值,用于传递回 NdkRequestCompletion 回调函数,该函数是在 RequestCompletion 参数中指定的。
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 宏返回的虚拟地址值视为要映射的内存区域的开头的索引。 提供程序不得将虚拟地址值用作读取或写入缓冲区内容的有效虚拟地址。
如果提供程序在处理 NdkBuildLam 请求时出错,则提供程序必须在完成请求失败之前释放其内部生成的任何部分映射。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | NDIS 6.30 及更高版本不支持。 |
支持的最低服务器 | Windows Server 2012 |
目标平台 | 窗户 |
标头 | ndkpi.h (包括 Ndkpi.h) |
IRQL | <=DISPATCH_LEVEL |