Пустой upper-filter driver отключает функциональность
От: Alexey Frolov Беларусь  
Дата: 01.06.05 09:35
Оценка:
Здравствуйте, помогите пожалуйста разобраться в следующей ситуации.
Задача состоит в том чтобы отлавливать и дополнительно обрабатывать запросы IRP_MJ_CREATE, IRP_MJ_READ и т.д. к USB Mass Storage Devices
Установил простой upper фильтр, который передает все запросы нижестоящему устройству и больше ничего не делает. Процедура установки следующая:
Получаем класс девайсов
SetupDiGetClassDevs(NULL, "USBSTOR"...
Получаем девайс
SetupDiEnumDeviceInfo(hDevInfo, index, &devInfoData);
"OTi Flash Disk USB Device"
На него устанавливаем в качестве UPPERFILTER драйвер. Реализация драйвера:


DriverEntry:

...
DriverObject->DriverUnload = DriverUnload;
DriverObject->DriverExtension->AddDevice = AddDevice;

for (int i = 0; i < arraysize(DriverObject->MajorFunction); ++i)
  DriverObject->MajorFunction[i] = DispatchAny;

AddDevice:

PDEVICE_OBJECT fido;
status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), 
                        NULL, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, 
                        FALSE, &fido);
if (!NT_SUCCESS(status))
{
  ...        
}
    
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);

if (NULL == fdo)
{
  ... delete fido & return unsuccess 
}

pdx->DeviceObject = fido;
pdx->Pdo = pdo;
pdx->LowerDeviceObject = fdo;
fido->Flags |= fdo->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE);
fido->DeviceType = fdo->DeviceType;
fido->Characteristics = fdo->Characteristics;
        
KeInitializeEvent(&pdx->RemoveEvent, NotificationEvent, FALSE);

fido->Flags &= ~DO_DEVICE_INITIALIZING;

    
DispatchAny:
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;

PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

// some log function
    
InterlockedIncrement(&pdx->usage);
    

IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(pdx->LowerDeviceObject, Irp);

if (!NT_SUCCESS(status))
  //log message

InterlockedDecrement(&pdx->usage);



Таким образом я попытался вклиниться в стек и флэшка не появляется в системе как диск. Когда я этот же самый драйвер устанавливаю точно так же только как LOWERFILTER все работает, только сообщения идут естесственно не те которые мне надо.

И еще один момент, я с помощью утилиты просматривал как разместились девайсы и вот что меня удивило, стэк девайсов выглядит так \device\000000b6(usbstor) -> \device\harddisk1\dr52(disk) -> \device\000000c0(myfilter) -> (unnamed) (PartMgr: upper filter for class DiskDrive). Я ожидал что мой фильтр все таки будет вторым.

У меня три вопроса: 1) почему могла исчезнуть функциональность девайса при подключении upperfilter, а при lowerfilter все работает? 2) почему стэк выглядит так? 3) как и куда исходя из моей задачи правильно встроить фильтр в стэк?
Re: Пустой upper-filter driver отключает функциональность
От: Аноним  
Дата: 17.06.05 11:52
Оценка:
AF>У меня три вопроса: 1) почему могла исчезнуть функциональность девайса при подключении upperfilter, а при lowerfilter все работает? 2) почему стэк выглядит так? 3) как и куда исходя из моей задачи правильно встроить фильтр в стэк?


Make sure your driver implements all IRP dispatch functions that the driver being filtered implements. Any dispatch functions your driver does not implement will never be passed to the lower device, possibly changing the behavior of the system. — это для upper фильтров ....для lower все по прошче
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.