Функция 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 при завершении операции ввода-вывода.

Чтобы сохранить записи таблицы системной страницы (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_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