Función PoCallDriver (ntifs.h)

La rutina PoCallDriver pasa un IRP de energía al siguiente controlador inferior de la pila de dispositivos. (Solo Windows Server 2003, Windows XP y Windows 2000).

Sintaxis

NTSTATUS PoCallDriver(
  [in]      PDEVICE_OBJECT        DeviceObject,
  [in, out] __drv_aliasesMem PIRP Irp
);

Parámetros

[in] DeviceObject

Puntero al controlador creado DEVICE_OBJECT al que se enrutará el IRP.

[in, out] Irp

Puntero a un IRP.

Valor devuelto

PoCallDriver devuelve STATUS_SUCCESS para indicar que se ha realizado correctamente. Devuelve STATUS_PENDING si ha puesto en cola el IRP.

Comentarios

A partir de Windows Vista, los controladores deben llamar a IoCallDriver, no PoCallDriver para pasar un IRP de energía al siguiente controlador inferior. Sin embargo, en Windows Server 2003, Windows XP y Windows 2000, los controladores deben llamar a PoCallDriver, no IoCallDriver para pasar un IRP de energía al controlador siguiente inferior. En Windows Server 2003, Windows XP, un windows 2000, los controladores también deben llamar a PoStartNextPowerIrp antes de llamar a PoCallDriver.

Un controlador que requiera un nuevo IRP debe llamar a PoRequestPowerIrp. Un controlador no debe asignar su propio IRP de energía.

Al pasar un IRP de energía al controlador inferior siguiente, el autor de la llamada debe usar IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext para establecer la ubicación de la pila IRP y, a continuación, llamar a PoCallDriver. Use IoCopyCurrentIrpStackLocationToNext si el procesamiento del IRP requiere establecer una rutina de IoCompletion o IoSkipCurrentStackLocation si no se requiere ninguna rutina de IoCompletion .

Cuando se enciende un dispositivo, sus controladores deben establecer rutinas de IoCompletion para realizar tareas de inicio (inicializando el dispositivo, restaurando el contexto, etc.) después de que el controlador de bus haya establecido el dispositivo en estado de trabajo. Establezca rutinas de IoCompletion antes de llamar a PoCallDriver.

Cuando un dispositivo está apagando, sus controladores deben realizar las tareas de apagado necesarias antes de pasar el IRP al siguiente controlador inferior. Una vez que el IRP haya llegado al controlador del autobús, el dispositivo se apagará y sus controladores ya no tendrán acceso a él. En Windows Server 2003, Windows XP y Windows 2000, una rutina de IoCompletion asociada a un IRP de apagado solo es necesaria para llamar a PoStartNextPowerIrp.

Solo un IRP de entrada puede estar activo en el sistema a la vez. Al pasar un IRP de encendido para un dispositivo que requiere corriente de pincel (es decir, la marca de DO_POWER_INRUSH se establece en el objeto de dispositivo), PoCallDriver comprueba si ya hay otro IRP enrush activo. Si es así, PoCallDriver pone en cola el IRP actual para controlar una vez completado el IRP anterior y, a continuación, devuelve STATUS_PENDING. Para obtener más información sobre los IRP de inrush, vea Establecer marcas de objeto de dispositivo para la administración de energía.

Si una solicitud de IRP_MN_SET_POWER o IRP_MN_QUERY_POWER ya está activa para DeviceObject, PoCallDriver pone en cola este IRP y devuelve STATUS_PENDING.

En los sistemas Windows 2000 y versiones posteriores, los controladores paginables (la marca DO_POWER_PAGABLE se establece en el objeto de dispositivo) deben llamar a PoCallDriver en IRQL = PASSIVE_LEVEL. Los controladores que no se pueden paginar (DO_POWER_PAGABLE no están establecidos en el objeto de dispositivo) o que requieren corriente de pincel (DO_POWER_INRUSH está establecido en el objeto de dispositivo) pueden llamar a PoCallDriver en IRQL = PASSIVE_LEVEL o DISPATCH_LEVEL.

En Windows 98/Me, todos los controladores llaman a PoCallDriver en IRQL = PASSIVE_LEVEL.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000.
Plataforma de destino Universal
Encabezado ntifs.h (incluye Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL vea la sección Comentarios.
Reglas de cumplimiento de DDI CompleteRequestStatusCheck(wdm), CompletionRoutineRegistered(wdm), DeleteDevice(wdm), ForwardedAtBadIrql(wdm), ForwardedAtBadIrqlAllocate(wdm), ForwardedAtBadIrqlFsdAsync(wdm), ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDIs(storport), IoAllocateForward(wdm), IoAllocateIrpSignalEventInCompletionTimeout(wdm), IoBuildDeviceControlWait(wdm), IoBuildDeviceControlWaitTimeout(wdm), IoBuildFsdForward(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), IoSetCompletionRoutineExCheck(wdm), IrpProcessingComplete(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm) , MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest(wdm), PendedCompletedRequest2(wdm), PendedCompletedRequest3(wdm), PendedCompletedRequestEx(wdm), PnpIrpCompletion(wdm), PowerDownFail(wdm), PowerUpFail(wdm), RemoveLockForward(wdm), RemoveLockForward2(wdm), RemoveLockForwardDeviceControl(wdm), RemoveLockForwardDeviceControl2(wdm), RemoveLockForwardDeviceControlInternal(wdm), RemoveLockForwardDeviceControlInternal2(wdm), RemoveLockForwardRead(wdm), RemoveLockForwardRead2(wdm), RemoveLockForwardWrite(wdm), RemoveLockForwardWrite2(wdm), RemoveLockMnRemove2(wdm), RemoveLockMnSurpriseRemove(wdm), RemoveLockQueryMnRemove(wdm), TargetRelationNeedsRef(wdm), WmiForward(wdm)

Consulte también

IRP

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IoCallDriver

IoCompletion

IoCopyCurrentIrpStackLocationToNext

IoSkipCurrentIrpStackLocation

PoRequestPowerIrp

PoStartNextPowerIrp