Share via


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代碼。

傳回碼 Description
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 宏傳回的虛擬位址值視為要對應記憶體區域開頭的索引。 提供者不得使用虛擬位址值作為讀取或寫入緩衝區內容的有效虛擬位址。

如果提供者在處理 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