Функция MmLockPagableSectionByHandle (ntddk.h)
Подпрограмма MmLockPagableSectionByHandle блокирует страничный код или раздел данных в системной памяти путем увеличения количества ссылок дескриптора в раздел.
Синтаксис
void MmLockPagableSectionByHandle(
[in] PVOID ImageSectionHandle
);
Параметры
[in] ImageSectionHandle
Дескриптор для страничного кода или раздела данных. Вызывающий объект получил этот дескриптор из предыдущего вызова процедуры MmLockPagableCodeSection или MmLockPagableDataSection .
Возвращаемое значение
None
Remarks
Драйвер изначально вызывает MmLockPagableCodeSection или MmLockPagableDataSection , чтобы получить дескриптор для страничного кода или раздела данных. После этого драйвер может вызвать MmLockPagableSectionByHandle и MmUnlockPagableImageSection для увеличения и уменьшения количества ссылок в дескрипторе.
Вызов MmLockPagableCodeSection или MmLockPagableDataSection блокирует страничный раздел в системной памяти, возвращает дескриптор разделу и инициализирует количество ссылок на дескриптор до единицы. MmLockPagableSectionByHandle увеличивает число ссылок на единицу, а MmUnlockPagableImageSection уменьшает количество ссылок на единицу.
Если число ссылок на дескриптор не равно нулю, раздел, доступный для страницы, блокируется. Если число ссылок равно нулю, раздел разблокируется.
Дескриптор раздела с возможностью страницы остается действительным до тех пор, пока драйвер остается загруженным в памяти. Драйвер может использовать один и тот же дескриптор для многократной блокировки и разблокировки раздела. То есть драйвер может повторно использовать дескриптор, число ссылок которого равно нулю. MmLockPagableSectionByHandle проверяет, находится ли упоминаемый раздел в адресном пространстве вызывающего объекта, и, если это так, просто увеличивает количество ссылок в разделе. Если раздел не является резидентным, mmLockPagableSectionByHandle страницы в разделе блокирует его в системном пространстве и устанавливает для счетчика ссылок значение 1.
Чтобы избежать утечки системной памяти, количество ссылок на дескрипторе должно быть равно нулю при выгрузке драйвера из памяти. В противном случае раздел, доступный для страницы, останется заблокированным в системной памяти после выгрузки драйвера.
Если драйвер готовится к выгрузке, а количество ссылок на дескрипторе не равно нулю, драйвер должен вызвать MmUnlockPagableImageSection для уменьшения счетчика до нуля перед выгрузкой.
Драйвер не может вызвать MmLockPagableSectionByHandle для блокировки пользовательских буферов, передаваемых в IRP. Вместо этого используйте MmProbeAndLockPages .
Дополнительные сведения о коде и данных подкачки см. в статье Создание драйверов для страничных страниц.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно начиная с Windows 2000. |
Целевая платформа | Универсальное |
Верхняя часть | ntddk.h (включая Ntddk.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm) |