Разбираемся с ошибкой загрузки из-за отсутствующей цифровой подписи драйвера в x64 системе

В этой статье постараюсь описать методику диагностики проблем с неподписанными файлами драйверов в x64 битной версии Windows систем, из-за которых компьютер перестает загружаться и при загрузке падает в BSOD. Но систему все-таки можно загрузить, отключив проверку цифровой подписи при загрузке ( F8 -> Disable Driver Signature Enforcement ). В качестве примера в этой статье я буду работать с Windows Server 2008 R2 (которая, напомню, бывает только в 64-разрядной редакции), но данная методика подойдет так и для Windows 7 x64 и Vista x64.

Если вернуться к предыстории вопроса, то вспомним, что Microsoft приняла решение о том, что в 64-битных системах, начиная с Windows Vista, Windows загружает драйвера в режим ядра только в том случае, если драйвер имеет цифровую подпись. Если же цифровая подпись драйвера отсутствует, то при загрузке системы случается критическая ошибка (зависит от типа драйвера, загрузка которого заблокирована) и появляется экран BSOD. Конкретная ошибка и ее код зависят от конкретного драйвера, который заблокирован в процессе загрузки. Некоторые ошибок прямо на экране BSOD могут указывать на файл неподписанного драйвера.

В моем случае после обновления драйверов на сервере Windows 2008 r2 при обычной загрузки машины появился синий экран смерти с текстом:

STOP: c000021a (fatal System Error)

The initial session process or system process terminated unexpectedly with a status of 0x00000000 ( 0xc000428 0x00100448). The system has been shut down

BSOD : STOP: c000021a (fatal System Error)

Попробуем выяснить что это за ошибка, какой драйвер ее вызывает т определим по драйверу конкретное устройство.

Для декодирования ошибки нам нужен второй параметр (он выделен жирным) — 0 xc000428.

Преобразуем hex код ошибки в более удобочитаемую форму. Для этого можно воспользоваться встроенной в Windows утилитой SLUI. EXE или же сопоставить код этой ошибки в файле ntstatus. h , найти который можно в Windows SDK. Воспользуемся первым способом, для чего в командной строке выполним:

slui.exe 0x2a 0xC0000428

Утилита slui.exe

Как вы видите на скриншоте, мы убедились в том, что BSOD вызвана невозможностью проверить цифровую подпись драйвера (“ Windows cannot verify digital signature for this file ”)

Перезагружаем наш компьютер и при загрузке жмем клавишу F8. В расширенном загрузочном меню (Advanced Boot Options) отключаем проверку цифровой подписи, выбрав Disable Driver Signature Enforcement .

Disable Driver Signature Enforcement

В том случае, если в таком режиме сервер загрузиться, мы точно уверены в том, что некий неподписанный модуль или драйвер не позволяет системе нормально загрузиться.

Следующий шаг – определение файла проблемного модуля или драйвера. Откроем консоль журнал событий (Event Viewer) и перейдем в раздел Applications and Services Logs -> Microsoft -> Windows -> CodeIntegrity -> Operational.

Примечание: если при доступе к логам в этой ветке появляется ошибка “ access denied”, создайте на диске c: каталог, предоставив группе Everyone полный доступ. Затем измените путь к файлу ETL на новый каталог, и отключите и заново включите логирование.

Журнал CodeIntegrity

В моем случае, в журнале есть событие EventID 3001 с текстом « Code Integrity determined an unsigned kernel module DeviceHarddiskVolume1WindowsSystem32win32k.sys is loaded into the system. Check with the publisher to see if a signed version of the kernel module is available ». Вот мы и нашли проблемный драйвер!

Данный драйвер может быть как родным драйвером Microsoft, так и драйвером стороннего разработчика. Удостоверимся, что данный драйвер действительно не имеет цифровой подписи. Для этого нам понадобится утилита от Sysinternals под названием SIGCHECK.EXE (взять ее можно тут http:// technet. microsoft. com/ en- us/ sysinternals/ bb897441).

Проверку наличия цифровой подписи выполним командой:

c:TOOLS>sigcheck.exe -i c:WindowsSystem32win32k.sys

Проверка цифровой подписи sigcheck.exe

Если подпись отсутствует, то в поле Verified будет указано Unsigned (в противном случае, соответственно Signed).

Перед нами есть два варианта решения проблемы невозможности нормальной загруки системы с неподписанным драйвером:

  1. Найти подписанную версию драйвера
  2. Отказаться от использования данного драйвера (и устройства)
  3. отключить проверку цифровой подписи драйвера в Windows

Третий вариант может не подойти по тем или иным причинам. В первых двух случаях нам нужно определить к какому конкретному устройству относится данный файл драйвера .sys.

Как же определить устройство, зная лишь имя sys-файла? Я использую следующую методику (пусть нам нужно определить устройство, драйвер которого имеет имя HpCISSs2.sys):

1) Открываем редактор реестра и поиском по ветке HKEY_LOAL_MACHINESYSTEMControlSet001 ищем ключ со значением HpCISSs2.sys

2) В моем случае он нашелся в ветке HKEY_LOAL_MACHINESYSTEMControlSet001servicesHpCISSs2 Определеяем драйвер по sys файлу

3) Разворачиваем вложенную ветку с названием ENUM, нас интересует значение ключа 0 , в моем случае это PCIVEN_ 103 C &DEV_ 3230 &SUBSYS_3235103C&REV_014&3b416f2c&0&0018 Определеяем код устройства по файлу драйвера

4) Определяем, что производитель устройства имеет ID 103C, а код устройства 3230

5) Далее на сайте указываем в полях Vendor Search и Device Search найденные нами коды. Определяем устройство по коду устройства

6) Получаем что искомое нами устройство контроллер жестких дисков HP Smart Array P400 Controller. Определяем устройство по коду

Нам осталось лишь найти новую версию драйвера на сайте производителя оборудования (внимательно смотрите для каких версий ОС подходит нужный вам драйвер) и обновить драйвер на компьютере.

EnglishRussianUkrainian