Функция 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_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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по