Обработка ошибок/Фатальные сбои

23 января 2012

Неисправимые ошибки в режиме ядра могут проявляться в виде так называемых «синих экранов смерти» (BSOD, Blue Screen of Death), отлично знакомых разработчикам драйверов. Для диагностики фатальных сбоев используется сервисная функция KeBugCheckEx. Главная особенность фатального сбоя заключается в том, что система по возможности организованно переводит себя в нерабочее состояние и отображает «синий экран». После появления «синего экрана» система «висит» и требует перезагрузки. Функция KeBugCheckEx вызывается следующим образом:

KeBugCheckEx(bugcode, infol, info2, info3, info4);

где bugcode - числовой код - идентифицирующий причину ошибки, a infol, info2 и т.д. – целочисленные параметры, выводимые на «синем экране» для передачи программисту дополнительной информации об ошибке. Возврат из функции не происходит!!!

Разработчик вряд ли найдет полезную информацию на «синем экране». Если повезет, в выведенной информации будет присутствовать смещение команды внутри программы (драйвера). Позднее можно будет проанализировать соответствующий адрес в отладчике режима ядра и найти причину фатального сбоя. Коды фатальных сбоев, определенных Microsoft, находятся в bugcodes.h, более полное описание кодов и их различных параметров приведено в статье Knowledge Base Q103059 «Descriptions of Bug Codes for Windows NT».

Разумеется, при желании Вы можете определять собственные коды фатальных сбоев. Значения Microsoft представляют собой простые целые числа от 1 (APC_INDEX_MISMATCH) до (в настоящий момент) 0xF6 (Pa_VERIRER_DETECn=n VIOLATION), а также ряд других значений. Чтобы создать собственный код фатального сбоя, определите целочисленную константу так, как если бы она была кодом состояния STATUS_SEVERITY_SUCCESS, но передайте либо флаг клиента, либо ненулевой код подсистемы:

#define MY_BUGCHECK_CODE 0x002A0001

KeBugCheckEx(MY_BUGCHECK_CODE, 0, 0, 0, 0);

Не нулевой код подсистемы (в примере 42) или флаг клиента (в примере 0) позволяют отличить Ваши коды от кодов, используемых Microsoft.

Теперь Вы умеете выдавать собственные «сини экраны смерти», но этого не следует делать никогда или только в целях проверки Вами написанного драйвера (будьте осторожны!!!). Стоит отметить, что пользователь может настроить поведение KeBugCheckEx в дополнительных настройках значка Мой компьютер, выбирая между автоматическим перезапуском и выдачей синего экрана. Также выбирается уровень детализации дампа и запись события в системный журнал.

Рейтинг@Mail.ru