Filter Driver
От: MAL  
Дата: 08.10.01 15:08
Оценка: 2 (1)
Здравствйте !
2 проблемы
1 — сделал Фильтр кейбоард драйвер. Могу изменять данные и отменять запрос(IRP_MJ_READ).
Не могу вставить новый запрос или существующий разбить на два. Подскажите плиз как делать.(Win NT 98 2000)
2 — Есть драйвер USB для NT для клавы. Я делаю IoAttach — все ОК но по IRP_MJ_CLEANUP — BSD
Как завершать ? Пробовал типа SkipCurrentIrp и IOCalldevice к таргет девайсу все так же.

Что делать ? Уже месяц мучаюсь — помощь позарез нужна
Спасибо
Re: Filter Driver
От: Аноним  
Дата: 05.11.01 06:51
Оценка:
Здравствуйте MAL, Вы писали:

MAL>Здравствйте !

MAL>2 проблемы
MAL>1 — сделал Фильтр кейбоард драйвер. Могу изменять данные и отменять запрос(IRP_MJ_READ).
MAL> Не могу вставить новый запрос или существующий разбить на два. Подскажите плиз как делать.(Win NT 98 2000)

попробуй посмотреть здесь
http://www.sysinternals.com/ntw2k/source/ctrl2cap.shtml
может найдешь что-ндь полезное...

cb.
Re: Filter Driver
От: Аноним  
Дата: 08.11.01 14:51
Оценка:
Здравствуйте MAL, Вы писали:

MAL>Здравствйте !

MAL>1 — сделал Фильтр кейбоард драйвер. Могу изменять данные и отменять запрос(IRP_MJ_READ).
MAL> Не могу вставить новый запрос или существующий разбить на два. Подскажите плиз как делать.(Win NT 98 2000)


Привет это элементарно :)))

///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE
NTSTATUS DispatchRead(IN PDEVICE_OBJECT fido, IN PIRP Irp)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
NTSTATUS status;
status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status)) return CompleteRequest(Irp, status, 0);
if(_НУЖНО_)
{
// Меняем данные на какие надо
status = CompleteRequest(Irp, STATUS_SUCCESS, ТУТИНФА);
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
_НУЖНО_=FALSE;
return status;
}
IoCopyCurrentIrpStackLocationToNext(Irp);
IoSetCompletionRoutine( Irp, _ТВОЯ_CompletionReadRoutine,
fido, TRUE, TRUE, TRUE );
status = IoCallDriver(pdx->LowerDeviceObject, Irp);
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
}

В "_ТВОЯ_CompletionReadRoutine" анализируем данные — надо разбить на два ? да — _НУЖНО_=TRUE;
Система генерит новый запрос а ты в DispatchRead ей сразу на — "CompleteRequest(Irp, STATUS_SUCCESS, ТУТИНФА );"

вариантов много Но главное что в CompleteRequest второй параметр STATUS_SUCCESS можно хоть двадцать пакетов засунуть

ТУТИНФА зависит от того как передаются данные DirectIO or Buffered or ...не помню
Обычно сколько байт или 0

Смотри в книге Oney, Walter. Programming the Microsoft Windows Driver Model
В электронном виде видел на каком то рууском сайте по программ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.