共用方式為


MmAdvanceMdl 函式 (wdm.h)

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

語法

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

參數

[in, out] Mdl

指定要前進的 MDL。

[in] NumberOfBytes

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

傳回值

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

傳回碼 描述
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。
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

另請參閱

IoBuildPartialMdl