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