Всем привет! Дописываю драйвер файловой системы, столкнулся с проблемой - после запуска драйвера блокируются все программы и выводится сообщение "*** is not a Valid Win32 application" WinDbg в этот момент показывает сообщение об ошибке SXS: BasepSxsCreateFileStream() NtCreateSection() failed Есть идеи, в чём может быть проблема? Перехватываю IRP_MJ_CREATE|READ|WRITE|PNP + FastIo пустышки Драйвер устанавливаю точно так же, как в сорцах файлмона: RtlInitUnicodeString(&fileNameUnicodeString,filename); InitializeObjectAttributes(&objectAttributes, &fileNameUnicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL); status=ZwCreateFile(&ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE, NULL, 0); status=ObReferenceObjectByHandle(ntFileHandle, FILE_READ_DATA, NULL, KernelMode, &fileObject, NULL); fileSysDevice=IoGetRelatedDeviceObject(fileObject); status=IoCreateDevice(DriverObject, sizeof(HOOK_EXTENSION), NULL, fileSysDevice->DeviceType, fileSysDevice->Characteristics, FALSE, &hookDevice); hookDevice->Flags &= ~DO_DEVICE_INITIALIZING; hookExtension=hookDevice->DeviceExtension; hookExtension->LogicalDrive='A'+Drive; hookExtension->Hooked=TRUE; hookExtension->Busy=0; hookExtension->Type=STANDARD; hookExtension->FileSystem=IoAttachDeviceToDeviceStack(hookDevice,fileSysDevice); Все проверки для краткости поста убраны Есть предположение, что из-за того, что устанавливаюсь над файловой системой
у меня похожий продакшен-код, диференс такой: в IoCreateDevice я ставлю Characteristics = 0 вместо hookDevice->Flags &= ~DO_DEVICE_INITIALIZING я после аттача говорю filter->Flags = target->Flags попробуй но мне кажется дело где-то в другом, например в твоём диспатче
Взял процедуру установки фильтра из sfilter и всё работает отлично Возникла проблема немного другого характера - при перехвате открытия файла мне надо проверить, есть ли в нём определённая сигнатура. Для этого я в процедуре IoCompletion от IRP_MJ_CREATE создаю irp на чтение и отправляю его вниз. Но в IoCompletion этого пакета почему-то мне недоступно DeviceObject - пишет, доступ запрещён. Следовательно, мне даже не обратиться к полям DeviceExtension, а это просто совершенно необходимо. Есть идеи, в чём кроется моя ошибка? Метод - DIRECT_IO MyIrp = IoAllocateIrp(DeviceObject->StackSize,TRUE); // may be FALSE!!! (for intermediate) and may be StackSize+1 // if(!MyIrp) { return ERROR_CREATE_IRP; } /// теперь заполняем недостающие структуры //MyIrp->AssociatedIrp.SystemBuffer=(PVOID)ExAllocatePool(NonPagedPool,4); // НАДО ОБЯЗАТЕЛЬНО УТОЧНИТЬ //MyIrp->UserBuffer=(PVOID)ExAllocatePool(NonPagedPool,4); MyBuffer=(PVOID)ExAllocatePool(NonPagedPool,BUFFER_SIZE); MyIrp->AssociatedIrp.SystemBuffer=MyBuffer; if(pDiskDeviceExtension->DiskDeviceObject->Flags & DO_DIRECT_IO) { MyMDL=IoAllocateMdl( MyBuffer, BUFFER_SIZE, FALSE, TRUE, // for highest level driver MyIrp ); if(MyMDL==NULL) { return ERROR_CREATE_IRP; } MmBuildMdlForNonPagedPool(MyMDL); } MyIrp->UserEvent = &event2; MyIrp->UserBuffer=MyBuffer; MyIrp->Cancel=FALSE; MyIrp->UserIosb = &IoStatusBlock; MyIrp->Tail.Overlay.Thread = PsGetCurrentThread(); MyIrp->Tail.Overlay.OriginalFileObject = p_IO_STK->FileObject; MyIrp->RequestorMode = KernelMode; // MyIrp->Flags |= (/*IRP_DEFER_IO_COMPLETION | */IRP_READ_OPERATION); // MyIrp->Flags=0; MyIrp->Flags |= (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO); p_IO_NextSTK =IoGetNextIrpStackLocation(MyIrp); // p_TmpSTK=IoGetCurrentIrpStackLocation(MyIrp); // IoSetNextIrpStackLocation(MyIrp); // p_IO_NextSTK =IoGetCurrentIrpStackLocation(MyIrp); // p_TmpSTK=IoGetNextIrpStackLocation(MyIrp); p_IO_NextSTK->MajorFunction=IRP_MJ_READ; p_IO_NextSTK->DeviceObject = ((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject; p_IO_NextSTK->FileObject=p_IO_STK->FileObject; p_IO_NextSTK->Parameters.Read.Length = BUFFER_SIZE; p_IO_NextSTK->Parameters.Read.ByteOffset.QuadPart = 0; // IoCopyCurrentIrpStackLocationToNext(MyIrp); // а надо ли, ведь мы все делаем в чужом стеке IoSetCompletionRoutine(MyIrp, OnCreateReadCompletion, &(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject), TRUE, TRUE, TRUE); IoCallDriver(((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject,MyIrp);
исли ставишь фильтры на устройтсва томов файловой системы (VDO), то нужно унаследовать флаги нижележащего устройства: Код (Text): SetFlag(hookDevice->Flags, FlagOn( fileSysDevice->Flags, (DO_BUFFERED_IO | DO_DIRECT_IO | DO_SUPPORTS_TRANSACTIONS))); Такой вопрос: к какому устройству аттачится фильтр в вышеприведенном коде? volume device object или file system device object?