Вызов IoCallDriver и вызов PoCallDriver
Начиная с Windows Vista, драйвер должен вызывать IoCallDriver вместо PoCallDriver, чтобы передать irp питания следующему более низкому драйверу. В Windows Server 2003, Windows XP и Windows 2000 драйвер должен вызвать PoCallDriver, а не IoCallDriver, чтобы передать irP питания следующему драйверу ниже. Однако обратите внимание, что драйверы, использующие один и тот же код для работы как в Windows Vista, так и в более ранних версиях Windows, должны вызывать PoCallDriver, а не IoCallDriver.
Начиная с Windows Vista , PoRequestPowerIrp и IoCallDriver гарантируют, что диспетчер питания правильно синхронизирует irp питания во всей системе. В Windows Server 2003, Windows XP и Windows 2000, PoRequestPowerIrp, PoCallDriver и PoStartNextPowerIrp убедитесь, что диспетчер питания правильно синхронизирует irp питания во всей системе.
Система ограничивает количество активных irp питания следующим образом:
Для каждого объекта физического устройства (PDO) в любой момент времени может быть активно не более одного IRP питания системы (IRP_MN_SET_POWER, IRP_MN_QUERY_POWER).
Для каждого PDO в любой момент времени может быть активно не более одного IRP на основе набора устройств (IRP_MN_SET_POWER ).
В любой момент времени в любой точке системы может быть активно не более одного IRP питания устройства, требующего включения питания.
Чтобы гарантировать, что два устройства не будут пытаться одновременно включить питание, диспетчер питания отслеживает активные входные irP во всей системе и позволяет только одному из них быть активным одновременно. Дополнительный входной IRP не может запускаться до завершения активного ВИП.
Из-за этих ограничений на входные IRP IRP питания устройства может блокироваться, пока завершается ввод IRP для другого устройства. Средства записи драйверов должны учитывать это поведение во время отладки.