Freigeben über


Behandeln eines System Query-Power IRP in einem Filter- oder Funktionstreiber

Ein Filter- oder Funktionstreiber (der nicht der Besitzer der Energierichtlinie für ein Gerät ist) sollte in den folgenden Schritten einen Systemabfrage-Power-IRP an den nächstniedrigen Treiber übergeben:

  1. Rufen Sie IoAcquireRemoveLock an, und übergeben Sie die aktuelle IRP, um sicherzustellen, dass der Treiber keine PnP-IRP_MN_REMOVE_DEVICE-Anforderung empfängt, während er die Energie-IRP verarbeitet.

    Wenn IoAcquireRemoveLock einen Fehler status zurückgibt, sollte der Treiber die Verarbeitung des IRP nicht fortsetzen. Stattdessen sollte der Treiber ab Windows Vista IoCompleteRequest aufrufen, um die IRP abzuschließen und den Fehler status zurückzugeben. In Windows Server 2003, Windows XP und Windows 2000 sollte der Treiber PoStartNextPowerIrp aufrufen, IoCompleteRequest aufrufen, um die IRP abzuschließen, und den Fehler status zurückgeben.

  2. Ermitteln Sie, ob bei der Abfrage ein Fehler auftreten soll. Richtlinien finden Sie unter Fehler bei einem System Query-Power IRP in einem Filter- oder Funktionstreiber und unter Abschließen der Verarbeitung, wie in diesem Abschnitt beschrieben.

  3. Rufen Sie PoStartNextPowerIrp auf. (Nur Windows Server 2003, Windows XP und Windows 2000)

  4. Legen Sie den IRP-Stapelspeicherort fest (IoSkipCurrentIrpStackLocation oder IoCopyCurrentIrpStackLocationToNext). Der Treiber kann eine IoCompletion-Routine im IRP festlegen, dies ist jedoch selten erforderlich.

  5. Rufen Sie IoCallDriver (in Windows 7 und Windows Vista) oder PoCallDriver (in Windows Server 2003, Windows XP und Windows 2000) auf, um den IRP an den nächstniedrigen Treiber zu übergeben.

  6. Rufen Sie IoReleaseRemoveLock auf. Wenn der Treiber jedoch eine IoCompletion-Routine für das IRP festgelegt hat, rufen Sie stattdessen von der IoCompletion-Routine ab.

  7. Gibt STATUS_PENDING aus der DispatchPower-Routine zurück.