Пустой 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) как и куда исходя из моей задачи правильно встроить фильтр в стэк?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.