Функция 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), применяемый к заблокированным буферам в зависимости от типа операции ввода-вывода.

FltLockUserBuffer задает элемент MdlAddress (или OutputMdlAddress) в структуре параметров данных обратного вызова (FLT_PARAMETERS), чтобы указать MDL для заблокированных страниц. Если MDL отсутствует, FltLockUserBuffer выделяет его. (Обратите внимание, что FltMgr не может создать MDL раньше, чем файловая система. Именно поэтому FltLockUserBuffer возвращает STATUS_INVALID_PARAMETER для IRP_MJ_READ или IRP_MJ_WRITE с IRP_MN_MDL.

Если структура параметров данных обратного вызова содержит системный буфер (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 после завершения операции ввода-вывода.

Для сохранения записей таблицы системных страниц FltLockUserBuffer не сопоставляет заблокированные страницы. После вызова FltLockUserBuffer вызывающий объект должен вызвать MmGetSystemAddressForMdlSafe, передав член MdlAddress (или OutputMdlAddress) в структуре параметров данных обратного вызова в качестве значения параметра Mdl , чтобы получить системный буфер, представляющий эту память.

При освобождении структуры данных обратного вызова заблокированный буфер автоматически разблокируется, а MDL освобождается. Вызывающий объект никогда не должен освобождать MDL; система ввода-вывода выполняет это автоматически.

FltLockUserBuffer можно вызывать для быстрых операций ввода-вывода и IRP.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

См. также раздел

FLT_CALLBACK_DATA

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_SYSTEM_BUFFER

FLT_PARAMETERS

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

FLT_PARAMETERS для IRP_MJ_WRITE

FltDecodeParameters

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK