@armadillo-cld

Почему драйвер зависает, и не вызывает DeviceAdd функцию, а только DriverEntry?

Пишу 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:

Команда неуместна для данной службы.


В чём проблема? Драйвер удаляется только после перезагрузки. Не очень-то удобно, вдруг я пишу "одноразовый драйвер", и не хочу перезагружаться, что бы его использовать, а после сразу выгрузить?
  • Вопрос задан
  • 204 просмотра
Решения вопроса 1
@armadillo-cld Автор вопроса
Проблема была в коде драйвера.
Вот рабочий Hello World
#include <ntddk.h>  
#include <wdm.h>

VOID DriverUnload(PDRIVER_OBJECT Driver)
{
	UNREFERENCED_PARAMETER(Driver);
	return;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(pDriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
DbgPrint("Hello, world!");
pDriverObject->DriverUnload = 
return STATUS_SUCCESS;
}


Как оказалось, не всегда для драйвера нужно создавать устройство (IoCreateDevice), что бы потом в Unload прописать его удаление. Достаточно просто добавить функцию Unload и добавить её в pDriverObject, и всё заработает.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы