Compartir a través de


Pendiente de una operación de E/S en una rutina de devolución de llamada de preoperación

Una rutina de devolución de llamada de preoperación del controlador minifiltro puede realizar una operación de E/S mediante la publicación de la operación en una cola de trabajo del sistema y la devolución de FLT_PREOP_PENDING. Si se devuelve este valor de estado, se indica que el controlador de minifiltro conserva el control de la operación de E/S hasta que llama a FltCompletePendedPreOperation para reanudar el procesamiento de la operación de E/S.

Un controlador de minifiltro de devolución de llamada de preoperación escribe una operación de E/S mediante los pasos siguientes:

  1. Publicando la operación de E/S en una cola de trabajo del sistema llamando a una rutina como FltQueueDeferredIoWorkItem.

  2. Devolver FLT_PREOP_PENDING.

Un controlador de minifiltro que debe incluir todas las operaciones de E/S entrantes (o la mayoría) no debe usar rutinas como FltQueueDeferredIoWorkItem para las operaciones en pend, ya que llamar a esta rutina puede hacer que las colas de trabajo del sistema se inunden. En su lugar, este tipo de controlador de minifiltro debe usar una cola de cancelación segura. Para obtener más información sobre el uso de colas seguras para cancelaciones, consulte FltCbdqInitialize.

Tenga en cuenta que la llamada a FltQueueDeferredIoWorkItem producirá un error si se cumple alguna de las condiciones siguientes:

  • La operación no es una operación de E/S basada en IRP.

  • La operación es una operación de E/S de paginación.

  • El campo TopLevelIrp del subproceso actual no es NULL. (Para obtener más información sobre cómo encontrar el valor de este campo, consulte IoGetTopLevelIrp).

  • La instancia de destino de la operación de E/S se está descomponiéndose.

Si la rutina de devolución de llamada de preoperación del controlador minifiltro devuelve FLT_PREOP_PENDING, debe devolver NULL en el parámetro de salida CompletionContext .

Un controlador de minifiltro solo puede devolver FLT_PREOP_PENDING para las operaciones de E/S basadas en IRP. Para determinar si una operación es una operación de E/S basada en IRP, use la macro FLT_IS_IRP_OPERATION .

La rutina de trabajo que quita y procesa la operación de E/S debe llamar a FltCompletePendedPreOperation para reanudar el procesamiento de la operación.