Функция FltLockUserBuffer (fltkernel.h)
FltLockUserBuffer подпрограмма блокирует буфер пользователя для определенной операции ввода-вывода.
Синтаксис
NTSTATUS FLTAPI FltLockUserBuffer(
[in] PFLT_CALLBACK_DATA CallbackData
);
Параметры
[in] CallbackData
Указатель на структуру данных обратного вызова FLT_CALLBACK_DATA для операции ввода-вывода.
Возвращаемое значение
FltLockUserBuffer возвращает STATUS_SUCCESS, если он успешно блокирует буфер пользователя (или если буфер уже заблокирован предыдущим вызовом FltLockUserBuffer.) В противном случае возвращается соответствующее значение NTSTATUS, например одно из следующих:
Возвращаемый код | Описание |
---|---|
STATUS_INSUFFICIENT_RESOURCES | FltLockUserBuffer возникла ошибка выделения пула. Это код ошибки. |
STATUS_INVALID_PARAMETER | Обнаружен недопустимый параметр. Например, операция ввода-вывода не имеет параметра MDL, а операции ввода-вывода IRP_MJ_READ или IRP_MJ_WRITE имеют дополнительный код IRP_MN_MDL. Это код ошибки. |
Замечания
Для повышения производительности драйверы фильтров не должны вызывать FltLockUserBuffer, если это не обязательно. Замедление производительности не из-за FltLockUserBuffer сам, а не из-за штрафа производительности, вызванного последующим вызовом MmGetSystemAddressForMdlSafe; Дополнительные сведения см. в последующих комментариях.
Драйвер минифильтра может вызывать FltLockUserBuffer, чтобы заблокировать буфер пользователя для одной из следующих операций ввода-вывода:
- IRP_MJ_DEVICE_CONTROL
- IRP_MJ_DIRECTORY_CONTROL
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_INTERNAL_DEVICE_CONTROL
- IRP_MJ_QUERY_EA
- IRP_MJ_QUERY_QUOTA
- IRP_MJ_QUERY_SECURITY
- IRP_MJ_READ (за исключением IRP_MN_MDL)
- IRP_MJ_SET_EA
- IRP_MJ_SET_QUOTA
- IRP_MJ_WRITE (за исключением IRP_MN_MDL)
FltLockUserBuffer определяет соответствующий метод доступа (IoReadAccess, IoWriteAccess или IoModifyAccess) для применения к заблокированным буферу на основе типа операции ввода-вывода.
Если структура параметра данных обратного вызова содержит системный буфер (Irp->AssociatedIrp.SystemBuffer) и не содержит буфер пользователя (Irp->UserBuffer), FltLockUserBuffer блокирует системный буфер. Если для системного буфера нет MDL, FltLockUserBuffer выделяет один.
Если структура параметра обратного вызова содержит буфер пользователя, FltLockUserBufferпробы и блокировки буфера пользователя.
Вызывающий объект может выполняться в любом контексте процесса. FltLockUserBuffer автоматически блокирует буфер в правильном контексте процесса.
Если FltLockUserBuffer вызывается из процедуры обратного вызова предварительной операции (PFLT_PRE_OPERATION_CALLBACK) и выделяет MDL, FltLockUserBuffer задает флаг FLTFL_CALLBACK_DATA_DIRTY в структуре данных обратного вызова (FLT_CALLBACK_DATA), чтобы система ввода-вывода освобождает MDL при завершении операции ввода-вывода.
Чтобы сохранить записи таблицы системной страницы (PTEs), FltLockUserBuffer не сопоставляет заблокированные страницы. После вызова FltLockUserBufferвызывающий объект должен вызывать элемент MmGetSystemAddressForMdlSafe, передав MdlAddress (или OutputMdlAddress) в структуре параметров обратного вызова в качестве значения параметра Mdl, для получения системного буфера, представляющего эту память.
При освобождении структуры данных обратного вызова заблокированный буфер автоматически разблокируется и MDL освобождается. Вызывающий объект никогда не должен освободить MDL; Система ввода-вывода выполняет это автоматически.
fltLockUserBuffer можно вызывать для быстрых операций ввода-вывода и IRP.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | fltkernel.h (include Fltkernel.h) |
библиотеки |
FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |
См. также
FLT_PARAMETERS для IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL
FLT_PARAMETERS для IRP_MJ_DIRECTORY_CONTROL
FLT_PARAMETERS для IRP_MJ_FILE_SYSTEM_CONTROL
FLT_PARAMETERS для IRP_MJ_QUERY_EA
FLT_PARAMETERS для IRP_MJ_QUERY_QUOTA
FLT_PARAMETERS для IRP_MJ_QUERY_SECURITY
FLT_PARAMETERS для IRP_MJ_READ
FLT_PARAMETERS для IRP_MJ_SET_EA
FLT_PARAMETERS для IRP_MJ_SET_QUOTA