Наблюдение BSoD с цветом, отличающимся от синего может смутить кого угодно, даже меня, и, основываясь на реакции аудитории TechEd, я готов поспорить, что вам было бы интересно подобрать свой цвет и потом показать его своим друзьям-айтишникам. Впервые я увидел это в исполнении Дэна Пирсона (Dan Pearson) во время его беседы о диагностике аварийных дампов памяти, которую он вел несколько лет назад с Дэйвом Соломоном (Dave Solomon), и теперь я завершаю свои презентации из серии «Дело о …» BSoD’ом в выбранном аудиторией цвете (реакцию аудитории на подобную концовку вы можете услышать, например, в конце этого видео). Стоит отметить, что описанные мной шаги для изменения цвета BSoD проделываются вручную и затрагивают только сеанс загрузки, так что они подходят для демонстраций, а не для общей настройки BSoD. Обязательно взгляните на специальный праздничный экран смерти, который я приготовил для вас в конце этого сообщения.

Подготовка системы

Поскольку нам придется изменить код ядра, первый шаг заключается в разрешении редактировать код ядра в памяти, если это ранее не было сделано. Системы Windows с менее чем 2 Гб ОЗУ используют страницы объемом 4 Кб для хранения кода ядра, благодаря чему можно обеспечить необходимый уровень защиты для содержимого. Например, страницы данных ядра должны разрешать доступ на чтение и запись, в то время как код ядра должен предоставлять доступ только для чтения и выполнения. В рамках оптимизации, которая позволяет увеличить скорость трансляции виртуальных адресов, Windows использует большие страницы (4 Мб на x86 и x64) на больших системах. Это означает, что если в странице хранится и код, и данные, то эта страница должна представлять доступ на чтение, запись и выполнение; так что для того, чтобы гарантировать возможность редактирования страницы, вы должны обеспечить использование Windows больших страниц. Если у вас Windows XP или Windows Server 2003 и менее 256 Мб ОЗУ, или Windows Vista или старше и есть 2 Гб ОЗУ или меньше, создайте значение REG_DWORD с названием LargePageMinimum, которое установлено в 1, в ветке реестра HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management:

clip_image001

Чтобы вам не надо было спешить похвастаться результатами своей работы пока Windows автоматически не перезагрузится после сбоя, измените настройки автоперезагрузки. На Windows XP и Server 2003 щелкните правой кнопкой мыши на значке «Мой компьютер», выберите вкладку «Дополнительно» и нажмите кнопку «Параметры» в разделе «Загрузка и Восстановление». На Windows Vista и выше щелкните правой кнопкой мыши на значке «Компьютер» в меню Пуск, выберите «Свойства», нажмите «Дополнительные параметры системы», перейдите на вкладку «Дополнительно» и нажмите кнопку «Параметры» в разделе «Загрузка и Восстановление». Снимите флажок с параметра «Выполнять автоматическую перезагрузку»:

clip_image002

Если вы работаете на 64-разрядной версии Windows Vista или выше, вам нужно загрузить систему в режиме отладки, чтобы можно было запустить отладчик ядра в режиме «local». Вы можете сделать это либо нажав F8 во время загрузки системы и выбрав режим отладки, либо поставив флажок «Отладка» в утилите «Конфигурация системы» (Msconfig):

clip_image003

Далее перезагрузите систему и запустите отладчик с правами администратора. Настройте отладчик на сервер символов Microsoft, открыв диалоговое окно «Symbol Search Path» из меню Файл и введите следующую строку: srv*c:\symbols*http://msdl.microsoft.com/download/symbols (замените c:\symbols на путь к локальной папке, в которой отладчик должен хранить кэшированные символы). Далее откройте диалоговое окно «Kernel Debugging" из меню Файл, выберите вкладку «Local» и нажмите OK:

clip_image004

Следующие шаги отличаются в зависимости от того, работаете вы с 32-разрядной или 64-разрядной Windows и от версии Windows.

32-разрядная Windows XP и Windows Server 2003

