Share via


Función FltLockUserBuffer (fltkernel.h)

La rutina FltLockUserBuffer bloquea el búfer de usuario para una operación de E/S determinada.

Sintaxis

NTSTATUS FLTAPI FltLockUserBuffer(
  [in] PFLT_CALLBACK_DATA CallbackData
);

Parámetros

[in] CallbackData

Puntero a la estructura de datos de devolución de llamada FLT_CALLBACK_DATA para la operación de E/S.

Valor devuelto

FltLockUserBuffer devuelve STATUS_SUCCESS si bloquea correctamente el búfer de usuario (o si el búfer ya estaba bloqueado por una llamada anterior a FltLockUserBuffer). De lo contrario, devuelve un valor NTSTATUS adecuado, como uno de los siguientes:

Código devuelto Descripción
STATUS_INSUFFICIENT_RESOURCES FltLockUserBuffer encontró un error de asignación de grupo. Se trata de un código de error.
STATUS_INVALID_PARAMETER Se encontró un parámetro no válido. Por ejemplo, la operación de E/S no tiene un parámetro MDL o la IRP_MJ_READ o IRP_MJ_WRITE operaciones de E/S tienen un código menor de IRP_MN_MDL. Se trata de un código de error.

Comentarios

Para obtener el mejor rendimiento, los controladores de filtro no deben llamar a FltLockUserBuffer a menos que sea absolutamente necesario. La ralentización del rendimiento no se debe al propio FltLockUserBuffer , sino a la penalización de rendimiento que incurre en la llamada posterior a MmGetSystemAddressForMdlSafe; consulte los comentarios posteriores para obtener más información.

Un controlador de minifiltro puede llamar a FltLockUserBuffer para bloquear el búfer de usuario para una de las siguientes operaciones de E/S:

  • 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 (excepto con IRP_MN_MDL)
  • IRP_MJ_SET_EA
  • IRP_MJ_SET_QUOTA
  • IRP_MJ_WRITE (excepto con IRP_MN_MDL)

FltLockUserBuffer determina el método de acceso adecuado (IoReadAccess, IoWriteAccess o IoModifyAccess) que se va a aplicar al búfer bloqueado en función del tipo de operación de E/S.

FltLockUserBuffer establece el miembro MdlAddress (o OutputMdlAddress) en la estructura de parámetros de datos de devolución de llamada (FLT_PARAMETERS) para que apunte al MDL de las páginas bloqueadas. Si no hay MDL, FltLockUserBuffer asigna uno. (Tenga en cuenta que FltMgr no puede generar una MDL antes de que lo haga el sistema de archivos, por lo que FltLockUserBuffer devuelve STATUS_INVALID_PARAMETER para IRP_MJ_READ o IRP_MJ_WRITE con IRP_MN_MDL).

Si la estructura de parámetros de datos de devolución de llamada contiene un búfer del sistema (Irp-AssociatedIrp.SystemBuffer>) y no contiene un búfer de usuario (Irp-UserBuffer>), FltLockUserBuffer bloquea el búfer del sistema. Si no hay ningún MDL para el búfer del sistema, FltLockUserBuffer asigna uno.

Si la estructura de parámetros de datos de devolución de llamada contiene un búfer de usuario, FltLockUserBuffersondea y bloquea el búfer de usuario.

El autor de la llamada se puede ejecutar en cualquier contexto de proceso. FltLockUserBuffer bloquea automáticamente el búfer en el contexto de proceso correcto.

Si se llama a FltLockUserBuffer desde una rutina de devolución de llamada de operación previa (PFLT_PRE_OPERATION_CALLBACK) y asigna un MDL, FltLockUserBuffer establece la marca FLTFL_CALLBACK_DATA_DIRTY en la estructura de datos de devolución de llamada (FLT_CALLBACK_DATA) para que el sistema de E/S libere la MDL cuando se complete la operación de E/S.

Para conservar las entradas de tabla de páginas del sistema (PTE), FltLockUserBuffer no asigna las páginas bloqueadas. Después de llamar a FltLockUserBuffer, el llamador debe llamar a MmGetSystemAddressForMdlSafe, pasando el miembro MdlAddress (o OutputMdlAddress) en la estructura de parámetros de datos de devolución de llamada como valor del parámetro Mdl , para obtener un búfer del sistema que representa esta memoria.

Cuando se libera la estructura de datos de devolución de llamada, el búfer bloqueado se desbloquea automáticamente y se libera MDL. El autor de la llamada nunca debe liberar la MDL; el sistema de E/S lo hace automáticamente.

Se puede llamar a FltLockUserBuffer para operaciones rápidas basadas en E/S e IRP.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado fltkernel.h (incluya Fltkernel.h)
Library FltMgr.lib
Archivo DLL Fltmgr.sys
IRQL <= APC_LEVEL

Consulte también

FLT_CALLBACK_DATA

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_SYSTEM_BUFFER

FLT_PARAMETERS

FLT_PARAMETERS para IRP_MJ_DEVICE_CONTROL y IRP_MJ_INTERNAL_DEVICE_CONTROL

FLT_PARAMETERS para IRP_MJ_DIRECTORY_CONTROL

FLT_PARAMETERS para IRP_MJ_FILE_SYSTEM_CONTROL

FLT_PARAMETERS para IRP_MJ_QUERY_EA

FLT_PARAMETERS para IRP_MJ_QUERY_QUOTA

FLT_PARAMETERS para IRP_MJ_QUERY_SECURITY

FLT_PARAMETERS para IRP_MJ_READ

FLT_PARAMETERS para IRP_MJ_SET_EA

FLT_PARAMETERS para IRP_MJ_SET_QUOTA

FLT_PARAMETERS para IRP_MJ_WRITE

FltDecodeParameters

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK