Función PoCallDriver (wdm.h)

La rutina PoCallDriver pasa un IRP de alimentación al controlador inferior siguiente de la pila del dispositivo. (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 va a 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 controlador inferior siguiente. Sin embargo, en Windows Server 2003, Windows XP y Windows 2000, los controladores deben llamar a PoCallDriver, no IoCallDriver para pasar un IRP de alimentación al controlador inferior siguiente. 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 alimentación.

Al pasar un IRP de alimentación 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 un dispositivo se enciende, 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 se apaga, 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 de autobús, el dispositivo se apagará y sus conductores ya no tendrán acceso a él. En Windows Server 2003, Windows XP y Windows 2000, solo se requiere una rutina de IoCompletion asociada a un IRP de apagado para llamar a PoStartNextPowerIrp.

Solo un IRP de entrada puede estar activo en el sistema a la vez. Cuando se pasa un IRP de encendido para un dispositivo que requiere corriente de pincel (es decir, la marca de DO_POWER_INRUSH está establecida en el objeto de dispositivo), PoCallDriver comprueba si otro IRP de entrada ya está activo. Si es así, PoCallDriver pone en cola el IRP actual para controlar después de que se complete el IRP anterior y, a continuación, devuelve STATUS_PENDING. Para obtener más información acerca de los IRP de entrada, consulte Configuración de 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 de 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 se establecen 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 Disponible a partir de Windows 2000.
Plataforma de destino Universal
Encabezado wdm.h (incluya 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