руктурованістю - передаються саме файли, а не блоки інформації (кадри або складені з них транзакції), що визначаються протоколом обміну по USB.
Рис. 5. Стек пристроїв
1.3.2 Точки входу WDM-драйвера
WDM-драйвери відрізняються від успадкованих драйверів тим, що повинні містити додаткові точки входу для підтримки PnP, і, в цілому, вони більш логічні за структурою. Наведемо список точок входу і коротко охарактеризуємо їх призначення:
NTSTATUS DriverEntry (
IN PDRIVER_OBJECT DriverObject,//покажчик на об'єкт драйвера
IN PUNICODE_STRING RegistryPath)//шлях до підрозділу регістра,
//відноситься до драйверу
Ця функція виконується при завантаженні драйвера операційною системою. У WDM-драйверах на DriverEntry покладені обов'язки з реєстрації всіх інших точок входу драйвера.
NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject,//покажчик на об'єкт драйвера PDEVICE_OBJECT PhysicalDeviceObject)//покажчик на батьківський PDO
У драйверах, що підтримують PnP, через цю точку входу менеджер PnP посилає драйверу повідомлення про виявлення пристрою, за яке має відповідати драйвер. Функція AddDevice повинна створити об'єкт пристрою за допомогою виклику IoCreateDevice і при необхідності приєднати його до стека пристроїв за допомогою IoAttachDeviceToDeviceStack.DriverUnload (PDRIVER_OBJECT DriverObject)//покажчик на об'єкт драйвера
Викликається при вивантаженні драйвера. У цій функції повинні осво
няється все витребувані драйвером ресурси. Драйвери WDM-моделі
виконують ці дії в обробнику запитів IRP_MJ_PNP з субкодом IRP_MN_REMOVE_DEVICE, тобто при видаленні пристрою з системи. Слід виділити окремий клас точок входу драйвера, які призначені для обробки IRP-пакетів з різними кодами операцій. Ці точки входу реєструються при завантаженні драйвера у функції DriverEntry. Реєстрація проводиться шляхом заповнення елементів масиву MajorFunction адресами діспетчерізуемих функцій. Індексом в цьому масиві є коди IRP_MJ_XXX, тобто описані числами типи пакетів IRP. Диспетчер введення/виводу, орієнтуючись на заповнення цього масиву, викликає потрібні функції драйвера.
1.3.3 Пакет запиту вводу/виводу (IRP)
Пакети вводу/виводу (IRP-пакети) використовуються для передачі запитів до драйверу від його клієнтів. Вони є структурами даних змінної довжини, і складаються з стандартного заголовка, що містить загальну облікову інформацію, і одного або декількох блоків параметрів, званих осередками стека вводу/виводу (I/O Stack Location).
Наведемо структуру заголовка IRP-пакета:
Таблиця 1. Структура заголовка IRP-пакета
ПоляОпісаніеIO_STATUS_BLOCK IoStatusСтатус запросаPVOID AssociatedIrp.SystemBufferУказатель на системний буфер для випадку, якщо пристрій підтримує буферізованние введення/виводPMDL MdlAddressУказатель на MDL-список у випадку, якщо пристрій підтримує пряме введення/виводPVOID UserBufferАдрес користувальницького буфера для введення/виводаBOOLEAN CancelІндікатор того, що IRP-пакет повинен бути анульований
Основне призначення осередків стека вводу/виводу полягає в тому, щоб зберігати функціональний код і параметри запиту на введення/висновок. Нижче, в таблиці 1.5.2 наводяться поля осередків стека вводу/виводу, до яких драйвер може звертатися безпосередньо за вказівником (чого не рекомендується робити для інших полів):
Таблиця 2. Структура осередку стека вводу/виводу
ПоляОпісаніеUCHAR MajorFunctionКод IRP_MJ_XXX, що описує призначення операцііUCHAR MinorFunctionСубкод операцііPDEVICE_OBJECT DeviceObjectУказатель на об'єкт пристрою, якому був адресований даний об'єкт IRPPFILE_OBJECT FileObjectФайловий об'єкт для даного запиту, якщо він заданunion Parameters (трактування визначається значенням MajorFunction) struct ReadПараметри для IRP типу IRP_MJ_READ:ULONG Length ULONG Key LARGE_INTEGER ByteOffsetstruct WriteПараметри для IRP типу IRP_MJ_WRITE: ULONG Length ULONG Key LARGE_INTEGER ByteOffsetstruct DeviceControlПараметри для IRP типу IRP_MJ_DEVICE_CONTROL: ULONG OutputBufferLength ULONG InputBufferLength ULONG IoControlCode PVOID Type3InputBuffer
Наведемо графічне представлення структури IRP-пакета:
Рис. 6. Структура IRP пакету
Спілкування з USB-пристроями в ОС Windows NT на рівні драйверів, як було сказано в розділі внутрішньої організації USB, відбувається за допомогою передачі URB-пакетів. Покажчики на URB-пакети містять осередки стека IRP-пакета, доступ до цих вказівниками здійснюється наступним чином:
......