Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un controlador de minifiltro llama a fltCheckOplock para sincronizar la estructura de datos de devolución de llamada para una operación de E/S de archivos basada en IRP con el estado actual de bloqueo oportunista del archivo (oplock).
Sintaxis
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
Parámetros
[in] Oplock
Puntero oplock opaco para el archivo. Este puntero debe haberse inicializado mediante una llamada anterior a FltInitializeOplock.
[in] CallbackData
Puntero a la estructura de datos de devolución de llamada (FLT_CALLBACK_DATA) para la operación de E/S.
[in, optional] Context
Puntero a la información de contexto definida por el autor de la llamada que se va a pasar a las rutinas de devolución de llamada a las que WaitCompletionRoutine y PrePostCallbackDataRoutine apuntar. El Administrador de filtros trata esta información como opaca.
[in, optional] WaitCompletionRoutine
Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada. Si hay una interrupción de interbloqueo en curso, el Administrador de filtros llama a esta rutina cuando se completa la interrupción del interbloqueo. Este parámetro es opcional y puede ser NULL. Si es NULL, el autor de la llamada se pone en un estado de espera hasta que se complete la interrupción del bloqueo de operaciones.
Esta rutina se declara de la siguiente manera:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
donde:
CallbackData es un puntero a una estructura de FLT_CALLBACK_DATA para la operación de E/S.
Context es un puntero de información de contexto que se pasó en el parámetro Context a FltCheckOplock.
[in, optional] PrePostCallbackDataRoutine
Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada que se va a llamar si la operación de E/S se publica en una cola de trabajo. Este parámetro es opcional y puede ser NULL.
Esta rutina se declara de la siguiente manera:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
donde:
CallbackData es un puntero a una estructura de FLT_CALLBACK_DATA para la operación de E/S.
Context es un puntero de información de contexto que se pasó en el parámetro Context a FltCheckOplock.
Valor devuelto
fltCheckOplock devuelve uno de los siguientes códigos de FLT_PREOP_CALLBACK_STATUS:
| Código devuelto | Descripción |
|---|---|
| FLT_PREOP_COMPLETE | FltCheckOplock encontró un error de asignación de grupo o una llamada a la función FsRtlCheckOplock devolvió un error. FltCheckOplock establecerá el código de error en el miembro Status de la estructura IO_STATUS_BLOCK del miembro IoStatus de la estructura de datos de devolución de llamada FLT_CALLBACK_DATA . El parámetro CallbackData apunta a este FLT_CALLBACK_DATA. |
| FLT_PREOP_PENDING | Se inició una interrupción de interbloqueo, lo que provocó que el Administrador de filtros publicara la operación de E/S en una cola de trabajo. La operación de E/S se representa mediante los datos de devolución de llamada a los que apunta el parámetro callbackData . |
| FLT_PREOP_SUCCESS_NO_CALLBACK | La operación de E/S se realizó inmediatamente. Tenga en cuenta que si esta operación era una operación de creación que especificó FILE_COMPLETE_IF_OPLOCKED en el parámetro create-options, podría haber realmente un interbloqueo en curso aunque la operación se realizó inmediatamente. Para determinar si esta es la situación, el autor de la llamada debe comprobar el estado en el miembro Status de la estructura IO_STATUS_BLOCK del miembro IoStatus de la estructura de datos de devolución de llamada FLT_CALLBACK_DATA . |
Observaciones
Un controlador de minifiltro llama a FltCheckOplock para sincronizar una operación de E/S basada en IRP con el estado actual de interbloqueo de un archivo según las condiciones siguientes:
Si la operación de E/S hará que se interrumpa el interbloqueo, se inicia la interrupción del interbloqueo.
Si la operación de E/S no puede continuar hasta que se complete la interrupción del bloqueo de operación, FltCheckOplock devuelve FLT_PREOP_PENDING y llama a la rutina de devolución de llamada a la que apunta el parámetro PrePostCallbackDataRoutine .
Si un controlador de minifiltro usa bloqueos operativos, debe llamar a FltCheckOplock desde cualquier rutina de devolución de llamada (PFLT_PRE_OPERATION_CALLBACK) previa a la operación para las operaciones de E/S que pueden provocar interrupciones de bloqueo de operación. Esta regla se aplica a los siguientes tipos de operaciones de E/S, ya que estas operaciones pueden provocar interrupciones de interbloqueo:
- IRP_MJ_CLEANUP
- IRP_MJ_CREATE
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_READ
- IRP_MJ_SET_INFORMATION
- IRP_MJ_WRITE
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
La operación de E/S debe ser una operación de E/S basada en IRP. Para determinar si una estructura de datos de devolución de llamada determinada representa una operación de E/S basada en IRP, use la macro FLT_IS_IRP_OPERATION.
Los minifiltros no deben llamar a FltCheckOplock de nuevo dentro de la devolución de llamada especificada en WaitCompletionRoutine. Si lo hace, se puede producir una condición de interbloqueo si el paquete de interbloqueo llama a la devolución de llamada de finalización antes de FltCheckOplock devuelve.
Para obtener información detallada sobre los bloqueos oportunistas, consulte la documentación del SDK de Microsoft Windows.
Requisitos
| Requisito | Valor |
|---|---|
| de la plataforma de destino de | Universal |
| encabezado de | fltkernel.h (incluya Fltkernel.h) |
| irQL | <= APC_LEVEL |
Consulte también
FSCTL_OPBATCH_ACK_CLOSE_PENDING