Программирование драйверов Windows

Программирование драйверов Windows

Коды ошибочных ситуаций
Загрузка операционной системы
Подготовка к загрузке
Начальная стадия загрузки
Стадия загрузки
Распознавание оборудования
Выбор конфигурации
Загрузка ядра

Инициализация ядра
Вывод на экран информации о процессе загрузки


Некоторые стандартные параметры описания драйвера в Системном Реестре
Параметр DisplayName
Параметр ErrorControl
Параметр ImagePath
Параметр Start
Параметр Туре
Параметры подраздела \Enum

Драйверы. Общие понятия и термины
Драйверы: крупный план. Unix-Linux, DOS-Windows
Словарь разработчика драйвера
Abstraction
Structure
Union
Object
Kernel mode
User mode

Callback, callback function
Context
Routine
ISR, Interrupt Service Routine
DpcForISR, Deferred Procedure Call for Interrupt Service Routine
Deferred Procedure Call
IOManager
IRP, Input/output Request Packet, IRP request, IRP packet
IO stack location

Dispatch Routines
Major IRP Code
IOCTL
Minor IRP Code
DriverEntry
WDM, Windows Driver Model
Layering
AddDevice
Device Instance
Device Object, PDO, FDO

Device Extension
Symbolic Link
Device Stack, Driver Stack
Monolithic Driver
Legacy Driver, NT Style Driver
IRQL, Interrupt ReQuest Level
IRQ, Interrupt Request Line
DIRQL
Polling
Virtual Memory

System Paging File
User Space
Pool Memory
Paged Memory, Paged Pool
Nonpaged Memory, Nonpaged Pool
Scatter/Gather Problem
DMA, Direct Memory Access
Access Violation
SEH, Structured exception handling
Thread, Thread Object

Process, Process Object
Affinity
Synchronization Objects
PnP Manager
Enumeration
Enumerator
ACPI
ACPI Driver
Filter Device Object
Filter Driver

HAL, Hardware Abstraction Layer
Registry
Hardware branch
CurrentControlSet
LastKnownGood
Unicode
DeviceID
Class Driver
Port Driver
Minidriver

Источники информации
Печатные издания на русском языке
Издания, которые не были переведены на русский язык
Материалы из пакетов разработки драйверов третьих фирм
Программные продукты от Microsoft
Документация Microsoft DDK
Online документация Microsoft
Заключение
Программные средства, применяемые при разработке драйверов

Программные средства от Microsoft
Настройки проекта в Visual Studio 7 Net
Компиляция и сборка драйвера утилитой Build пакета DDK
Программа Depends
Программа ReBase
Программа ErrLook
Программа GuidGen (UUIDGEN)
Программа редактирования Системного Реестра
Программа DeviceTree

Программа DevCon
Программа DevCtl
Программы ChkInf и GenInf
Программа Task Manager (Диспетчер Задач)
Системный апплет "Производительность"
Программное средство тестирования драйвера Driver Verifier
Программное средство проверки логики функционирования PreFast
Программные средства из пакетов разработки драйверов от третьих фирм
Программа Monitor от CompuWare Corporation
Программа трансляции файла sources в проект Visual Studio

Программа Numega SymLinks
Программные средства от Марка Руссиновича и SysInternals
Программа RegMon
Программа WinObj
Программа DebugView
Программа DebugPrint
Программа DevView от Уолтера Оней
Программа PoolTagот OSR Inc
Программа просмотра файлов
Программа РЕ Explorer

Дизассемблер IDA
Программы Свена Шрайбера
Программа w2k_svc
Программа w2k_sym
Программа w2k_mem
Программы от SmidgeonSoft
Программа PEBrowseProfessional Interactive
Программа NTDevices
Программа NTObjects
Программа System Memory Browse

Простой драйвер "в-стиле-NT": Example.sys
Процедура DriverEntry и предварительные объявления
Функция CompleteIrp
Рабочая процедура обработки запросов read/write
Рабочая процедура обработки запросов открытия драйвера
Рабочая процедура обработки запросов закрытия драйвера

Рабочая процедура обработки IOCTL запросов

Программирование драйверов Windows

