Función FltQueueDeferredIoWorkItem (fltkernel.h)

La rutina FltQueueDeferredIoWorkItem publica una operación de E/S basada en IRP en una cola de trabajo.

Sintaxis

NTSTATUS FLTAPI FltQueueDeferredIoWorkItem(
  [in] PFLT_DEFERRED_IO_WORKITEM         FltWorkItem,
  [in] PFLT_CALLBACK_DATA                Data,
  [in] PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine,
  [in] WORK_QUEUE_TYPE                   QueueType,
  [in] PVOID                             Context
);

Parámetros

[in] FltWorkItem

Puntero al elemento de trabajo que se va a agregar a la cola de trabajo. El elemento de trabajo debe haberse asignado llamando a FltAllocateDeferredIoWorkItem.

[in] Data

Puntero a la estructura FLT_CALLBACK_DATA para la operación de E/S. La operación 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 .

[in] WorkerRoutine

Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada. Esta rutina se declara de la siguiente manera:

typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
    _In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
    _In_ PFLT_CALLBACK_DATA CallbackData,
    _In_opt_ PVOID Context
    );

donde:

  • FltWorkItem es un puntero opaco a una estructura de elementos de trabajo diferida.
  • CallbackData es un puntero a la estructura de datos de devolución de llamada para la operación de E/S.
  • Context es un puntero de información de contexto opcional que se pasó como parámetro Context de FltQueueDeferredIoWorkItem.

[in] QueueType

Especifica la cola en la que se va a insertar el elemento de trabajo al que apunta FltWorkItem . QueueType puede ser uno de los valores siguientes.

Valor Significado
CriticalWorkQueue Inserte el elemento de trabajo en la cola desde la que un subproceso del sistema con un atributo de prioridad en tiempo real procesa el elemento de trabajo.
DelayedWorkQueue Inserte el elemento de trabajo en la cola desde la que un subproceso del sistema con un atributo de prioridad variable procesa el elemento de trabajo.

El valor QueueTypeHyperCriticalWorkQueue está reservado para uso del sistema.

[in] Context

Puntero a la información de contexto definida por el autor de la llamada que se va a pasar como parámetro Context de la rutina de devolución de llamada especificada en el parámetro WorkerRoutine .

Valor devuelto

La rutina FltQueueDeferredIoWorkItem devuelve STATUS_SUCCESS o un valor NTSTATUS adecuado, como uno de los siguientes:

Código devuelto Descripción
STATUS_FLT_DELETING_OBJECT La instancia de destino de la operación de E/S (Data-Iopb-TargetInstance>>) se está desactivando. Se trata de un código de error.
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION La operación de E/S no se puede publicar de forma segura en un subproceso de trabajo. Consulte los comentarios por los posibles motivos por los que se devuelve este código de error.

Comentarios

La rutina FltQueueDeferredIoWorkItem publica una operación de E/S en una cola de trabajo del sistema. Se llama a la rutina de devolución de llamada WorkerRoutine especificada en el contexto de un subproceso del sistema, en IRQL PASSIVE_LEVEL.

La operación 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 .

FltQueueDeferredIoWorkItem devuelve STATUS_FLT_NOT_SAFE_TO_POST_OPERATION cuando la operación de E/S no se puede publicar de forma segura en un subproceso de trabajo. Entre las posibles razones se incluyen las siguientes:

  • FltQueueDeferredIoWorkItem no puede publicar una operación de E/S de paginación en un subproceso de trabajo.

  • FltQueueDeferredIoWorkItem no puede publicar una operación de E/S en un subproceso de trabajo si el campo TopLevelIrp del subproceso actual no es NULL, ya que la recursividad del sistema de archivos resultante podría provocar interbloqueos o desbordamientos de pila. Para más información, consulte IoGetTopLevelIrp.

Un controlador de minifiltro puede usar FltQueueDeferredIoWorkItem en una rutina de devolución de llamada de preoperación (PFLT_PRE_OPERATION_CALLBACK) como se indica a continuación:

  1. La devolución de llamada de preoperación llama a FltAllocateDeferredIoWorkItem para asignar el elemento de trabajo.

  2. La devolución de llamada de preoperación llama a FltQueueDeferredIoWorkItem para publicar la operación en la cola de trabajo.

  3. La devolución de llamada de preoperación devuelve FLT_PREOP_PENDING.

  4. Después de procesar la operación de E/S, la rutina de trabajo llama a FltCompletePendedPreOperation para devolver la operación de E/S al Administrador de filtros.

  5. La rutina de trabajo llama a FltFreeDeferredIoWorkItem para liberar el elemento de trabajo.

Un controlador de minifiltro puede usar FltQueueDeferredIoWorkItem en una rutina de devolución de llamada posterior a la operación (PFLT_POST_OPERATION_CALLBACK) como se indica a continuación:

  1. La devolución de llamada posterior a la operación llama a FltAllocateDeferredIoWorkItem para asignar el elemento de trabajo.

  2. La devolución de llamada posterior a la operación llama a FltQueueDeferredIoWorkItem para publicar la operación en la cola de trabajo.

  3. La devolución de llamada posterior a la operación devuelve FLT_POSTOP_MORE_PROCESSING_REQUIRED.

  4. Después de procesar la operación de E/S, la rutina de trabajo llama a FltCompletePendedPostOperation para devolver la operación de E/S al Administrador de filtros.

  5. La rutina de trabajo llama a FltFreeDeferredIoWorkItem para liberar el elemento de trabajo.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000
Plataforma de destino Universal
Encabezado fltkernel.h (incluya Fltkernel.h)
Library Fltmgr.lib
Archivo DLL Fltmgr.sys
IRQL <= DISPATCH_LEVEL

Consulte también

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK