共用方式為


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