Блог → Драйверы Windows XP. Часть 3. Отличия драйверов

Как и обещал, заканчиваю цикл статей о Windows XP и предлагаю поговорить об отличиях драйверов XP от более ранней версии - Win 2000. Как и следовало ожидать, XP поддерживает модель WDM, и чтобы создать WDM-драйвер, нужно использовать wdm.h вместо ntddk.h и чётко следовать спецификации WDM. При этом сама Microsoft настоятельно рекомендует создавать новые драйверы исключительно согласно спецификации WDM, только если они не должны быть включены в стек существующих не-WDM-драйверов. Также все новые стеки драйверов должны состоять из WDM-драйверов.

Система предоставляет новые, безопасные для отмены IRP, очереди. Они инициализируются с помощью функции IoCsqInitialize. Windows XP автоматизирует процесс отмены пакетов, и драйверы, работая с очередями IRP, уже не обязаны заботится об отмене пакетов. Основная проблема при отмене IRP в драйвере - в синхронизации между закрытыми сбросом и очередью драйвера. При этом XP абстрагирует операцию отмены, позволяя драйверу вести очередь и контролировать синхронизацию. Драйвер предоставляет функции для вставки и изъятия IRP из очереди, а также закрывает доступ (lock) на время выполнения этих операций.



В задачи драйвера также входит слежение за тем, чтобы память для очереди была из нужной области. Когда драйвер добавляет пакет в очередь, он не должен вызывать свою функцию для вставки, вместо которой драйвер использует IoCsqInsertIrp. Для удаления IRP из очереди драйвер указывает либо пакет для изъятия, либо NULL - для первого IRP. Как только IRP "вытаскивается" из очереди, он уже не может быть отменен. Предполагается, что драйвер закончит его отработку.

Что ещё? Появились очереди spin lock. На многопроцессорных конфигурациях использование нового механизма синхронизации гарантирует соблюдение механизма FIFO. Для использования этой синхронизации следует инициализировать spin lock с помощью KelnitializeSpinLock, а получить его и освободить можно с помощью функций KeAcquireInStack-QueuedSpinLock и KeReleaseIn-StackQueuedSpinLock. Перед этим драйвер должен выделить память для структуры KLOCK_QUEUE_HANDLE, которая передается в указанные две функции. Также для queued spin lock нельзя вызывать функции обычного spin lock KeXxxSpinLock. Обратите внимание, что Microsoft рекомендует использование этого механизма синхронизации вместо обычного spin lock для Windows XP и последующих версий.

В-общем, модель WDM предполагает совместимость на уровне исходных кодов, так что проблем при переводе драйверов от Windows 2000 к Windows XP возникнуть не должно. Правда на деле, из-за изменённой структуры директорий новой DDK, специфичного файла заголовка может не оказаться на месте, но эти случаи довольно редки. В этом случае просто посмотрите, где этот файл расположен в новой версии. Более часты случаи, когда драйвер с ранее доступной функцией не компилируется для Windows XP. Все подобные моменты можно найти в документации DDK, если набрать название искомой функции в индексе.