Підтримка Plug and Play з боку драйвера
Для підтримки Plug and Play в драйвері повинна бути реалізована процедура диспетчеризації Plug and Play, а також процедура додавання пристрою. Однак драйвери шин повинні підтримувати типи запитів Plug and Play, відмінні від тих, які підтримуються функціональними драйверами і драйверами фільтрів. Так, при перерахуванні пристроїв в процесі завантаження диспетчер PnP запитує у драйверів шин опис пристроїв, знайдених ними на своїх шинах. B це опис входять дані, унікально ідентифікують кожен пристрій, а також вимоги пристроїв до апаратних ресурсів. Диспетчер PnP приймає цю інформацію і завантажує функціональні драйвери або драйвери фільтрів, встановлені для знайдених пристроїв. Потім він викликає процедуру додавання пристрою кожного драйвера, встановленого для кожного пристрою.
Виконуючи процедуру додавання пристрою, функціональні драйвери і драйвери фільтрів готуються почати управління своїми пристроями, але насправді поки що не взаємодіють з ними. Вони чекають команду startdevice, яку диспетчер PnP повинен передати їх процедурам диспетчеризації Plug and Play. До передачі цієї команди диспетчер PnP виконує арбітраж ресурсів, щоб вирішити, які ресурси виділити того чи іншого пристрою. B команді start-device вказуються призначені ресурси, певні диспетчером PnP при арбітражі ресурсів. Отримавши команду start-device, драйвер може налаштувати свій пристрій на використання зазначених ресурсів. Якщо програма намагається відкрити пристрій, який не готове до початку роботи, вона отримує код помилки, який вказує на відсутність цього пристрою.
Після запуску пристрою диспетчер PnP може посилати драйверу додаткові PnP-команди, в тому числі пов'язані з видалення пристрою з системи або перерозподілу ресурсів. Наприклад, коли користувач запускає утиліту, показану на рис. 9-23, - для її запуску треба натиснути правою кнопкою миші значок плати PC Card на панелі завдань і вибрати команду Unplug Or Eject Hardware (Відключення або витяг апаратного пристрою), - і командує Windows витягти PCMCIA-плату, диспетчер PnP посилає повідомлення query- remove кожному з додатком, зареєстрованому на отримання PnP-повідомлень про цей пристрій. Як правило, додатки реєструються на отримання повідомлень через свої описатели пристрої, які вони закривають, отримуючи повідомлення query-remove. Якщо ні один додаток не накладає вето на запит query-remove, диспетчер PnP посилає команду query-remove драйверу, керуючому вилученими пристроєм. Ha цьому етапі драйвер вирішує, що йому робити далі: заборонити видалення пристрою або завершити всі операції введення-виведення на цьому пристрої та припинити подальший прийом запитів на введення-виведення, які направляються пристрою. Якщо драйвер відповідає згодою на запит про видалення і відкритих описателей пристрою більше немає, диспетчер PnP посилає драйверу команду remove, що вимагає від нього припинити звернення до пристрою і звільнити всі ресурси, виділені їм для даного пристрою.
Мал. 9-23. Утиліта для від'єднання плати PC Card
Коли диспетчеру PnP потрібно перерозподілити ресурси для пристрою, він спочатку запитує драйвер, чи може той тимчасово призупинити операції на пристрої, і з цією метою посилає команду query-stop. Драйвер відповідає на цей запит згодою, якщо немає ризику втрати або пошкодження даних; в іншому випадку він відхиляє такий запит. Як і в разі команди query-remove, драйвер, погодившись із запитом, закінчує незавершені операції введення-виведення і більше не передає цього Вам запит на введення-виведення. (Нові запити на введення-виведення драйвер зазвичай ставить в чергу.) Далі диспетчер PnP посилає драйверу команду stop. Ha цьому етапі диспетчер PnP може вказати драйверу виділити пристрою інші ресурси, а потім послати команду start-device.
Команди Plug and Play викликають перехід пристрою в строго певні стани, які в спрощеній формі представлені на рис. 9-24. (Деякі стану та команди Plug and Play на цій ілюстрації опущені. Крім того, цей варіант відноситься до діаграми станів, що реалізується функціональними драйверами. Діаграма станів, що реалізуються драйверами шин, набагато складніше.) До речі, на рис. 9-24 показано один зі станів, яке ми ще не обговорили, - пристрій переходить в нього після команди surprise-remove диспетчера PnP. Ця команда посилається при несподіваному видаленні пристрою з системи, наприклад через його відмови або через вилучення PCMCIA-плати без застосування відповідної утиліти. Команда surprise-remove змушує драйвер негайно припинити будь-яке взаємодія з пристроєм, так як воно більше не підключено до системи, і скасувати будь-які незавершені запити вводу-виводу.