В тази статия ще се опитам да опиша метод за диагностициране на проблеми с неподписани драйверни файлове в x64 битова версия на Windows системи, поради което компютърът спира да се зарежда и се срива на BSOD, когато се стартира. Но системата все още може да се зареди, като деактивира проверката на цифровия подпис при стартиране (F8 -> Изключване шофьор подпис изпълнение). Като пример, в тази статия ще работя с Windows Server 2008 R2 (което, припомням, се случва само в 64-битовото издание), но тази техника е подходяща за Windows 7 x64 и Vista x64.
Ако се върнем на фона на проблема, припомняме, че Microsoft реши, че в 64-битовите системи, като се започне с Windows Vista, Windows зарежда драйвери в режим на ядрото само ако драйверът е цифрово подписан. Ако драйверът няма цифров подпис, тогава възниква критична грешка, когато системата се стартира (зависи от типа драйвер, чието зареждане е блокирано) и се появи екранът BSOD. Конкретната грешка и нейният код зависи от конкретния драйвер, който е блокиран по време на процеса на зареждане. Някои грешки точно на екрана на BSOD могат да показват неподписан драйвер.
В моя случай след актуализиране на драйверите на сървъра на Windows 2008 r2 по време на нормално зареждане на машината се появи син екран на смъртта с текста:
СТОП: c000021a (фатална грешка в системата)
Първоначалният процес или процесът на системата се прекратява неочаквано със статус 0x00000000 (0xc000428 0x00100448). Системата е изключена
Нека се опитаме да разберем каква грешка е това, кой драйвер го причинява и нека да определим конкретното устройство от драйвера.
За да декодираме грешката, се нуждаем от втори параметър (той е подчертан с удебелен шрифт) - 0xc000428.
Преобразувайте шестнадесетичния код за грешка в по-четена форма. За да направите това, можете да използвате вградената помощна програма в Windows SLUI.EXE или съвпадат с кода за грешка във файла NTSTATUS.з, които можете да намерите в SDK за Windows. Ще използваме първия метод, за който ще изпълним в командния ред:
slui.exe 0x2a 0xC0000428
Както можете да видите на екрана, бяхме убедени, че BSOD е причинен от невъзможността да се провери цифровият подпис на водача („Windows не мога провери цифров подпис за това досие")
Рестартираме компютъра си и при стартиране натискаме клавиша F8. В менюто Разширени опции за зареждане деактивирайте проверката на цифровия подпис, като изберетеИзключване шофьор подпис изпълнение .
В случай, че в този режим сървърът се стартира, ние сме сигурни, че някакъв неподписан модул или драйвер не позволява на системата да се стартира нормално.
Следващата стъпка е да идентифицирате проблемния модул или файла на драйвера. Отворете дневника на конзолата на конзолата (Event Viewer) и отидете на Журнали за приложения и услуги -> Microsoft -> Windows -> CodeIntegrity -> Operational.
Забележка: ако при достъп до регистрационните файлове в този клон се появи грешка „достъп отказано “, създаване на диск c: директория чрез предоставяне на групата Всички имат пълен достъп. След това променете пътя на файла ETL в новата директория и изключете и включете отново.
В моя случай в дневника с текста има събитие на EventID 3001 "В целостта на кода се определя, че в системата се зарежда неподписан модул на ядрото \ Device \ HarddiskVolume1 \ Windows \ System32 \ win32k.sys. Проверете с издателя, за да проверите дали е налична подписана версия на модула на ядротоТака че намерихме проблемния драйвер!
Този драйвер може да бъде или местен драйвер на Microsoft или драйвер на трета страна. Уверете се, че този драйвер наистина няма цифров подпис. За целта се нуждаем от помощна програма от Sysinternals, наречена SIGCHECK.EXE (можете да я вземете тук http: //TechNet.Microsoft.com /ен-нас /sysinternals /bb897441).
Проверката на наличието на цифров подпис се извършва от командата:
c: \ TOOLS> sigcheck.exe -i c: \ Windows \ System32 \ win32k.sys
Ако няма подпис, тогава в полето за проверка ще бъде посочен Без подпис (в противен случай, Подписан съответно).
Имаме две възможности за решаване на проблема с невъзможността за нормално зареждане на системата с неподписан драйвер:
- Намерете подписана версия на драйвера
- Откажете да използвате този драйвер (и устройство)
- деактивирайте проверката на цифровия подпис на драйвера в Windows
Третата опция може да не работи по една или друга причина. В първите два случая трябва да определим към кое конкретно устройство принадлежи даденият .sys драйвер..
Как да определите устройството, като знаете само името на файла sys? Използвам следната методология (нека трябва да идентифицираме устройство, чийто драйвер носи името HpCISSs2.sys):
1) Отворете редактора на системния регистър и потърсете клона HKEY_LOAL_MACHINE \ SYSTEM \ ControlSet001 търсите ключ със стойността HpCISSs2.sys
2) В моя случай тя беше намерена в клона HKEY_LOAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ HpCISSs2
3) Разширяваме вложен клон с името ENUM, интересуваме се от ключовата стойност 0, в моя случай е PCI \ VEN_103C& DEV_3230& SUBSYS_3235103C & REV_01 \ 4 & 3b416f2c & 0 & 0018
4) Определяме, че производителят на устройството има идентификатор 103C, а кодът на устройството е 3230
5) По-нататък на сайта посочете в полетата Търсене на доставчик и устройство Търсене на кодовете, които намерихме.
6) Разбираме, че търсеното от нас устройство е контролер на твърдия диск на HP Smart Array P400 Controller.
Просто трябва да намерим новата версия на драйвера на уебсайта на производителя на оборудване (внимателно потърсете за кои версии на OS драйверът, от който се нуждаете, е подходящ) и да актуализирате драйвера на компютъра.