Точка входа. NTSTATUS DriverEntry (PDRIVER_OBJECT DriverObject,
NTSTATUS DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
Структура DRIVER_OBJECT документирована лишь частично, но есть в краденых исходниках
typedef struct { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; void RtlInitUnicodeString (PUNICODE_STRING DestinationString, PWSTR SourceString); Доступно и из kernel mode, и из user mode.
RegistryPath = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\имя_переданное_в_StartService
1. Убедиться, что можно загружаться.
2. Создать устройство.
NTSTATUS IoCreateDevice (PDRIVER_OBJECT DriverObject, ULONG DeviceExtensionSize, PUNICODE_STRING DeviceName, DEVICE_TYPE DeviceType, ULONG DeviceCharacteristics, BOOLEAN Exclusive, PDEVICE_OBJECT* DeviceObject); Device extension – хранилище глобальных данных устройства Если в DeviceCharacteristics установлен бит FILE_PNP_AUTOGENERATED_DEVICE_NAME, то DeviceName может быть NULL, тогда имя устройства сгенерится через PNP DeviceType может быть стандартным (FILE_DEVICE_DISK, FILE_DEVICE_PRINTER и т.д.) либо нестандартным (произвольное целое чисдо) В DeviceCharacteristics обычно выставлен только бит FILE_DEVICE_SECURE_OPEN – проверять права доступа при обращениях к устройству, может быть 0 – тогда это обязан делать сам драйвер (если ему не по барабану). Также есть биты FILE_REMOVABLE_MEDIA, FILE_READ_ONLY_DEVICE и т.п. Exclusive должно быть FALSE
Например: Status = IoCreateDevice (DriverObject, 0, &DeviceName, FILE_DEVICE_NSD, 0, FALSE, &pNsdDeviceObject);
Желательно сразу сделать DeviceObject->Flags |= DO_BUFFERED_IO;
3. Создать линк. NTSTATUS IoCreateSymbolicLink (PUNICODE_STRING SymbolicLinkName, PUNICODE_STRING DeviceName); L”\\Device\\NSD”, L”\\DosDevices\\NSD”
4. Заполнить таблицу обработчиков. pDriverObject->DriverUnload = NsdUnload; pDriverObject->MajorFunction[IRP_MJ_CREATE] = NsdOpen; pDriverObject->MajorFunction[IRP_MJ_CLOSE] = NsdClose; pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NsdIoctl; Всего может быть до 15 обработчиков (14+1)
5. Вернуть STATUS_SUCCESS либо что-то иное, если драйвер не загрузился. В последнем случае устройство и линк надо удалить: NTSTATUS IoDeleteSymbolicLink (PUNICODE_STRING SymbolicLinkName); void IoDeleteDevice (PDEVICE_OBJECT DeviceObject);
|