Page 82 - 4989
P. 82
3. Шинний драйвер складає список всіх пристроїв,
підключених до шини. Для кожного знайденого пристрою
створюється об'єкт PDO;
4. На кожен PDO надсилається запит
IRP_MN_QUERY_DEVICE_RELATION, у відповідь на який
шинний драйвер повертає ідентифікатори всіх знайдених
пристроїв;
5. На ці PDO надсилається запит IRP_MN_QUERY_ID, у
відповідь на який драйвер системної шини повідомляє
ідентифікатори цих пристроїв;
6. Отримавши ідентифікатори, система намагається знайти і
завантажити драйвери пристроїв;
7. Знайшовши драйвер для пристроїв, система завантажує
його в пам'ять, викликаючи його DriverEntry. Потім викликається
AddDevice, де створюється FDO для пристрою. Якщо пристроїв,
керованих цим драйвером, кілька, то AddDevice буде викликана
для кожного пристрою. Якщо в реєстрі зареєстровані додаткові
фільтри, то вони також завантажуються в пам'ять. Потім система
посилає на FDO запит IRP_MN_START_DEVICE;
8. Відбувається посилка на FDO запиту
IRP_MN_QUERY_DEVICE_RELATIONS. Якщо пристрій сам є
шиною або тримає на собі інші пристрої, якими саме не керує, то
для пристрою на ньому повторюється вся послідовність дій,
починаючи з пункту 5.
Функція AddDevice, що викликається для кожного FDO,
викликає IoCreateDevice і IoAttachDeviceToStack, забезпечуючи
побудову стеку пристроїв. Стек пристроїв забезпечує
проходження запитів від призначених для користувача програм
до апаратного (нижнього) рівня драйверів.
При відстеженні обміну даними драйвер-фільтр може
отримувати повідомлення про те, що деякий переданий запит був
завершений нижчестоящим драйвером. Механізм повідомлення
полягає в тому, що викликом спеціальної функції
IoSetCompletionRoutine фільтр звертається до стека в пакеті IRP.
У позиції стека, наступного за поточною позицією, він
встановлює в спеціальному полі адресу функції завершення
(completion routine). Потім при передачі пакета по ланцюжку
позиція стека збільшується.
82