Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2011, 21:05   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
Вопрос Простейший драйвер

Доброго всем! Вот решил я разобраться с устройством драйверов. В идеале нужно написать фильтр файловой системы. Но пока, для получения опыта, я решил написать следующее:

Код:
#include "ntddk.h" 

typedef struct _TEST_DEVICE
{
	PDEVICE_OBJECT	fdo; 
	UNICODE_STRING	ustrSymLinkName;
} TEST_DEVICE, *TTEST_DEVICE;
 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUS DeviceControlRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp);
VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject);

#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, UnloadRoutine)

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
	NTSTATUS status=STATUS_SUCCESS;
	PDEVICE_OBJECT fdo;
	UNICODE_STRING devName;
	TTEST_DEVICE dx;
	UNICODE_STRING symLinkName; 

	DriverObject->DriverUnload=UnloadRoutine;
	DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DeviceControlRoutine;

	RtlInitUnicodeString(&devName,L"\\Device\\TEST");
	RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\TEST");
 
	status=IoCreateDevice(DriverObject,sizeof(TEST_DEVICE),&devName,FILE_DEVICE_UNKNOWN,0,FALSE,&fdo);
	if(!NT_SUCCESS(status)) return status; 
 
	dx=(TTEST_DEVICE)fdo->DeviceExtension;
	dx->fdo=fdo; 
	dx->ustrSymLinkName=symLinkName;

	status=IoCreateSymbolicLink(&symLinkName,&devName);

	if (!NT_SUCCESS(status))
	{
		IoDeleteDevice(fdo);
		return status;
	}

	DbgPrint("Start!\n");
	return status;
}

NTSTATUS CompleteIrp(PIRP Irp,NTSTATUS status,ULONG info)
{
	Irp->IoStatus.Status=status;
	Irp->IoStatus.Information=info;
	IoCompleteRequest(Irp,IO_NO_INCREMENT);
	return status;
}

NTSTATUS DeviceControlRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{
	NTSTATUS status=STATUS_SUCCESS;
	ULONG BytesTxd=0;
	PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
	TTEST_DEVICE dx=(TTEST_DEVICE)fdo->DeviceExtension;
	ULONG ControlCode=IrpStack->Parameters.DeviceIoControl.IoControlCode;
	ULONG method=ControlCode & 0x03;
	KIRQL irql,currentIrql=KeGetCurrentIrql();

	switch(ControlCode)
	{
		default:
		{ 
			DbgPrint("Answer!\n");
			break;
		}
	}

	return CompleteIrp(Irp,status,BytesTxd); 
}
 
VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
{
	PDEVICE_OBJECT	pNextDevObj;
	int i;

	pNextDevObj=pDriverObject->DeviceObject;

	for(i=0; pNextDevObj!=NULL; i++)
	{
		TTEST_DEVICE dx=(TTEST_DEVICE)pNextDevObj->DeviceExtension;
		UNICODE_STRING *pLinkName = & (dx->ustrSymLinkName);
		pNextDevObj = pNextDevObj->NextDevice;
		IoDeleteSymbolicLink(pLinkName);
		IoDeleteDevice(dx->fdo);
	}

	DbgPrint("Stop!\n");
}
Это урезанный и немного переделанный драйвер вот от сюда . Цель его очень проста, поймать любой IO код и выдать при этом дебаговое сообщение. Скомпилировал я сие "чудо" в DDK 2600, без ошибок.

Для регистрации и запуска использую KmdManager, для приема отладочных сообщений DbgView.

Гружу, запускаю, получаю сообщение "Start!". При попытке отправить любой IO код получаю ошибку:

Цитата:
Can't get Driver handle.
останавливаю, выгружаю, получаю сообщение "Stop!".

Почему может не работать? Ума не приложу...

PS Скорее всего допустил где то грубейшую ошибку/ошибки. Ну что сделаешь, я только сегодня начал изучать эту область
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 04.07.2011, 21:10   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Чувак! Напиши драйвер для фс ext4! плиз!
Carbon вне форума Ответить с цитированием
Старый 05.07.2011, 08:20   #3
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Чувак! Напиши драйвер для фс ext4! плиз!
Да я гляжу не скоро мне придется с фс то работать... Хоть бы тут разобраться.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 15.07.2011, 20:05   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Как ты открываешь устройство созданное драйвером? как ты посылаешь IOCTL коды?
rpy3uH вне форума Ответить с цитированием
Старый 17.07.2011, 10:14   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Скомпилировал я сие "чудо" в DDK 2600
И это при том, что в прошлом году версия 7600.1 вышла в свет.
Офигеваю.

X: еще больше удивляет, почему люди не начинают изучение предмета с примеров которые идут в комплекте с DDK/WDK? а ведь там десятки примеров практически на все случаи жизни.

Последний раз редактировалось f.hump; 17.07.2011 в 12:26.
f.hump вне форума Ответить с цитированием
Старый 19.07.2011, 05:51   #6
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Возможно имя драйвера отличное от "TEST.sys"

Если не ошибаюсь, то KmdManager что бы послать запрос драйверу сначала должен открыть устройство драйвера (CreateFile), но поскольку символическая ссылка на устройство KmdManager не знает, то он соответственно берет имя драйвера и откидывает расширение, это он и считает именем символической ссылки:
"TEST.sys" => "\\??\\TEST" (оно же "\\DosDevices\\TEST")
так что если имя драйвера отличное от.. то KmdManager неправильную ссылку открывает

А вообще посоветую не пользоваться KmdManager, а написать свое приложение управлением драйвером, пусть даже консольное.. так, мне кажется, удобнее будет
|{ot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Простейший RDP клиент. Bengl Работа с сетью в Delphi 8 24.05.2011 01:53
Простейший фильтр. KrPr БД в Delphi 3 31.08.2010 09:47
Простейший фаерволл wall66 Софт 0 24.10.2009 17:36
простейший basic beerperson Помощь студентам 3 17.05.2009 18:14
Простейший firewall ytkopobot Помощь студентам 1 08.05.2008 13:14