Leer en inglés

Compartir a través de


Controlar un IRP de espera o reactivación en una función (FDO) o un controlador de filtro (Filter DO)

Cuando un controlador que crea un FDO o un filtro DO recibe una solicitud de IRP_MN_WAIT_WAKE para el PDO asociado, simplemente puede pasar el IRP al controlador inferior siguiente o realizar ciertas acciones antes de pasar el IRP.

Para dispositivos que admiten Wake-Up

Al recibir un IRP de espera o reactivación, una función o un controlador de filtro debe realizar los pasos siguientes:

  1. Llame a IoAcquireRemoveLock, pasando el IRP actual, para asegurarse de que el controlador no recibe una solicitud de IRP_MN_REMOVE_DEVICE PnP mientras controla el IRP de espera o reactivación.

    Si IoAcquireRemoveLock devuelve un estado de error, el controlador no debe seguir procesando el IRP. En su lugar, completa irP (IoCompleteRequest) y devuelve el estado de error.

  2. Inspeccione el valor en Irp-Parameters.WaitWake.PowerState> y compare el estado actual de energía del dispositivo con DeviceState[SystemWake] en la estructura de DEVICE_CAPABILITIES.

    Si el dispositivo admite reactivación, pero no desde el estado SystemWake especificado o no desde el estado actual de alimentación del dispositivo, el controlador debe producir un error en el IRP de la siguiente manera:

    • Establezca STATUS_INVALID_DEVICE_STATE en Irp-IoStatus.Status>.
    • Complete el IRP (IoCompleteRequest), especificando un aumento de prioridad de IO_NO_INCREMENT.
    • Devuelve el estado establecido en Irp-IoStatus.Status> de la rutina DispatchPower.
  3. De lo contrario, establezca una rutina de IoCompletion para irP mediante IoSetCompletionRoutine. La rutina IoCompletion debe realizar las tareas que el controlador necesita para devolver el dispositivo al estado de trabajo.

    También se llamará a la rutina IoCompletion si se cancela el IRP.

  4. Guarde cualquier información que el controlador necesite en su rutina de IoCompletion .

  5. Llame a IoCallDriver (en Windows 7 y Windows Vista) o PoCallDriver (en Windows Server 003, Windows XP y Windows 2000), para pasar el IRP de espera/reactivación al controlador inferior siguiente.

  6. Llame a IoReleaseRemoveLock para liberar el bloqueo adquirido anteriormente.

  7. Devuelve STATUS_PENDING de la rutina DispatchPower . El controlador no debe cambiar el valor de Irp-IoStatus.Status> mientras contiene el IRP.

Para dispositivos que no admiten Wake-Up

Si una función o un controlador de filtro recibe un IRP de espera o reactivación para un dispositivo que no admite la reactivación, el controlador debe producir un error en el IRP de la siguiente manera:

  1. Complete el IRP (IoCompleteRequest), especificando un aumento de prioridad de IO_NO_INCREMENT.

  2. Devuelve el estado establecido en Irp-IoStatus.Status> de la rutina DispatchPower.