Aufrufen von IoCallDriver im Vergleich zum Aufrufen von PoCallDriver
Ab Windows Vista sollte ein Treiber IoCallDriver anstelle von PoCallDriver aufrufen, um Power IRPs an den nächstniedrigen Treiber zu übergeben. In Windows Server 2003, Windows XP und Windows 2000 muss ein Treiber PoCallDriver und nicht IoCallDriver aufrufen, um Power IRPs an den nächstniedrigen Treiber zu übergeben. Beachten Sie jedoch, dass Treiber, die denselben Code verwenden, um sowohl in Windows Vista als auch in früheren Windows-Versionen ausgeführt werden, PoCallDriver und nicht IoCallDriver aufrufen müssen.
Ab Windows Vista stellen PoRequestPowerIrp und IoCallDriver sicher, dass der Power Manager power IRPs im gesamten System ordnungsgemäß synchronisiert. Stellen Sie in Windows Server 2003, Windows XP und Windows 2000, PoRequestPowerIrp, PoCallDriver und PoStartNextPowerIrp sicher, dass der Power Manager die Energie-IRPs im gesamten System ordnungsgemäß synchronisiert.
Das System schränkt die Anzahl der aktiven Energie-IRPs wie folgt ein:
Für jedes physische Geräteobjekt (PDO) kann zu einem bestimmten Zeitpunkt nicht mehr als ein Systemleistungs-IRP (IRP_MN_SET_POWER, IRP_MN_QUERY_POWER) aktiv sein.
Für jede PDO kann zu einem bestimmten Zeitpunkt nicht mehr als ein Gerätesatzleistungs-IRP (IRP_MN_SET_POWER) aktiv sein.
Nicht mehr als ein Geräteleistungs-IRP, das einen Stromeinstrom benötigt, kann jederzeit überall im System aktiv sein.
Um sicherzustellen, dass zwei Einschaltgeräte nicht versuchen, gleichzeitig hochzuschalten, verfolgt der Power Manager die aktiven Einschaltenergie-IRPs im gesamten System und lässt nur eines gleichzeitig aktiv zu. Ein zusätzlicher Einschalt-IRP kann erst gestartet werden, wenn die aktive Einschalt-IRP abgeschlossen ist.
Aufgrund dieser Einschränkungen für Einschalt-IRPs kann ein Geräteleistungs-IRP blockiert werden, während ein Einschalt-IRP für ein anderes Gerät abgeschlossen ist. Treiberautoren sollten sich dieses Verhalten beim Debuggen bewusst sein.