Пишу kernel-mode драйвер на С++ для Windows.
Отлаживаю его через SoftICE и DebugView.
Есть такой код:
Код
#include <ntddk.h>
#include <wdf.h>
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD EvtDeviceAdd;
VOID Unload(_In_ PDRIVER_OBJECT pDriverObject) {
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "Unload driver"));
DbgPrint("Unload Driver");
IoDeleteDevice(pDriverObject->DeviceObject);
return;
}
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
NTSTATUS status = STATUS_SUCCESS;
WDF_DRIVER_CONFIG config;
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "Driver Entry has been started"));
DbgPrint("Driver Entry");
WDF_DRIVER_CONFIG_INIT(&config, &EvtDeviceAdd);
status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
DriverObject->DriverUnload = &Unload;
return status;
}
NTSTATUS EvtDeviceAdd(_In_ WDFDRIVER Driver, PWDFDEVICE_INIT DeviceInit) {
UNREFERENCED_PARAMETER(Driver);
NTSTATUS status = STATUS_SUCCESS;
WDFDEVICE hDevice;
KdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "Device has been added"));
DbgPrint("Device Added!");
status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &hDevice);
return status;
}
Я его компилирую, подписываю, регистрирую и запускаю.
Смотрю в DebugView - вижу сообщение "Driver Entry", т.е была вызвана функция DriverEntry.
После чего драйвер просто то-ли зависает, то-ли не доходит до следующей функции, потому что сообщение "Device Added" не появляется, а при попытке
sc stop MyDriver
- получаю ошибку
[SC] ControlService: ошибка: 1052:
Команда неуместна для данной службы.
В чём проблема? Драйвер удаляется только после перезагрузки. Не очень-то удобно, вдруг я пишу "одноразовый драйвер", и не хочу перезагружаться, что бы его использовать, а после сразу выгрузить?