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 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport),IrqlMmApcLte(wdm) |