Функция, которая отображает BSoD на этих операционных системах, называется KeBugCheck2. Вы ищите место, где функция передает значение цвета функции, которая заливает фон экрана – InbvSolidColorFill. Введите команду «u kebugcheck2», чтобы вывести начало функции, затем вводите команду «u», чтобы пролистать дополнительные страницы кода функции до тех пор, пока вы не увидите ссылку на InbvSolidColorFill (после первого ввода «u», вы можете просто нажать Enter, чтобы повторить команду). Вам нужно будет пропустить 30-40 страниц до того, как вы увидите этот запрос:

clip_image005

Перед этим запросом вы увидите инструкцию «push», использующую в качестве аргумента 4, как показано на рисунке выше. Скопируйте адрес кода этой инструкции, выбрав его из столбца адреса слева и нажав Ctrl+C. Затем в командном окне отладчика введите «eb», затем Ctrl+V, чтобы вставить адрес, затем "+1» и нажмите Enter. Отладчик войдет в режим редактирования памяти, начиная с адреса значения цвета. Теперь вы можете выбрать цвет, который вы хотите. 1 – это красный, 2 – зеленый, вы также можете поэкспериментировать, чтобы получить другой цвет. Просто введите число и нажмите Enter дважды, чтобы подтвердить ввод, после чего выйдите из режима редактирования. Вот как примерно должен выглядеть экран, после того как вы закончите:

clip_image006

64-разрядные версии Windows и 32-разрядные версии Windows Vista или выше

На этих версиях Windows функция ядра для отрисовки BSoD называется KiDisplayBlueScreen. Введите «u kidisplaybluescreen» и затем продолжайте вводить команды «u», чтобы пропустит страницы с кодом функции, до тех пор, пока вы не увидите вызов InbvSolidColorFill. На 32-разрядных версиях Windows продолжите следование инструкциям, приведенным в разделе Windows XP/Server 2003, чтобы найти и отредактировать значение цвета. На 64-разрядных версиях этих операционных систем инструкция, предшествующая вызову InvbSolidColorFill, передает цвет, так что скопируйте ее адрес (номер в левой колонке) и введите эту команду для начала редактирования: «eb <address>+4». Отладчик перейдет в режим редактирования памяти, и вы сможете изменить значение (например, 1 для красного, 2 для зеленого):

clip_image007

Просмотр результата

Теперь вы готовы к сбою системы. Если вы работаете на 64-разрядной Windows, вы можете вызвать сбой без каких-либо дополнительных действий. Kernel Patch Protection заметит модификацию и вызовет сбой системы как средство сдерживания деятельности независимых вендоров, которые могли бы решить подправить код ядра, чтобы изменить его поведение. Однако на это может понадобиться несколько минут. Чтобы вызвать сбой системы по требованию, запустите утилиту Notmyfault (вы можете скачать ее с веб-страницы Windows Internals, посвященной книгам) и нажмите кнопку «Do Bug» (чтобы избежать потери данных, убедитесь, что вы сохранили любую работу и закрыли все другие приложения):

clip_image008

Появится BSoD в цвете, который вы выбрали, в данном случае это «красный экран смерти»:

clip_image009

Праздничный BSoD

В духе наступающих праздников, я сделал еще один шаг и создал праздничный BSoD: я поменял не только цвет фона, но и цвет текста. Чтобы сделать это на 64-разрядных версиях Windows Vista или выше, найдите вызов InvbSetTextColor сразу после InvbSolidColorFill и адрес инструкции, которая передает цвет текста функции, «move ecx, 0Fh»:

clip_image010

Параметр 0Fh означает белый цвет, но вы можете изменить его, используя все ту же методику редактирования. Используйте команду «eb», передавая адрес инструкции плюс 1. Ниже я установил красный цвет (который имеет значение 1):

clip_image011

А вот и праздничный BSoD, который я создал:

clip_image012

Счастливых вам праздников! И помните, если у вас были какие-либо случаи диагностики проблем, которыми вы хотите поделиться, пожалуйста, присылайте мне скриншоты (предпочтительно .PNG) и файлы лога.