mmLockPagableDataSection 函式 (wdm.h)
MmLockPagableDataSection 例程會將驅動程序數據的整個區段鎖定到系統空間。
語法
PVOID MmLockPagableDataSection(
[in] PVOID AddressWithinSection
);
參數
[in] AddressWithinSection
指定可分頁區段中一個項目數據的符號位址。
傳回值
MmLockPagableDataSection 會傳回識別區段的不透明值。 此值後續必須傳遞至 MmLockPagableSectionByHandle 或 mmUnlockPagableImageSection。
備註
驅動程式可以使用此例程 MmLockPagableSectionByHandle 和 MmUnlockPagableImageSection ,使其私人數據通常可分頁鎖定在記憶體中。
如果:
數據通常會在 <= APC_LEVEL存取,但可能需要在較短的 IRQL 層級存取。
驅動程式不常使用數據且可預測的數據。
例如,混合器裝置的驅動程式會使用可分頁數據區段。 由於驅動程式使用足夠的數據來建立值得建立可分頁數據區段,且驅動程式知道何時需要數據,因此驅動程式會使用 MmLockPagableDataSection、 MmLockPagableSectionByHandle 和 MmUnlockPagableImageSection ,在需要時將數據區段帶入系統空間,並在需要時將其分頁。
對 MmLockPagableDataSection 的單一呼叫會使包含參考數據的整個區段鎖定在系統空間中。
鎖定區段是昂貴的作業。 如果驅動程式在多個位置鎖定可分頁數據區段,請使用 MmLockPagableDataSection 作為第一個要求。 呼叫 MmLockPagableSectionByHandle 來提出後續的鎖定要求,並傳遞 MmLockPagableDataSection 傳回的句柄。 依句柄鎖定可大幅改善驅動程式效能。 鎖定的區段會藉由呼叫 MmUnlockPagableImageSection 來解除鎖定。
記憶體管理員會在 區段上維護參考計數。 [可分頁數據] 區段只能在參考計數為零時分頁。 每個鎖定要求都會遞增計數;每個解除鎖定要求都會遞減計數。 驅動程式必須鎖定區段的次數來解除鎖定區段,以確保不需要區段時,這類區段可供分頁。 不論計數為何,句柄一律有效。 如果句柄上的計數為零,而且呼叫 MmLockPagableSectionByHandle,則計數會設定為一,如果區段已分頁,則會分頁。
可分頁數據區段中的數據會以編譯程式指示詞標示。 若要建立可分頁的數據區段,請在數據模組開頭使用 #pragma data_seg (“PAGE”) ,並在模組結尾 #pragma data_seg () 。 關鍵詞 PAGE 區分大小寫,也就是 PAGE 必須大寫。
請注意,也有 #pragma data_seg (“INIT”) ,可用來在系統初始化之後捨棄數據。 除了使用 INIT 而非 PAGE 之外,語法相同。 不過,結果不是;使用 PAGE 指示詞會使數據區段可分頁。 使用 INIT 指示詞時,當驅動程式從其驅動程式輸入例程傳回或驅動程式有重新初始化例程時,就會立即捨棄 區段中的數據。
如需分頁數據的詳細資訊,請參閱 讓驅動程式可分頁。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平台 | Universal |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIS (storport) 、 IrqlMmApcLte (wdm) |