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
   77   78   79   80   81   82   83   84   85   86   87