Уровень приоритета, который забыли опустить
Процессор в Windows работает на разных уровнях приоритета, их называют IRQL. Обычные программы и большая часть системы живут на самом низком уровне. Когда программа просит ядро прочитать файл, отправить пакет в сеть или обратиться к устройству, управление уходит в ядро и в драйверы. Там уровень иногда временно поднимают, например чтобы никто не вмешался в работу с общими данными. Правило простое: прежде чем вернуть управление программе, уровень нужно опустить обратно, иначе система перестаёт правильно распределять работу.
Код 0x4A означает, что правило нарушено: поток возвращается из системного вызова в программу, а уровень всё ещё поднят. Windows проверяет это на выходе и останавливается. В параметрах остановки записаны адрес системной функции, которую вызывала программа, и текущий уровень. Справка Microsoft причин не называет, но по смыслу виноват тот, кто поднял уровень и не опустил, — как правило, драйвер, участвовавший в обработке этого вызова. Реже состояние процессора портит сбой железа, и тогда код лишь случайно оказывается таким.
Отличие от IRQL_NOT_LESS_OR_EQUAL важно для поиска. Там драйвер на повышенном уровне обратился к памяти, к которой в этот момент обращаться нельзя, и ошибка случается прямо внутри его работы. Здесь драйвер свою работу вроде бы закончил, но оставил процессор в неправильном состоянии, и проблема обнаруживается позже, на границе с программой. Поэтому имя файла в дампе не всегда указывает на виновника, и драйвер приходится искать среди тех, кто вмешивается в системные вызовы. Главный вопрос прежний: ошибка одной программы или нестабильное железо.
