Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с драйвером фильтром фс.  (Прочитано 13487 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Antony
Гость
« : 22-02-2009 19:16 » 

Добрый вечер уважаемые господа.
Возникла задача написать драйвер фильтр для запоминающих устройств , с фильтрами имею дело в первый раз. Ознакомившийся с исходниками filemon и примеров из wdk написал простой фильтр который цепляется к флешке. Все бы вроде хорошо отлавливаю все irp , но при копировании файла на флешку синий экран.При просмотре крэш дампа в отладчике говорится , что ошибка произошла с NtWriteFile .
Код:
FAULTING_IP: 
nt!NtWriteFile+321
8057970f ff530c          call    dword ptr [ebx+0Ch]
если надо дамп выложить могу.
Исходный код драйвера.
Код:
#include<ntddk.h>

typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT LowerDeviceObject;
} DEVICE_EXTENSION , *PDEVICE_EXTENSION;

NTSTATUS DispatchAny( IN PDEVICE_OBJECT DeviceObject , IN PIRP Irp );

NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject , IN PUNICODE_STRING RegistryPath )
{
HANDLE hDisk;
OBJECT_ATTRIBUTES oa;
PDEVICE_EXTENSION pdx;
PDEVICE_OBJECT pFilter;
PDEVICE_OBJECT pDisk;
PDEVICE_OBJECT fdo;
PFILE_OBJECT pFileObject;
UNICODE_STRING usDisk;
UNICODE_STRING usFilter;
IO_STATUS_BLOCK iosb;
NTSTATUS ns;
int i;


RtlInitUnicodeString( &usDisk , L"\\DosDevices\\E:\\" );
RtlInitUnicodeString( &usFilter , L"\\Device\\sav_filter" );

    for( i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++ )
{
DriverObject->MajorFunction[i] = DispatchAny;
}

InitializeObjectAttributes( &oa , &usDisk , OBJ_CASE_INSENSITIVE , NULL , NULL );
ns = ZwCreateFile( &hDisk ,
               SYNCHRONIZE | FILE_ANY_ACCESS ,
   &oa ,
   &iosb ,
   NULL ,
   0,
   FILE_SHARE_READ | FILE_SHARE_WRITE ,
   FILE_OPEN ,
   FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE ,
   NULL ,
   0 );
if( !NT_SUCCESS(ns) )
{
KdPrint((" ZwCreateFile failed with status : %08X\n" , ns ));
return ns;
}
ns = ObReferenceObjectByHandle( hDisk , FILE_READ_DATA , NULL , KernelMode , &pFileObject , NULL );
if( !NT_SUCCESS(ns) )
{
KdPrint(("ObReferenceObjectByHandle failed with status  : %08X\n" , ns ));
ZwClose( hDisk );
return ns;
}

pDisk = IoGetRelatedDeviceObject( pFileObject );
if( !pDisk )
{
KdPrint((" IoGetRelatedDeviceObject failed with status  : %08X\n" , ns ));
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return ns;
}
KdPrint((" pDisk object : %08X\n" , pDisk ));

ns = IoCreateDevice( DriverObject , sizeof(*pdx) , &usFilter , FILE_DEVICE_UNKNOWN , 0 , FALSE , &pFilter );
if( !NT_SUCCESS(ns) )
{
KdPrint(("IoCreateDevice failed with status  : %08X\n" , ns ));
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return ns;
}
pdx = (PDEVICE_EXTENSION)pFilter->DeviceExtension;
fdo = IoAttachDeviceToDeviceStack( pFilter , pDisk );
if( !fdo )
{
KdPrint((" IoAttachDeviceToDeviceStack failed with status : %08X\n" , ns ));
ObDereferenceObject( pFileObject );
ZwClose( hDisk );
return STATUS_UNSUCCESSFUL;
}
KdPrint((" fdo object : %08X\n" , fdo ));
pFilter->Flags &= ~DO_DEVICE_INITIALIZING;
pdx->LowerDeviceObject = fdo;
ObDereferenceObject( pFileObject );
    ZwClose( hDisk );
return STATUS_SUCCESS;
}

