Función IoMarkIrpPending (wdm.h)
La rutina IoMarkIrpPending marca el IRP especificado, lo que indica que la rutina de envío de un controlador devolvió posteriormente STATUS_PENDING porque otras rutinas de controlador requieren un procesamiento adicional.
Sintaxis
void IoMarkIrpPending(
[in, out] PIRP Irp
);
Parámetros
[in, out] Irp
Puntero al IRP que se va a marcar como pendiente.
Valor devuelto
None
Observaciones
A menos que la rutina de distribución del controlador complete el IRP (llamando a IoCompleteRequest) o pase el IRP a controladores inferiores, debe llamar a IoMarkIrpPending con irP. De lo contrario, el administrador de E/S intenta completar el IRP en cuanto la rutina de distribución devuelve el control.
Después de llamar a IoMarkIrpPending, la rutina de envío debe devolver STATUS_PENDING, incluso si alguna rutina completa el IRP (mediante una llamada a IoCompleteRequest) antes de que la rutina de envío que llamó a IoMarkIrpPending devuelva.
Si un controlador pone en cola los IRP entrantes, debe llamar a IoMarkIrpPending antes de poner en cola cada IRP. De lo contrario, se podría quitar de la cola un IRP, completarse con otra rutina de controlador y liberarse por el sistema antes de que se produzca la llamada a IoMarkIrpPending , lo que provoca un bloqueo.
Si un controlador establece una rutina de IoCompletion para un IRP y, a continuación, pasa el IRP a un controlador inferior, la rutina IoCompletion debe comprobar la marca IRP-PendingReturned>. Si se establece la marca, la rutina IoCompletion debe llamar a IoMarkIrpPending con IRP. Las rutinas de IoCompletion no devuelven STATUS_PENDING. Para obtener más información, consulte Implementación de una rutina de IoCompletion.
Los controladores que crean el IRP y los envían a otra pila no deben llamar a IoMarkIrpPending en su rutina de finalización. Esta llamada dañará el encabezado del grupo de la siguiente asignación porque no hay ninguna ubicación de pila para esos controladores.
Un controlador que pasa el IRP y, a continuación, espera en un evento no debe marcar el IRP pendiente. En su lugar, su rutina ioCompletion debe indicar el evento y devolver STATUS_MORE_PROCESSING_REQUIRED.
Si el controlador llama a IoSkipCurrentIrpStackLocation, tenga cuidado de no modificar la estructura de IO_STACK_LOCATION de una manera que pueda afectar involuntariamente al controlador inferior o al comportamiento del sistema con respecto a ese controlador. En concreto, el controlador no debe modificar la unión de parámetros de IO_STACK_LOCATION estructura y no debe llamar a IoMarkIrpPending.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Cualquier nivel |
Reglas de cumplimiento de DDI | CompleteRequestStatusCheck(wdm), CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkInterlockedQueuedIrps(wdm), MarkQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm) |