File System Filter

Тема в разделе "WASM.WIN32", создана пользователем Just_Neko, 16 мар 2009.

  1. Just_Neko

    Just_Neko New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2009
    Сообщения:
    22
    Всем привет!
    Дописываю драйвер файловой системы, столкнулся с проблемой - после запуска драйвера блокируются все программы и выводится сообщение "*** 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);

    Все проверки для краткости поста убраны
    Есть предположение, что из-за того, что устанавливаюсь над файловой системой
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    у меня похожий продакшен-код, диференс такой:
    в IoCreateDevice я ставлю Characteristics = 0
    вместо hookDevice->Flags &= ~DO_DEVICE_INITIALIZING я после аттача говорю filter->Flags = target->Flags
    попробуй
    но мне кажется дело где-то в другом, например в твоём диспатче
     
  3. Just_Neko

    Just_Neko New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2009
    Сообщения:
    22
    Взял процедуру установки фильтра из 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);
     
  4. amisto0x07

    amisto0x07 New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2009
    Сообщения:
    24
    исли ставишь фильтры на устройтсва томов файловой системы (VDO), то нужно унаследовать флаги нижележащего устройства:
    Код (Text):
    1. SetFlag(hookDevice->Flags, FlagOn( fileSysDevice->Flags, (DO_BUFFERED_IO | DO_DIRECT_IO | DO_SUPPORTS_TRANSACTIONS)));
    Такой вопрос: к какому устройству аттачится фильтр в вышеприведенном коде? volume device object или file system device object?