Fonction PoCallDriver (wdm.h)

La routine PoCallDriver transmet un IRP d’alimentation au pilote inférieur suivant dans la pile de périphériques. (Windows Server 2003, Windows XP et Windows 2000 uniquement.)

Syntaxe

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

Paramètres

[in] DeviceObject

Pointeur vers le DEVICE_OBJECT créé par le pilote vers lequel l’IRP doit être routé.

[in, out] Irp

Pointeur vers un IRP.

Valeur retournée

PoCallDriver retourne STATUS_SUCCESS pour indiquer la réussite. Il retourne STATUS_PENDING s’il a mis en file d’attente l’IRP.

Remarques

À compter de Windows Vista, les pilotes doivent appeler IoCallDriver, et non PoCallDriver pour passer un IRP d’alimentation au pilote inférieur suivant. Toutefois, sur Windows Server 2003, Windows XP et Windows 2000, les pilotes doivent appeler PoCallDriver, et non IoCallDriver pour passer un IRP d’alimentation au pilote inférieur suivant. Sur Windows Server 2003, Windows XP, un Windows 2000, les pilotes doivent également appeler PoStartNextPowerIrp avant d’appeler PoCallDriver.

Un pilote qui nécessite une nouvelle IRP doit appeler PoRequestPowerIrp. Un pilote ne doit pas allouer son propre IRP d’alimentation.

Lors du passage d’une IRP d’alimentation au pilote inférieur suivant, l’appelant doit utiliser IoSkipCurrentIrpStackLocation ou IoCopyCurrentIrpStackLocationToNext pour définir l’emplacement de la pile IRP, puis appeler PoCallDriver. Utilisez IoCopyCurrentIrpStackLocationToNext si le traitement de l’IRP nécessite la définition d’une routine IoCompletion , ou IoSkipCurrentStackLocation si aucune routine IoCompletion n’est requise.

Lorsqu’un appareil est mis sous tension, ses pilotes doivent définir des routines IoCompletion pour effectuer des tâches de démarrage (initialisation de l’appareil, restauration du contexte, etc.) une fois que le pilote de bus a défini l’appareil dans l’état de fonctionnement. Définissez des routines IoCompletion avant d’appeler PoCallDriver.

Lorsqu’un appareil est hors tension, ses pilotes doivent effectuer les tâches de mise sous tension nécessaires avant de passer l’IRP au pilote inférieur suivant. Une fois que l’IRP a atteint le pilote de bus, l’appareil est hors tension et ses pilotes n’y ont plus accès. Sur Windows Server 2003, Windows XP et Windows 2000, une routine IoCompletion associée à une IRP hors tension est nécessaire uniquement pour appeler PoStartNextPowerIrp.

Un seul IRP d’inrush peut être actif dans le système à la fois. Lors de la transmission d’une IRP de mise sous tension pour un appareil qui nécessite le courant d’appel (en d’autres termes, l’indicateur de DO_POWER_INRUSH est défini dans l’objet de l’appareil), PoCallDriver vérifie si un autre IRP d’appel d’appel est déjà actif. Si c’est le cas, PoCallDriver met en file d’attente l’IRP actuel à des fins de gestion une fois l’IRP précédente terminée, puis retourne STATUS_PENDING. Pour plus d’informations sur les irps inrush, consultez Définition des indicateurs d’objet d’appareil pour la gestion de l’alimentation.

Si une requête IRP_MN_SET_POWER ou IRP_MN_QUERY_POWER est déjà active pour DeviceObject, PoCallDriver met en file d’attente cette IRP et retourne STATUS_PENDING.

Sur les systèmes Windows 2000 et ultérieurs, les pilotes paginables (l’indicateur DO_POWER_PAGABLE est défini dans l’objet de périphérique) doivent appeler PoCallDriver à l’adresse IRQL = PASSIVE_LEVEL. Les pilotes qui ne peuvent pas être paginés (DO_POWER_PAGABLE n’est pas défini dans l’objet de périphérique) ou qui nécessitent l’inrush current (DO_POWER_INRUSH est défini dans l’objet de périphérique) peuvent appeler PoCallDriver à l’adresse IRQL = PASSIVE_LEVEL ou DISPATCH_LEVEL.

Sur Windows 98/Me, tous les pilotes appellent PoCallDriver à l’adresse IRQL = PASSIVE_LEVEL.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 2000.
Plateforme cible Universal
En-tête wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Consultez la section Notes.
Règles de conformité DDI CompleteRequestStatusCheck(wdm), CompletionRoutineRegistered(wdm), DeleteDevice(wdm), ForwardedAtBadIrql(wdm), ForwardedAtBadIrqlAllocate(wdm),ForwardedAtBadIrqlFsdAsync(wdm), ForwardedAtBadIrqlFsdSync(wdm),HwStorPortProhibitedDDIs(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)

Voir aussi

IRP

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IoCallDriver

IoCompletion

IoCopyCurrentIrpStackLocationToNext

IoSkipCurrentIrpStackLocation

PoRequestPowerIrp

PoStartNextPowerIrp