NTSTATUS DispatchAny( IN PDEVICE_OBJECT DeviceObject , IN PIRP Irp )
{
PDEVICE_EXTENSION pdx;
PIO_STACK_LOCATION pStack;

pdx = DeviceObject->DeviceExtension;
pStack     = IoGetCurrentIrpStackLocation( Irp );
KdPrint((" In DispatchAny : Irp Type : %X \n" , pStack->MajorFunction));
IoSkipCurrentIrpStackLocation( Irp );
return IoCallDriver( pdx->LowerDeviceObject , Irp );
}

























Про сушествовании фаст ио знаю , но пока бы так разобраться.
Заранее спасибо , с уважанием Антон.
Записан
Antony
Гость
« Ответ #1 : 22-02-2009 20:00 » 

Простите за опечатку
Код:
IoCreateDevice( DriverObject , sizeof(*pdx) , &usFilter , FILE_DEVICE_UNKNOWN , 0 , FALSE , &pFilter );
, конечно надо не FILE_DEVICE_UNKNOWN , а pDisk->DeviceType.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 23-02-2009 12:20 » 

что на синем экране?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Antony
Гость
« Ответ #3 : 23-02-2009 12:35 » 

вот скрин.

* Windows XP Professional-2009-02-23-15-34-19.png (10.81 Кб - загружено 924 раз.)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 23-02-2009 14:45 » 

то есть типа INVALID_PROCESS_ATTACH_ATTEMPT получается...
какие IRP были отловлены, и на каком падает? (+MinorFunction тоже...)

насчет 5го параметра IoCreateDevice() - уверены?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 23-02-2009 14:46 » 

sizeof(*pdx) -эээ... никогда не пробовал) оно так получается?)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Antony
Гость
« Ответ #6 : 23-02-2009 15:32 » 

последний  IRP_MJ_CLOSE .
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 23-02-2009 15:50 » 

может DeviceCharacteristics=FILE_REMOVABLE_MEDIA попробовать?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Antony
Гость
« Ответ #8 : 23-02-2009 16:00 » 

пробовал , не помогает .
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 23-02-2009 16:52 » 

только при записи на флешку такая реакция? или на любой другой диск тоже?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Antony
Гость
« Ответ #10 : 23-02-2009 17:06 » 

атачился к диску С бсод почти сразу .
Записан
Antony
Гость
« Ответ #11 : 24-02-2009 16:53 » 

Ochkarik, Спасибо большое за отклик , проблему думаю решил верхние драйвера фильтры должны обрабатывать фаст ио.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 25-02-2009 15:42 » 

ну чтож... будем знать)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
amisto0x07
Гость
« Ответ #13 : 13-03-2009 21:49 » 

судя по исходнику, ты включаешь свой фильтр в стек устройств-фильтров для устройства тома (раздел E:). Попробуй создать фильтрующий объект устройства  с типом pDisk->DeviceType и унаследовать своему фильтру DO_BUFFERED_IO | DO_DIRECT_IO | DO_SUPPORTS_TRANSACTIONS флаги нижележащего устройства. По поводу быстрого ввода - вывода, то желательно наличие обработчиков, которые можно Ctrl+C - Ctrl+V из filemon-a.
NTSTATUS _stat = IoCreateDevice( globalDriverObject,
            sizeof(FS_DEVICE_EXTENSION),
            NULL,
            pDisk->DeviceType,
            0,
            FALSE,
            &newFilterDO);
if (_stat == 0 )
{
            PDEVICE_OBJECT lowerDO = IoAttachDeviceToDeviceStack(newFilterDO, pDisk);
            if (lowerDO == NULL)
            {
                  IoDeleteDevice(newFilerDO);
                  // TODO some processing
                  return;
            }
   ClearFlag( newFilterDO->Flags, DO_DEVICE_INITIALIZING );
   SetFlag(newFilterDO->Flags, FlagOn( lowerDO->Flags, (DO_BUFFERED_IO | DO_DIRECT_IO | DO_SUPPORTS_TRANSACTIONS)));
   SetFlag(newFilterDO->Characteristics, FlagOn( lowerDO->Characteristics, (FILE_DEVICE_SECURE_OPEN)));
}

/** PS: RTFM */
« Последнее редактирование: 13-03-2009 21:56 от amisto0x07 » Записан
Antony
Гость
« Ответ #14 : 15-03-2009 16:04 » 

Спасибо , что ответили , проблема была решена давно , дело было в обработчиках фаст ио.  По поводу типа устройства , я сразу же исправился в 2 посте.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines