1 Востаннє редагувалося Дмитро-Чебурашка (12.04.2018 16:16:03)

Тема: Деталі драйверів

DriverEntry proc near public, DriverObject:PDRIVER_OBJECT, RegistryPath:PUNICODE_STRING
    LOCAL        Status:DWORD
    mov Status,STATUS_SUCCESS

Це типовий початок коду якогось драйвера, так би вимовляючісь.

Або щось подібне ж в такої формі

.text:00010280 ; NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
.text:00010280                 public DriverEntry
.text:00010280 DriverEntry     proc near               ; DATA XREF: HEADER:000100D8o
.text:00010280                                         ; HEADER:000100DCo ...
.text:00010280
.text:00010280 var_4           = dword ptr -4
.text:00010280 DriverObject    = dword ptr  8
.text:00010280 RegistryPath    = dword ptr  0Ch
.text:00010280
.text:00010280                 push    ebp
.text:00010281                 mov     ebp, esp

Або навить якость так

DriverEntry proto DriverObject:PDRIVER_OBJECT, RegistryPath:PUNICODE_STRING

driver object

об'єкт(завантажувальний образ драйвера, використовуваний в привілейованому режимі для визначення потрібних точок входу драйвера) драйвера
Приклади з текстів

"You detained the goods, not the driver," objected the slimy.
- Ви затримали не водія, а вантаж, - заперечив слизовий.
Strugatsky, Arkady, Strugatsky, Boris / The Ugly Swans
Стругацкий, Аркадій, Стругацкий, Борис / Бридкі лебеді

Додати в мій словник
driver object
об'єкт драйвера

Таблиця 8.1. Параметри виклику функції DriverEntry
NTSTATUS DriverEntry IRQL == PASSIVE _ LEVEL
Параметри Опис
IN PDRIVER _ OBJECT pDriverObject Адреса об'єкту драйвера
IN PUNICODE _ STRING pRegistryPath Шлях в регістрі до підрозділу драйвера
Повертане значення - STATUS _ SUCCESS
- STATUS _ XXX - код помилки

Отримавши від Диспетчера введення/виведення покажчик на структуру DRIVER _ OBJECT(див. заголовні файли DDK ntddk.h або wdm.h), драйвер повинен заповнити в ній певні поля, а саме:

Поле pDriverObject ->DriverUnload - для реєстрації власної функції Unload, яка викликається перед вивантаженням драйвера.
Поле pDriverObject ->DriverStartIo - для реєстрації власної функції StartIo, яка потрібна для організації обробки черги необроблених запитів System Queuing.
Поле pDriverObject ->DriverExtension ->AddDevice - в структурі розширення об'єкту драйвера DRIVER _ EXTENSION(см ntddk.h або wdm.h), в якому WDM драйвер реєструє власну процедуру AddDevice.
У масиві pDriverObject ->MajorFunction[IRP _ MJ _ Xxx] драйвер реєструє точки входу у власні робочі процедури.

Реєстрація робочих процедур відбувається зазвичай у виді:

DriverObject ->MajorFunction[IRP _ MJ _ READ]= ReadWrite _ IRPhandler;
DriverObject ->MajorFunction[IRP _ MJ _ WRITE]=ReadWrite _ IRPhandler;
DriverObject ->MajorFunction[IRP _ MJ _ DEVICE _ CONTROL]=
DeviceControlRoutine;



Загалом, це частково зрозуміло, проте хотілося б, що б хтось освітив словами це питання дуже детально.

Де прописані-описані ці структури? Якщо це код драйверу, він адже в першій функції їх звідки - те отримує?
То значить, не в ньому! Як скомпілювати драйвера яким-небуть асемблером, не використовуючи DDK ntddk.h або wdm.h?

Що, звідки і як драйвер отримує в своеї першої функциї???