Тема: Деталі драйверів
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?
Що, звідки і як драйвер отримує в своеї першої функциї???