Блог → Драйверы Windows XP. Часть 1

Да, разумеется, я знаю, что на дворе уже почти 2014 год и в моде нынче - Windows 8.1, а XP уже практически списали на свалку истории. Тем не менее, мне очень нравилась эта версия "винды" и в этом цикле статей, я хотел бы отдать дань её памяти. Давайте вместе оглянемся назад и рассмотрим основные нововведения, которые затронули ядро и структуру драйверов Windows XP, ведь именно здесь произошёл, если так можно выразиться, эволюционный скачок, приведший к созданию одной из лучших ОС начала XXI века.

Унаследовав ядро NT, Windows XP (она же - NT 5.1) является продолжением обеих линеек операционных систем Microsoft. О преимуществах системы Windows XP перед её предшественниками написано уже немало, поэтому я предлагаю сконцентрироваться только на некоторых, важных с точки зрения разработчика драйверов, вопросах касающихся ядра этой операционки. Первое, что бросается в глаза - это безусловно, поддержка 64-разрядных процессоров. Для 64-разрядной версии Windows был практически заново был переписан код ключевых компонентов ядра. Адресуемое пространство также резко возросло (собственно, это особенность не столько 64-разрядной версии Windows, сколько 64-разрядного процессора), и отныне 64-разрядная система выделяет 7152 Гб на каждый процесс. Естественно, до момента, когда большинство пользователей обзаведётся новыми процессорами, осталось ещё достаточно времени, но разработчикам драйверов уже сегодня приходится работать в 64-разрядной среде.

Ещё одна приятная новость: в 32-битной версии Windows XP значительно вырос размер системной области, и драйверы теперь могут занимать до 960 Мб (для сравнения - 220 Мб в Windows 2000). Поддержка больших страниц (4 Мб вместо 4 Кб) включается в тех случаях, когда размер физической памяти превышает 255 Мб (против 127 Мб для Windows 2000). При размере страниц 4 Кб система загружает защищённые от записи части NTOSKRNL.EXE и HAL.DLL как страницы с атрибутом "только для чтения", в результате чего при попытке записи в системную область возникает исключение по адресу, принадлежащему драйверу в котором произошла ошибка. Этого не происходит при страницах размером 4 Мб.

Также минимальный размер физической памяти, для включения больших страниц, можно установить, просто добавив требующееся значение LargePageMinimum в виде DWORD в ключ реестра HKEY_LOCAL_MACHINE\Session Manager\Memory Management. При включенном Driver Verifier размер страниц всегда 4 Кб, и запись в защищённые от записи участки ядра, опять же, вызывает исключение.

В новом ядре уменьшена необходимость устанавливать spin lock для ряда операций, в частности, при работе со страничной организацией памяти. Помимо этого, установлен новый механизм синхронизации - "Push lock", защищающий данные из paged pool при работе на уровне ядра. У этого механизма есть, как минимум, два основных преимущества. Во-первых, размер: при работе со страницами в качестве параметра передается лишь адрес (4 байта для 32-разрядных и 8 байт для 64-разрядных систем). Во-вторых, при инициализации и освобождении не используется spin lock, что на многопроцессорных конфигурациях весьма выгодно. Из-за реализации страничной организации памяти на уровне ядра, Push Lock нельзя использовать на IRQL >= DISPATCH_LEVEL. При этом Windows XP "научилась" использовать команды SYSENTER и SYSEX-IT новых процессоров (речь идёт о Pentium II и выше) для вызова кода уровня ядра из уровня пользователя. Для процессоров, не поддерживающих эти команды, остаётся действительным вызов через Int 0x02E, который, естественно, медленнее.

Что же касается установки драйверов на Windows XP, то Hardware Installation Wizard позволяет восстанавливать ранее существовавший драйвер и inf-файл после установки нового. Эта возможность предоставляет не только защиту от некачественных драйверов, но и возможность гораздо более эффективно восстанавливать предыдущую конфигурацию во время тестирования. Если драйвер препятствует загрузке системы, последнюю можно загрузить, воспользовавшись Last Known Good из меню загрузки. В Windows XP эта опция не только восстанавливает записи в реестре, но и сам файл драйвера, если новый драйвер заменяет старый. Кроме этого, Windows XP представляет новую возможность - защиту драйверов. Система блокирует установку драйверов, которые могут навредить ей, а сам список этих драйверов хранится в базе данных \Windows\Drvmain.sdb.

У самого инструмента Driver Verifier появилось еще несколько возможностей, таких как, например, проверка использования адаптеров, буферов и регистров DMA (DMA Verification), а также обнаружение нарушения иерархии при использовании механизмов синхронизации(Deadlock Detection). Кроме того, появился механизм слежения за взаимодействием SCSI-минипорта с драйвером класса (SCSI Verification), тест драйвера на поддержку PnP (меняет местами порядок нумерации PnP устройств), power management и WMI (посылает неверные запросы) и фильтров (вставляет произвольный фильтр в стек драйверов WDM) - это Enhanced I/O Verification, которая может быть включена отдельно от базового I/O Verification.

Помимо указанных отличий, также есть существенное изменение в Memory Manager системы Windows XP, влияющее на работу функций ZwMapViewOfSection и MmMapLocked-Pages-SpecifyCache. В предыдущих версиях ядра NT (4.0 и 5.0) драйвер должен был проверить, что физическая страница памяти ещё не была спроецирована с другими атрибутами кэширования. В противном случае происходила ошибка, которая могла привести к непредсказуемым последствиям. Memory Manager нового ядра при попытке спроецировать страницу с другими атрибутами сам определяет и использует правильные атрибуты. Если же определить их оказывается невозможно, ZwMapViewOfSection возвращает STATUS_CONFLICTING_ADDRESSES, a MmMap-LockedPagesSpecifyCache - NULL.

В Windows XP появился новый способ организации фильтров файловой системы. Оговорюсь сразу, что в DDK этого нет, так как работа с файловой системой производится с помощью IFS Kit (Installable File System Kit). Собственно, нововведение состоит в том, что драйвер файловой системы регистрирует функции так, чтобы компоненты NT могли взаимодействовать с драйверами файловой системы и выполнять операции ввода-вывода без помощи IRP. Система может обходить фильтры для ряда функций, которые могут вызвать сбой в работе (вызовы перед и после записи кэшированной информации на диск, записи "грязных" страниц обратно
в файл). Дело в том, что если фильтр не передаст эти вызовы нижележащему драйверу, может произойти повреждение файловой системы или даже сбой работы (естественно, помимо этого существует много способов вызвать сбой работы системы из фильтра). Windows XP представляет новую функцию FsRtlRegisterFileSystem FilterCallbacks, которую могут использовать драйверы фильтров для регистрации функций для возможных операций. Так, фильтр сможет изучить все вызовы и даже провалить их, а система будет сама вызывать при необходимости нижележащий драйвер.