Функция 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 (include Wdm.h, Ntddk.h, Ntifs.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
правил соответствия DDI | HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm) |