_STACK_LOCATION IrpSp=IoGetCurrentIrpStackLocation (Irp); Urb=IrpSp- gt; Parameters.Others.Argument1;
...
Наведемо часткове оголошення структури з довідкової документації Microsoft. Відзначимо тільки поля, використання яких необхідно в рамках даної курсової роботи:
typedef struct _URB {{_URB_HEADER UrbHeader; _URB_SELECT_INTERFACE UrbSelectInterface; _URB_SELECT_CONFIGURATION UrbSelectConfiguration; _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer;
}
} URB, * PURB;
Поле UrbHeader зберігає інформацію про код URB-пакета, за яким можна визначити, яка операція запитується.
Поля UrbSelectInterface і UrbSelectConfiguration служать для запиту за вибором інтерфейсу і конфігурації пристрою, які будуть використовуватися при роботі з пристроєм. Пакети цієї структури відправляються хостом до пристрою на початку його роботи, при конфігуруванні.
Поле UrbBulkOrInterruptTransfer несе найбільш важливу в рамках даної курсової роботи інформацію - покажчики на блоки введення/виводу USB-пристрої. Наведемо опис структури _URB_BULK_OR_INTERRUPT_TRANSFER: _URB_BULK_OR_INTERRUPT_TRANSFER {_URB_HEADER Hdr; _PIPE_HANDLE PipeHandle; TransferFlags; TransferBufferLength; TransferBuffer; TransferBufferMDL;};
Поля цієї структури описані в наступній таблиці:
Таблиця 3. Поля структури _URB_BULK_OR_INTERRUPT_TRANSFER.
ПолеОпісаніеstruct _URB_HEADER HdrСтандартний заголовок URB-пакета, що містить код запросаUSBD_PIPE_HANDLE PipeHandleДескріптор каналу, на який передаються данниеULONG TransferFlagsФлагі, що визначають напрям передачі даних і спосіб обробки ошібокULONG TransferBufferLengthДліна переданого блоку даних в байтахPVOID TransferBufferУказатель на переданий буфер. Буфер знаходиться в нестранічной памятіPMDL TransferBufferMDLУказатель на MDL-список, що несе передану інформацію. Буфер знаходиться в сторінкової пам'яті
Слід зазначити, що один з покажчиків TransferBuffer або TransferBufferMDL дорівнює NULL, тобто в межах одного пакета передається тільки одна порція даних.
Завдання протоколювання обміну інформацією зводиться до перехоплення і збереженню буферів TransferBuffer і TransferBufferMDL.
. 3.4 Рівні запиту переривань
У кожен момент часу центральний процесор знаходиться на одному з рівнів IRQL (Interrupt Request Level - рівень запитів переривань). Рівні IRQL розташовуються в порядку убування від HIGHEST_LEVEL до PASSIVE_LEVEL. Кожному з переривань (переривання від зовнішніх пристроїв, системні годинник, і т. Д.) Відповідає свій рівень IRQL. Спеціальним діям операційної системи також призначені IRQL. Вони відзначені в нижній частині наведеної таблиці:
Таблиця 4. Рівні запитів переривань
УровеньНазначеніеHIGHEST_LEVELНаівисшій рівень. Всі переривання заблокірованиPOWER_LEVELПрериванія по відмові пітаніяIPI_LEVELМежпроцессорное взаімодействіеCLOCK2_LEVELПрериваніе по системному таймеру 2СLOCK1_LEVELПрериваніе по системному таймеру 1PROFILE_LEVELПрериваніе по таймеру заміру проізводітельностіуровні DRQLОбичние переривання устройствDISPATCH_LEVELДіспетчерізація потоків і виконання відкладених процедурAPC_LEVELВиполненіе асинхронного виклику процедуриPASSIVE_LEVELОбичное виконання коду потоку
Загальне правило обробки рівнів запитів переривань свідчить, що переривання з IRQL, меншим, ніж у виконуваного в даний момент коду, маскуються. Під час виконання коду потоку (користувальницького або системного) встановлюється найменший IRQL=0 (PASSIVE_LEVEL). Робота драйвера найчастіше виконується на рівні IRQL=2 (DISPATCH_LEVEL). Рівні, що лежать над ним, називаються DIRQL (Device IRQL) і виставляються для обробників переривань від зовнішніх пристроїв (ISR - interrupt service routine). Навіть під час виконання ISR драйвера може відбутися переривання з великим IRQL, наприклад, належить іншому драйверу.
Чим вище поточний рівень IRQL виконуваного коду, тим менше функцій йому доступно. Так, наприклад, диспетчер потоків працює на рівні
DISPATCH_LEVEL, і, отже, не буде викликатися, поки на процесорі з рівнем більшим чи рівним DISPATCH_LEVEL виповнюється інший код. Таким чином, на рівнях DISPATCH_LEVEL і вище відключається перемикання потоків. Функції очікування диспетчерських об'єктів (події, м'ютекси, семафори) з відмінним від нуля часом, звернення до файлів, підкачка відсутніх у фізичній пам'яті сторінок - все це також стає недоступним. Для коректного збереження запитів у файлі фільтр в таких випадках повинен застосовувати спеціальну методику.
. 3.5 Повідомлення про завершення запиту нижчест...