Funzione PoCallDriver (wdm.h)
La routine PoCallDriver passa un'alimentazione IRP 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 alla DEVICE_OBJECT creata dal driver a cui deve essere instradato l'IRP.
[in, out] Irp
Puntatore a un'istanza di 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'alimentazione IRP al driver inferiore successivo. Tuttavia, in Windows Server 2003, Windows XP e Windows 2000, i driver devono chiamare PoCallDriver, non IoCallDriver per passare un'alimentazione IRP al driver inferiore successivo. In Windows Server 2003, Windows XP, un Windows 2000, i driver devono chiamare anche PoStartNextPowerIrp prima di chiamare PoCallDriver.
Un driver che richiede un nuovo IRP deve chiamare PoRequestPowerIrp. Un driver non deve allocare la propria alimentazione IRP.
Quando si passa un'IRP di alimentazione al driver inferiore successivo, il chiamante deve usare IoSkipCurrentIrpStackLocation o IoCopyCurrentIrpStackLocationToNext per impostare la posizione dello stack IRP, quindi chiamare PoCallDriver. Usare IoCopyCurrentIrpStackLocationToNext se l'elaborazione dell'IRP richiede l'impostazione di una routine IoCompletion o IoSkipCurrentStackLocation se non è necessaria alcuna routine IoCompletion.
Quando un dispositivo è in alimentazione, i driver devono impostare le 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 è inattivo, i driver devono eseguire attività di alimentazione necessarie prima di passare l'IRP al driver inferiore successivo. Dopo che l'IRP ha raggiunto il driver del bus, il dispositivo verrà spento e i suoi driver non avranno più accesso a 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.
Un solo 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 di DO_POWER_INRUSH è impostato nell'oggetto dispositivo), PoCallDriver verifica se un altro IRP inrush è già attivo. In tal caso, PoCallDriver accoda l'IRP corrente per la gestione dopo il completamento dell'IRP precedente e quindi restituisce STATUS_PENDING. Per altre informazioni sugli irp inrush, vedere Impostazione dei flag dell'oggetto dispositivo per Power Management.
Se una richiesta di IRP_MN_SET_POWER o IRP_MN_QUERY_POWER è già attiva per DeviceObject, PoCallDriver accoda l'IRP e restituisce STATUS_PENDING.
Nei sistemi Windows 2000 e versioni successive, i driver paginabili (il flag DO_POWER_PAGABLE è impostato nell'oggetto dispositivo) devono chiamare PoCallDriver in IRQL = PASSIVE_LEVEL. I driver che non possono essere visualizzati (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.