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:
La devolución de llamada de preoperación llama a FltAllocateDeferredIoWorkItem para asignar el elemento de trabajo.
La devolución de llamada de preoperación llama a FltQueueDeferredIoWorkItem para publicar la operación en la cola de trabajo.
La devolución de llamada de preoperación devuelve FLT_PREOP_PENDING.
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.
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:
La devolución de llamada posterior a la operación llama a FltAllocateDeferredIoWorkItem para asignar el elemento de trabajo.
La devolución de llamada posterior a la operación llama a FltQueueDeferredIoWorkItem para publicar la operación en la cola de trabajo.
La devolución de llamada posterior a la operación devuelve FLT_POSTOP_MORE_PROCESSING_REQUIRED.
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.
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 |