mmAdvanceMdl 函式 (wdm.h)
MmAdvanceMdl 例程會依指定的位元元組數目前進 MDL 虛擬記憶體範圍的開頭。
語法
NTSTATUS MmAdvanceMdl(
[in, out] PMDL Mdl,
[in] ULONG NumberOfBytes
);
參數
[in, out] Mdl
指定要前進的 MDL。
[in] NumberOfBytes
指定要往前移 MDL 開頭的位元元組數目。
傳回值
MmAdvanceMdl 會傳回NTSTATUS程式代碼。 可能的傳回值包括:
傳回碼 | Description |
---|---|
|
例程已成功進階 MDL 的開頭。 |
|
呼叫端嘗試將 MDL 的開頭前進到結尾。 |
備註
MmAdvanceMdl 只會前進虛擬記憶體位址範圍的開頭。 結束位址會維持不變,而且範圍的長度會據以壓縮。
當較低層級驅動程式只能部分完成讀取/寫入要求時,較高層級的驅動程式可以在低記憶體情況下使用 MmAdvanceMdl 。 較高層級的驅動程式可以使用 MmAdvanceMdl 來前進到已經讀取或寫入緩衝區的一部分,然後重新發出 IRP 來完成要求。 (驅動程序當然可以視需要重複此程式多次。)
如果 MmAdvanceMdl 前進到初始頁面,則會立即解除鎖定 MmAdvanceMdl 傳遞的任何頁面,也會調整對應 MDL 和使用者位址的系統虛擬位址。
使用 MmAdvanceMdl 可能會降低系統效能。 只有當下列所有條件都保留時,才必須使用它:
- 較高層級驅動程式在自己的 I/O 處理中,只能在傳輸固定的數據量之後完成特定 I/O 要求,但較低層級驅動程式只會以較小的量傳輸數據。 (例如 SPX 或 NBT 通訊協定的網路傳輸驅動程式。針對大於一個乙太網路框架的訊息,每個通訊協定都支援可靠的訊息傳遞。傳輸驅動程式只能完成這類訊息的讀取要求,一旦從多個乙太網路框架重新組譯訊息。)
- 較高層級的驅動程式已嘗試並無法配置新的 MDL,以從不完整的 I/O 要求傳輸數據片段。 (如果驅動程式成功配置新的 MDL,則必須使用該 MDL 和 IoBuildPartialMdl 來執行 I/O 要求,而不是 MmAdvanceMdl.)
- 較高層級的驅動程序必須繼續進行,即使在記憶體不足的狀況下也是如此。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 可在 Windows XP 和更新版本的 Windows 中使用。 |
目標平台 | Universal |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |