Page 84 - 4989
P. 84
Масив MajorFunctions заповнюється адресами процедур
обробки IRP пакетів. Процедура, зареєстрована під номером N,
обробляє IRP пакет з кодом N. Зазвичай драйвери
використовують не всі ці процедури, а реєструють тільки
потрібні. Інші ж елементи масиву заповнюються адресою
процедури, яка виконує передачу пакета нижче по стеку
драйверів.
Функція AddDevice реєструється, якщо драйвер підтримує
PnP. Один з головних обов'язків AddDevice - це створення об'єкта
пристрою FDO і якщо необхідно, підключення його до стека
драйверів пристрою. Ця функція може створити кілька об'єктів
пристроїв і підключити їх до різних стеків.
Процедура DriverUnload необхідна для того, щоб надати
драйверу можливість вивантаження. Вона зобов'язана видалити
всі символічні посилання, всі об'єкти пристроїв, відключити
(якщо потрібно) переривання від об'єктів, очистити пам'ять за
собою. У PnP драйвери всі ці дії покладені на обробник пакетів
IRP_MJ_PNP.
8.3.4 Стек драйверів клавіатури
Фізичний зв'язок клавіатури з шиною здійснює
мікроконтролер клавіатури Intel 8042. На сучасних комп'ютерах
він інтегрований у чіпсет материнської плати. Даним
мікроконтролером управляє функціональний драйвер i8042prt.
Драйвер i8042prt створює два безіменних об'єкти «пристрій» і
підключає один до стека клавіатури, а інший до стека миші.
Поверх пристроїв драйвера i8042prt розташовуються іменовані
об'єкти «пристрій» драйверів Kbdclass і Mouseclass. Драйвери
Kbdclass і Mouseclass є так званими драйверами класу і
реалізують загальну функціональність для всіх типів клавіатур і
мишей, тобто для всього класу цих пристроїв. Обидва ці драйвера
встановлюються як високорівневі драйвери.
У цій роботі необхідно розглянути тільки IRP типу
IRP_MJ_READ, які несуть з собою коди клавіш. Генератором цих
IRP є потік необробленого вводу RawInputThread системного
процесу csrcc.exe. Цей потік відкриває об'єкт «пристрій»
драйвера класу клавіатури для ексклюзивного використання і
84