mmAdvanceMdl 函式 (wdm.h)

MmAdvanceMdl 例程會依指定的位元元組數目前進 MDL 虛擬記憶體範圍的開頭。

語法

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

參數

[in, out] Mdl

指定要前進的 MDL。

[in] NumberOfBytes

指定要往前移 MDL 開頭的位元元組數目。

傳回值

MmAdvanceMdl 會傳回NTSTATUS程式代碼。 可能的傳回值包括:

傳回碼 Description
STATUS_SUCCESS
例程已成功進階 MDL 的開頭。
STATUS_INVALID_PARAMETER_2
呼叫端嘗試將 MDL 的開頭前進到結尾。

備註

MmAdvanceMdl 只會前進虛擬記憶體位址範圍的開頭。 結束位址會維持不變,而且範圍的長度會據以壓縮。

當較低層級驅動程式只能部分完成讀取/寫入要求時,較高層級的驅動程式可以在低記憶體情況下使用 MmAdvanceMdl 。 較高層級的驅動程式可以使用 MmAdvanceMdl 來前進到已經讀取或寫入緩衝區的一部分,然後重新發出 IRP 來完成要求。 (驅動程序當然可以視需要重複此程式多次。)

如果 MmAdvanceMdl 前進到初始頁面,則會立即解除鎖定 MmAdvanceMdl 傳遞的任何頁面,也會調整對應 MDL 和使用者位址的系統虛擬位址。

使用 MmAdvanceMdl 可能會降低系統效能。 只有當下列所有條件都保留時,才必須使用它:

  • 較高層級驅動程式在自己的 I/O 處理中,只能在傳輸固定的數據量之後完成特定 I/O 要求,但較低層級驅動程式只會以較小的量傳輸數據。 (例如 SPX 或 NBT 通訊協定的網路傳輸驅動程式。針對大於一個乙太網路框架的訊息,每個通訊協定都支援可靠的訊息傳遞。傳輸驅動程式只能完成這類訊息的讀取要求,一旦從多個乙太網路框架重新組譯訊息。)
  • 較高層級的驅動程式已嘗試並無法配置新的 MDL,以從不完整的 I/O 要求傳輸數據片段。 (如果驅動程式成功配置新的 MDL,則必須使用該 MDL 和 IoBuildPartialMdl 來執行 I/O 要求,而不是 MmAdvanceMdl.)
  • 較高層級的驅動程序必須繼續進行,即使在記憶體不足的狀況下也是如此。
不符合這些條件的驅動程序必須改用 IoBuildPartialMdl 例程來完成任何部分成功的I/O作業。

規格需求

需求
最低支援的用戶端 可在 Windows XP 和更新版本的 Windows 中使用。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

另請參閱

IoBuildPartialMdl