я в лабораторній роботі. Ім'я - IOCTL_GET. br/>
В
У разі віртуального пристрою файловий прапор дорівнює 0.
Тип пристрою - FILE_DEVICE_UNKNOWN = 22h
Права доступу - FILE_READ_ACCESS + FILE_WRITE_ACCESS = 1 +2 = 3 = 11b
Функціональний код - в діапазоні від 800h до FFFh. У нас - 800h. p align="justify"> Метод буферизації - спосіб передачі даних між додатком і драйвером (можливі три):
Для невеликого обсягу даних використовується зазвичай METHOD_BUFFERED (00b) - виділяється додатковий буфер у нестранічной пам'яті, достатній для розміщення вхідного і вихідного буфера. Адреса цього буфера розміщується в IRP в полі AssociatedIrp.SystemBuffer. Диспетчер в/вив сам бере на себе роботу перезапису даних між користувальницьким і додатковим буфером. p align="justify"> Прямий доступ до даних (без буфера) - METHOD_OUT_DIRECT (2) - для виведення або METOD_IN_DIRECT (1) - для введення; поле з IRP - MdlAddress. Це безпосереднє звернення - диспетчер в/вив фіксує в пам'яті фізичні сторінки, що містять буфер користувача режиму. При цьому створює допоміжну структуру MDL (Memory Descriptor List) для опису зафіксованих сторінок. І розробник драйвера працює з MDL. p align="justify"> Доступ через буфер користувача рівня - METHOD_NEITHER (3); поле з IRP - SystemBuffer. Диспетчер в/вив передає в драйвер віртуальні адреси користувацького режиму. І в драйвері потрібно дуже обережно з ними працювати, тому що драйвер в цьому випадку повинен працювати тільки в контексті викликає потоку. p align="justify"> Коли додаток посилає драйверу код дії, то починає роботу диспетчер вводу-виводу. Він відповідає за формування пакета запиту вводу-виводу (I/O request packet, IRP) і посилку його драйверу для подальшої обробки. p align="justify"> Ми будемо розглядати 3 типи запитів:
IRP_MJ_CREATE - буде переданий при CreateFile,
- IRP_MJ_DEVICE_CONTROL - буде переданий при DeviceIoControl
- IPR_MJ_CLOSE - при CloseHandle
Пакет IRP складається із заголовка і стеків розміщення в/вив. Диспетчер в/вив створює кількість осередків стека в/вив рівне числу драйверних шарів, що беруть участь в обробці запиту. Кожному драйверу дозволений доступ до власної комірці стека. Коли драйвер передає пакет IRP драйверу нижнього рівня, покажчик на клітинку стека переміщається на клітинку, необхідну цього драйвера. І, навпаки, після обробки запиту, покажчик піднімається вгору на клітинку драйвера вищого рівня. Отримання покажчика за допомогою функції - IoGetCurrentStackLocation (). br/>В
У кожному стеці розміщення знаходиться покажчик на об'єкт-пристрій DeviceObject і на об'єкт-файл FileObject, для якої ініційований запит. Пакети IRP завжди зберігаються у невивантажуваного пам'яті. br/>
В
Для р...