Завантаження драйверів в безпечному режимі - еннее пристрій windows (гл
Завантаження драйверів в безпечному режимі
При завантаженні в безпечному режимі Ntldr передає ядру (Ntoskrnl.exe) разом з іншими параметрами, зазначеними в Boot.ini для поточного варіанту завантаження, параметр командного рядка / SAFEBOOT. додаючи до нього одну або кілька рядків в залежності від обраного типу безпечного режиму. Для стандартного безпечного режиму Ntldr додає MINIMAL, для Safe Mode With Networking - NETWORK, для Safe Mode With Command Prompt - MINIMAL (ALTERNATESHELL), a для Directory Services Restore - DSREPAIR.
Ядро Windows сканує параметри завантаження в пошуках специфікаторів безпечного режиму і встановлює значення внутрішньої змінної InitSafeBootMode відповідно до результату пошуку. Значення цієї змінної також записується в розділ HKLM \ SYSTEM \ CurrentControlSet \ Control \ SafeBoot \ Option \ OptionValue, що дозволяє компонентам призначеного для користувача режиму (наприклад, SCM) визначати режим завантаження системи. Крім того, при виборі Safe Mode With Command Prompt, ядро привласнює значення 1 параметру UseAlternateShell в розділі реєстру HKLM \ SYSTEM \ CurrentControlSet \ Control \ SafeBoot \ Option. Крім того, ядро записує параметри, передані Ntldr, в розділ HKLM \ SYSTEM \ CurrentControlSet \ Control \ SystemStartOptions.
Коли диспетчер вводу-виводу завантажує драйвери пристроїв, зазначені в розділі HKLM \ SYSTEM \ CurrentControlSet \ Services, він виконує функцію IopLoadDriver. A коли диспетчер Plug and Play виявляє новий пристрій і хоче динамічно завантажити драйвер для цього пристрою, він викликає функцію IopCallDriverAddDevice. Обидві ці функції перед завантаженням драйвера звертаються до функції IopSafeBootDriverLoad. Остання перевіряє значення змінної InitSafeBootMode і визначає, чи можна завантажити даний драйвер. Так, якщо система завантажується в стандартному безпечному режимі, IopSafeBootDriverLoad шукає групу цього драйвера (якщо така є) в підрозділі Minimal. Знайшовши її, IopSafeBootDriverLoad повідомляє викликала функцію про те, що цей драйвер можна завантажити. B іншому випадку IopSafeBootDriverLoad шукає в тому ж підрозділі ім'я драйвера. Якщо воно є в списку, драйвер може бути завантажений. Якщо IopSafeBootDriverLoad не знаходить в списку групу або ім'я драйвера, його завантаження забороняється. При завантаженні системи в безпечному режимі з мережевою підтримкою IopSafeBootDriverLoad веде пошук в підрозділі Network, а в разі завантаження системи в нормальному режимі IopSafeBootDriverLoad дозволяє завантаження всіх драйверів.
Однак Ntldr завантажує всі драйвери, у яких у відповідних розділах реєстру значення Start одно 0, що вказує на необхідність їх завантаження при запуску системи. Оскільки Ntldr не перевіряє розділ SafeBoot (вважаючи, що будь-який драйвер з нульовим значенням параметра Start необхідний для успішного старту системи), він завантажує всі завантажувальні драйвери, які згодом запускаються Ntoskrnl.