Funzione PoCallDriver (ntifs.h)

La routine PoCallDriver passa un IRP di alimentazione al driver inferiore successivo nello stack di dispositivi. (Solo Windows Server 2003, Windows XP e Windows 2000).

Sintassi

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

Parametri

[in] DeviceObject

Puntatore al DEVICE_OBJECT creato dal driver a cui deve essere instradato l'IRP.

[in, out] Irp

Puntatore a un IRP.

Valore restituito

PoCallDriver restituisce STATUS_SUCCESS per indicare l'esito positivo. Restituisce STATUS_PENDING se ha accodato l'IRP.

Commenti

A partire da Windows Vista, i driver devono chiamare IoCallDriver, non PoCallDriver per passare un IRP di alimentazione al driver inferiore successivo. Tuttavia, in Windows Server 2003, Windows XP e Windows 2000 i driver devono chiamare PoCallDriver, non IoCallDriver per passare un IRP di alimentazione al driver inferiore successivo. In Windows Server 2003, Windows XP, un Windows 2000, anche i driver devono chiamare PoStartNextPowerIrp prima di chiamare PoCallDriver.

Un driver che richiede un nuovo IRP deve chiamare PoRequestPowerIrp. Un driver non deve allocare il proprio IRP di alimentazione.

Quando si passa un IRP di alimentazione al driver inferiore successivo, il chiamante deve usare IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext per impostare il percorso dello stack IRP, quindi chiamare PoCallDriver. Usare IoCopyCurrentIrpStackLocationToNext se l'elaborazione di IRP richiede l'impostazione di una routine IoCompletion o IoSkipCurrentStackLocation se non è necessaria alcuna routine IoCompletion .

Quando un dispositivo è attivo, i driver devono impostare routine IoCompletion per eseguire attività di avvio (inizializzazione del dispositivo, ripristino del contesto e così via) dopo che il driver del bus ha impostato il dispositivo nello stato di lavoro. Impostare le routine IoCompletion prima di chiamare PoCallDriver.

Quando un dispositivo viene spento, i driver devono eseguire le attività di accensione necessarie prima di passare l'IRP al driver inferiore successivo. Dopo che l'IRP ha raggiunto il conducente dell'autobus, il dispositivo verrà spento e i suoi conducenti non avranno più accesso ad esso. In Windows Server 2003, Windows XP e Windows 2000 è necessaria una routine IoCompletion associata a un IRP di risparmio energia solo per chiamare PoStartNextPowerIrp.

Solo un IRP inrush può essere attivo nel sistema alla volta. Quando si passa un IRP di alimentazione per un dispositivo che richiede inrush corrente (in altre parole, il flag DO_POWER_INRUSH è impostato nell'oggetto dispositivo), PoCallDriver controlla se un altro IRP inrush è già attivo. In tal caso, PoCallDriver accoda l'IRP corrente per la gestione al termine dell'IRP precedente e quindi restituisce STATUS_PENDING. Per altre informazioni sui runtime di integrazione inrush, vedere Impostazione dei flag oggetto dispositivo per il risparmio energia.

Se una richiesta di IRP_MN_SET_POWER o IRP_MN_QUERY_POWER è già attiva per DeviceObject, PoCallDriver accoda questo IRP e restituisce STATUS_PENDING.

Nei sistemi Windows 2000 e versioni successive, i driver visualizzabili (il flag DO_POWER_PAGABLE è impostato nell'oggetto dispositivo) devono chiamare PoCallDriver in IRQL = PASSIVE_LEVEL. I driver che non possono essere distribuiti (DO_POWER_PAGABLE non sono impostati nell'oggetto dispositivo) o che richiedono inrush current (DO_POWER_INRUSH è impostato nell'oggetto dispositivo) possono chiamare PoCallDriver in IRQL = PASSIVE_LEVEL o DISPATCH_LEVEL.

In Windows 98/Me tutti i driver chiamano PoCallDriver in IRQL = PASSIVE_LEVEL.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000.
Piattaforma di destinazione Universale
Intestazione ntifs.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Vedere la sezione Osservazioni.
Regole di conformità DDI CompleteRequestStatusCheck(wdm), CompletionRoutineRegistered(wdm), DeleteDevice(wdm), ForwardedAtBadIrql(wdm), ForwardedAtBadIrqlAllocate(wdm), ForwardedAtBadIrqlFsdAsync(wdm), ForwardedAtBadIrqlSync(wdm), HwStorPortProhibitedDDDIs(storport), IoAllocateForward(wdm), IoAllocateIrpSignalEventInCompletionTimeout(wdm), IoBuildDeviceControlWait(wdm), IoBuildDeviceControlWaitTimeout(wdm), IoBuildFsdForward(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), IoSetCompletionRoutineExCheck(wdm), IrpProcessingComplete(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkingQueuedIrps(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)

Vedi anche

IRP

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IoCallDriver

IoCompletion

IoCopyCurrentIrpStackLocationToNext

IoSkipCurrentIrpStackLocation

PoRequestPowerIrp

PoStartNextPowerIrp