Поделиться через


Вызов IoCallDriver и вызов PoCallDriver

Начиная с Windows Vista, драйвер должен вызывать IoCallDriver вместо PoCallDriver, чтобы передать IRP, связанные с питанием, драйверу на уровень ниже. В Windows Server 2003, Windows XP и Windows 2000 драйвер должен вызывать PoCallDriver, а не IoCallDriver, чтобы передать power IRPs следующему по иерархии драйверу. Обратите внимание, что драйверы, использующие один и тот же код для запуска как в 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) в любое время.

  • Не более одного устройства IRP (IRP_MN_SET_POWER) одновременно может быть активен для каждого PDO.

  • Не более одного IRP питания устройства, требующего подачи пускового тока, может быть активным где-либо в системе в любой момент времени.

Чтобы убедиться, что два устройства включения не пытаются одновременно подключиться, диспетчер питания отслеживает активные включающие IRPs во всей системе и позволяет одновременно работать только одному. Дополнительный запрос IRP при скачке тока не может начинаться, пока не завершён активный запрос IRP.

Из-за этих ограничений на входные IRP, IRP устройства питания может блокироваться, пока выполняется входной IRP для другого устройства. Авторы драйверов должны знать об этом поведении при отладке.