Freigeben über


Behandeln von Energieanforderungen an Speicherperipheriegeräte

Ein Speicherklassentreiber ist für die Ausgabe gerätespezifischer Befehle zur Verarbeitung von Energieanforderungen verantwortlich. Am häufigsten ein Speicherklassentreiber:

  • Blockiert E/A auf das Gerät als Reaktion auf eine Abfrage-Energieanforderung (IRP_MJ_POWER mit IRP_MN_QUERY_POWER), wenn die Verarbeitung einer solchen E/A den Treiber daran hindern könnte, eine Set-Power-Anforderung in einer angemessenen Zeit erfolgreich auszuführen.

  • Legt den Energiezustand des Geräts als Reaktion auf eine Set-Power-Anforderung fest (IRP_MJ_POWER mit IRP_MN_SET_POWER)

  • Startet die E/A des Geräts als Reaktion auf eine Set-Power-Anforderung zum Einschalten des Geräts neu.

  • Leitet Energieanforderungen an den nächstniedrigen Treiber weiter.

Beachten Sie, dass ein Treiber PoStartNextPowerIrp und PoCallDriver und nicht IoCallDriver aufrufen muss, um Energieanforderungen zu senden.

Sofern der Speicherklassentreiber nicht über eine StartIo-Routine verfügt, sollte er die LU-spezifische Warteschlange des Speicherporttreibers (IRP_MJ_SCSI mit SRB_FUNCTION_LOCK_QUEUE) sperren, bevor der Energiezustand des Geräts festgelegt wird, um nicht synchronisierte Vorgänge zu blockieren, bis der Netzbetrieb (der mehrere Schritte umfassen kann) abgeschlossen ist. Alle SRBs, die zum Verarbeiten des Energievorgangs ausgegeben werden, sollten SRB_FLAGS_BYPASS_LOCKED_QUEUE festlegen, um sicherzustellen, dass sie den Porttreiber erreichen. Nachdem der Treiber die Einstellung des Energiezustands abgeschlossen hat, sollte er die Warteschlange entsperren (IRP_MJ_SCSI mit SRB_FUNCTION_UNLOCK_QUEUE und SRB_FLAGS_BYPASS_LOCKED_QUEUE), damit der Porttreiber das Senden von IRPs in der Warteschlange an das Gerät fortsetzen kann, nachdem es eingeschaltet wurde.

Wenn ein Speicherklassentreiber über eine StartIo-Routine verfügt, übernimmt diese Routine die Synchronisierung, sodass der Klassentreiber die LU-spezifische Warteschlange des Porttreibers nicht explizit sperren und entsperren muss.

Ein Klassentreiber sollte nicht versuchen, eine von einem anderen Treiber gesperrte Warteschlange zu umgehen.