Рабочая процедура выгрузки драйвера
Заголовочный файл Driver.h
Компиляция и сборка драйвера Example.sys
Файл Makefile
Файл Sources
Компиляция и сборка при помощи утилиты Build
Инсталляция и запуск драйвера Example.sys
Инсталляция внесением записей в Системный Реестр
Модификация Системного Реестра Windows 98
Модификация Системного Реестра Windows 2000, XP, Server2003

Запуск драйвера
Инсталляция с использованием INF файла
Инсталляция с использованием программы Monitor
Инсталляция с использованием сервисов SCM Менеджера
Приложение для тестирования драйвера Example.sys

Работа с драйвером Example.sys
Архитектура Windows NT 5. Введение
Цели разработки
Уровни аппаратных привилегий в Windows NT 5

Переносимость
Расширяемость
Производительность
Исполнительные компоненты
Интерфейс системных служб
Менеджер (диспетчер) объектов
Менеджер конфигурирования
Менеджер процессов
Менеджер виртуальной памяти
Средства локальных процедурных вызовов

Диспетчер (менеджер) ввода/вывода
Расширения базовой операционной системы
Расширения базовой операционной системы - 2
Подсистема Win32
Другие существенные компоненты операционной системы
Цели разработки подсистемы ввода/вывода
Типы драйверов Windows NT5

Специальные драйверные архитектуры
Отличия между версиями
Прикасаясь к аппаратуре
Основные сведения об аппаратном обеспечении
Автоматическое распознавание и конфигурирование

Регистры устройств
Доступ к регистрам устройств
Пространство ввода/вывода
Доступ через адресацию в памяти
Сигналы прерываний
Приоритеты прерываний
Векторы прерывания
Передача сигналов прерываний
Сродство к процессору

Механизмы передачи данных
Программируемый ввод/вывод
Прямой доступ к памяти
DMA операции с использованием системных контроллеров
Операции bus master DMA
Память, отведенная устройству
Ресурсы, используемые устройством
Шины в компьютерных системах
ISA: Industry Standard Architecture
EISA: Extended Industry Standard Architecture

PCI: Peripheral Component Interconnect
Доступ к регистрам
Механизмы прерываний
Возможности DMA
Память, отведенная устройствам

IEEE 1394: Firewire Bus
Автоматическое распознавание и конфигурирование
USB: Universal Serial Bus
Автоматическое распознавание и конфигурирование

Шина PC Card (PCMCIA)
Советы по работе с аппаратурой
Архитектура шины
Регистры управления
Получение информации о состоянии устройства и об ошибках
Поведение, связанное с использованием прерываний

Используйте интеллект нового устройства
Тестирование аппаратуры
Контекст выполнения программного кода
Контекст исключения или внутреннего прерывания (trap)
Контекст прерывания
Контекст программного потока режима ядра
Приоритеты выполнения программного кода

Обработка прерываний
Прерывания, вызванные программно
Доступ к областям памяти пользовательских приложений
Способы доступа к буферным областям
Отложенные процедурные вызовы (DPC)
Функционирование DPC
Особенности механизма DPC
Общий взгляд на структуру драйвера режима ядра

Процедуры инициализации драйвера и очистки
Процедура DriverEntry
Процедура ре-инициализации
Процедура выгрузки Unload
Процедура Shutdown
Процедура обратного вызова Bugcheck
Рабочие процедуры обслуживания ввода/вывода
Обработчики запросов Open и Close
Процедуры передачи данных
Процедура StartIo

Процедура обслуживания прерываний
Процедуры DPC
Процедуры обратного вызова для синхронизации доступа к ресурсам
Процедура ControllerControl
Процедура AdapterControl
Процедуры SynchCritSection
Другие процедуры драйвера
Таймерные процедуры
Процедура IoCompletion

Процедура CancelRoutine
Последовательность обслуживания запросов ввода/вывода
Предварительная обработка Диспетчером ввода/вывода
Предварительная обработка в драйвере
Старт операции ввода/вывода
Процедура обслуживания прерываний ISR
Пост-обработка, выполняемая драйвером
Пост-обработка, выполняемая Диспетчером ввода/вывода

Программирование драйверов Windows

Приемы программирования в режиме ядра
Дополнительные описатели типов

Квалификаторы IN, OUT, OPTIONAL
Типы возвращаемых значений функций
Соглашения об именах функций драйвера и системных вызовов
Операции с плавающей точкой
Операции с памятью
Вызовы для выделения и освобождения областей виртуальной памяти

Работа с ассоциативными списками
Работа с MDL списками
Функции библиотеки времени выполнения для работы с памятью

Управление размещением кода драйвера в памяти
Определение размещения при компиляции
Динамическое перемещение кода драйвера в страничную память
Проблемы, возникающие при перемещении кода в страничную память
Фиксация страничных секций кода и данных в оперативной памяти
Проверка корректности вызовов кода, размещенного в страничной памяти
Операции над строками UNICODE_STRING

Операции над строками ANSI символов
Функции для работы с файлами
Функции для работы со ссылками на объекты
Функции для работы с системным представлением времени

Функции для работы с Системным Реестром
Функции доступа к Системному Реестру, предоставляемые Диспетчером ввода/вывода
Функции RtlXxx прямого доступа к Системному Реестру
Работа с Системным Реестром через вызовы ZwXxx
Основные процедуры драйвера

Процедура AddDevice
Процедура Unload
Адресация и доступ к данным в IRP пакетах чтения/записи
Рабочие процедуры драйвера
Пакеты IRР
Заголовок IRP

Ячейки стека ввода/вывода
Набор рабочих процедур
Последовательность действий рабочих процедур
Случай 1: Ошибочная ситуация
Случай 2: Завершение работы над IRP запросом
Случай 3: Работа через очереди IRP пакетов
Рабочие процедуры обслуживания IOCTL запросов

При методе METHOD_BUFFERED
При методе METHOD_IN_DIRECT и METHOD_OUT_DIRECT
При методе METHOD_NEITHER
Обслуживание прерываний

Процедуры отложенного вызова обслуживания прерываний DpcForIsr
Выполнения кода процедуры DpcForIsr
Отключение от источника прерываний

Программирование драйверов Windows

Объекты события
Семафоры

Мьютексы
Спин-блокировки

Взаимоблокировки
Обработка аппаратных прерываний
Постановка эксперимента
Тестовое приспособление CheckIt Loopback Device
Настройка операционной системы

Используемые инструментальные программы
Простейший драйвер для работы с прерываниями
Заголовочный файл Driver.h
Исполняемый код драйвера

Приложение для тестирования драйвера

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

Инсталляция драйверов при помощи INF файлов
Структура INF файла
Секции inf-файла и основные общие правила ввода записей
Секция описания версии [Version]
Секция описания поставщика [Manufacturer]

Секция описания поставщика [Manufacturer] - 2
Секция описания моделей аппаратуры [Models]
Секция описания моделей аппаратуры [Models] - 2
Замечания по декорированию имен
Секция [CopyFiles]
Секции [ServiceInstall]
Секция [ClassInstall32]
Секции [DefaultInstall32.Xxx] и [DefaultInstall32.Xxx.Services]
Секции [DDInstall]

Секция [DDInstall.Services]
Другие секции, определяющие копирование файлов
Секция [SourceDiskNames]
Секция [SourceDiskFiles]
Секция [DestinationDirs]
Примеры описания процедуры копирования файлов
Секция [AddReg]

Значения HKR
Проверка синтаксиса INF файла
Использование INF файлов
Мастер Установки/удаления новой аппаратуры
Установка PnP устройств
Идентификаторы PnP устройств
PnP идентификаторы PCI устройств
PnP идентификаторы SCSI устройств
PnP идентификаторы IDE устройств

PnP идентификаторы USB устройств
PnP идентификаторы устройств IEEE-1394 (FireWire)
Тестирование и отладка
Что следует проверять?
Цифровое подписание драйвера
Драйвер отказывается работать?
Аппаратные проблемы

Программные проблемы
Утечка ресурсов
Торможение программных потоков
Проблема приоритетов времени выполнения
Отслеживание ошибок
Отладчик WinDbg
Директории идентификаторов
Директории исходных текстов
Запуск и окончание отладочной сессии
Отладчик SoftIce

Чтение crash-экранов
Голубой экран смерти (BSOD)
Анализ информации Crash Dump файлов
Общие приемы отладки
Установка фиксированных точек прерывания
Промежуточный вывод на экран
Сохранение отладочного кода в исходном тексте драйвера
Перехват некорректных условий

Использование диагностических callback-функций
Обнаружение утечек памяти
Установка параметров загрузки в файле boot.ini
Частные приемы восстановления системы
Cover
Предисловие

Предисловие от составителя эл. версии
Координаты
Toc