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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2012, 13:23   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию Драйвер-фильтр

Доброго времени суток. Имеется драйвер. К нему аттачится драйвер-фильтр. При попытке передать что-либо в драйвер (функция IRP_MJ_WRITE) возникает BSOD с ошибкой IRQL_NOT_LESS_OR_EQUAL.
Функция для обработки IRP в драйвере-фильтре
Код:
NTSTATUS PassToLowerDevice(IN PDEVICE_OBJECT pDeviceObject, IN  PIRP pIrp)
{
	PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)(pDeviceObject->DeviceExtension);
	NTSTATUS status;
	KIRQL OldIrql;

	DBGMSG("PassToLowerDevice called. New");
	
	//For sinchronization
	KeAcquireSpinLock(&SpinLock, &OldIrql);
	
	IoSkipCurrentIrpStackLocation(pIrp);
	status = IoCallDriver(pDevExt->pLowDevice, pIrp);

	KeReleaseSpinLock(&SpinLock, OldIrql);
	
	DbgPrint("IoCallDriver return code 0x%p", status);
	DBGMSG("PassToLowerDevice complete");

	return STATUS_SUCCESS;
}
Функция IRP_MJ_WRITE нижнего драйвера
Код:
NTSTATUS DriverWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
	PIO_STACK_LOCATION pLocation;
	PVOID Data;
	ULONG DataLength = 0;
	
	DBGMSG("DriverWrite called");

	pLocation = IoGetCurrentIrpStackLocation(Irp);

	DataLength = pLocation->Parameters.Write.Length;
	Data = ExAllocatePool(NonPagedPool, DataLength);
		
	if(Data == NULL)
		return STATUS_UNSUCCESSFUL;
		
	RtlZeroMemory(Data, DataLength);
	RtlCopyMemory(Data, Irp->AssociatedIrp.SystemBuffer, DataLength);
	DbgPrint("Data is: %s", Data);

	ExFreePool(Data);

	Irp->IoStatus.Information = 0;
	Irp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	DBGMSG("DriverWrite complete");

	return STATUS_SUCCESS;
}
Без использования спин-блокировок падает с ошибкой SYSTEM_SERVICE_EXCEPTION. Кто знает, в чем проблема?
Единственный способ стать умнее - играть с более умным противником.

Последний раз редактировалось Sam Gold; 14.10.2012 в 13:44.
Sam Gold вне форума Ответить с цитированием
Старый 15.10.2012, 12:49   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Попробовал использовать FAST_MUTEX - падение с SYSTEM_SERVICE_EXCEPTION.
При использовании IO_REMOVE_LOCK система виснет на экране приветствия. Сервис драйвера-фильтра запускается с флагом SYSTEM_AUTO_START.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
User-mode драйвер / программа-фильтр для сканера штрих-кодов - какой правильный подход при разработке? Ivan_32 Win Api 4 11.09.2012 12:16
Драйвер фильтр файловой системы zumm Общие вопросы C/C++ 1 09.11.2010 18:47
Драйвер-фильтр C/C++ Alex217Vish Общие вопросы C/C++ 6 20.08.2010 23:11
Драйвер milancrash Фриланс 1 01.04.2009 08:22