[Previous] [Next]

Вариант 2. Модификация драйвера для работы с прерываниями

И хотя второй вариант драйвера не улучшает соотношения "перенос/прерывание", в нем рассматриваются несколько приемов, которые часто встречаются в драйверах Windows, исходные тексты которых доступны для анализа.

Прежде всего, это — использование системных очередей IRP пакетов для обеспечения сериализации при доступе к обслуживаемому устройству. Во-вторых, в приведенном ниже примере демонстрируется способ синхронизации работы драйвера и вызывающего его приложения по совместно используемому событию. В-третьих, используется более традиционная схема использования DPC процедур для завершения работы по поводу прерывания, которая связывает только одну DPC процедуру с объектом устройства и использует вызовы IoInitializeDpcRequest и IoRequestDpc. Наконец, практически показано, как можно использовать для хранения временной информации незадействованные поля IRP пакетов, здесь — Parameters.DeviceIoControl.Type3InputBuffer в составе текущей (на момент обработки) ячейки стека IRP пакета.

Помимо упомянутых отличий, в драйвере используется механизм IOCTL запросов от приложения для операций чтения и записи в устройство, тогда как обработчиков запросов от Win32 вызовов WriteFile и ReadFile в данной реализации драйвера нет вовсе.

Условия компиляции и сборки драйвера и тестирующего приложения не изменились.