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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите с минифильтром  (Прочитано 22720 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fermopili
Интересующийся

ua
Offline Offline

« : 05-11-2010 16:11 » 

При запуске минифильтра вылетает перезагружается комп в чем проблема так и не понял.
Если же убрать из структуры FLT_OPERATION_REGISTRATION имя процедуры фильтрации MyFiltr и поставить NULL, то все нормально, драйвер нормально загружается и выгружается, есть связь  с с ним из win app программ, но естественно нет фильтрации, пожалуйста помогите новичку.

Код:
//=============================================================================
// укороченная версия
//=============================================================================
#include <fltKernel.h>
#include <dontuse.h>
#include <suppress.h>
//#include "VERSION.h"
#pragma prefast(disable:__WARNING_ENCODE_MEMBER_FUNCTION_POINTER,"Not valid for kernel mode drivers")
//-----------------------------------------------------------------------------
#define NT_FILTER_NAME      L"\\Device\\NTName"
#define WIN32_FILTER_NAME   L"\\DosDevices\\MYDRIVER"
#define VERSION             "1.0001"
//-----------------------------------------------------------------------------
DRIVER_UNLOAD UnloadDriver;   // п/п выгрузки драйвера
DRIVER_INITIALIZE DriverEntry;// главная
//-----------------------------------------------------------------------------
VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject);// п/п выгрузки драйвера
//-----------------------------------------------------------------------------
typedef struct _DEVICE_EXTENSION { // структура расширения драйвера
                                   PDEVICE_OBJECT fdo;
                               UNICODE_STRING Win32_Filter_Name;
                                 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//---------------------------
typedef struct _NULL_FILTER_DATA{ // структура фильтра
                                  PDRIVER_OBJECT DriverObject;
                                  PFLT_FILTER FilterHandle;
                                } NULL_FILTER_DATA, *PNULL_FILTER_DATA;
//*************************************************************************
NTSTATUS DriverEntry ( // главная
                       __in PDRIVER_OBJECT DriverObject,
                       __in PUNICODE_STRING RegistryPath
                     );
NTSTATUS FilterUnload (// функция выгрузки фильтра
                       __in FLT_FILTER_UNLOAD_FLAGS Flags
                      ) ;
NTSTATUS QueryTeardown( // функция отсоединения фильтра
                        __in PCFLT_RELATED_OBJECTS FltObjects,
                        __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
                      );
NTSTATUS InstanceSetup ( // функция подключения локальных томов
                         __in PCFLT_RELATED_OBJECTS FltObjects,
                         __in FLT_INSTANCE_SETUP_FLAGS Flags,
                         __in DEVICE_TYPE VolumeDeviceType,
                         __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
                       );                           
FLT_PREOP_CALLBACK_STATUS MyFiltr (// функция фильтрации
                                   __inout PFLT_CALLBACK_DATA Data,
                                   __in PCFLT_RELATED_OBJECTS FltObjects,
                                   __deref_out_opt PVOID *CompletionContext
                                  );
//-----------------------------------------------------------------------------
NULL_FILTER_DATA NullFilterData;
//-----------------------------------------------------------------------------
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, FilterUnload)
#pragma alloc_text(PAGE, QueryTeardown) 
#pragma alloc_text(PAGE, InstanceSetup)
#pragma alloc_text(PAGE, MyFiltr)
#endif
//-----------------------------------------------------------------------------
const FLT_OPERATION_REGISTRATION FilterOperations[] =
    { 
       {IRP_MJ_CREATE,
        0,
        MyFiltr,// функция фильтрации
        NULL,
NULL
       },
       { IRP_MJ_OPERATION_END}
    };
typedef struct _SCANNER_STREAM_HANDLE_CONTEXT
               { BOOLEAN RescanRequired;
               } SCANNER_STREAM_HANDLE_CONTEXT, *PSCANNER_STREAM_HANDLE_CONTEXT;
const FLT_CONTEXT_REGISTRATION ContextRegistration[] =
    {
      { FLT_STREAMHANDLE_CONTEXT,             // 1 ContextType
        0,                                    // 2 Flags
        NULL,                                 // 3 ContextCleanupCallback;
        sizeof(SCANNER_STREAM_HANDLE_CONTEXT),// 4 Size
        'chBS',                               // 5 PoolTag
        NULL,                                 // 6 ContextAllocateCallback
        NULL,                                 // 7 ContextFreeCallback
        NULL                                  // 8 Reserved1
      },
      { FLT_CONTEXT_END }
    };
CONST FLT_REGISTRATION FilterRegistration =
    {
     sizeof( FLT_REGISTRATION ),         // 1 Size
     FLT_REGISTRATION_VERSION,           // 2 Version
     0,                                  // 3 Flags
     ContextRegistration,                // 4 ContextRegistration
     FilterOperations,                   // 5 OperationRegistration
     FilterUnload,                       // 6 FilterUnloadCallback
     InstanceSetup,                      // 7 InstanceSetupCallback 
     QueryTeardown,                      // 8 InstanceQueryTeardownCallback
     NULL,                               // 9 InstanceTeardownStartCallback
     NULL,                               // 10 InstanceTeardownCompleteCallback
     NULL,                               // 11 GenerateFileNameCallback
     NULL,                               // 12 NormalizeNameComponentCallback
     NULL                                // 13 NormalizeContextCleanupCallback
    };
//=============================================================================
NTSTATUS DriverEntry (__in PDRIVER_OBJECT DriverObject, // объект драйвера
                      __in PUNICODE_STRING RegistryPath // раздел реестра
                     )
{
PDEVICE_OBJECT pDeviceObject; // указатель на Functional Device Object (FDO)
PDEVICE_EXTENSION dx;         // указатель на структуру расширения устройства
NTSTATUS status;              // текущий статус выполненной операции
UNICODE_STRING uniNtName;
UNICODE_STRING uniWin32Name;
UNREFERENCED_PARAMETER( RegistryPath );
UNREFERENCED_PARAMETER( DriverObject );
//-------------------------------
RtlInitUnicodeString(&uniNtName,    NT_FILTER_NAME);
RtlInitUnicodeString(&uniWin32Name, WIN32_FILTER_NAME);
//--------------------- 
DriverObject->DriverUnload = UnloadDriver;//п/п выгрузки драйвера
//---------------------
#if DBG
DbgPrint("=FltF= ver. %s",VERSION );
#endif
//----------------------
status=IoCreateDevice(DriverObject,
                      sizeof(DEVICE_EXTENSION),// size структуры расширения
                      &uniNtName,      // NT_FILTER_NAME
                      FILE_DEVICE_UNKNOWN,
                      0,
                      FALSE,           // без эксклюзивного доступа
                      &pDeviceObject   // cоздаем Functional Device Object (FDO)
                     );
if(!NT_SUCCESS( status ))
  {
   #if DBG
   DbgPrint("=FltF= Error IoCreateDevice - DriverEntry");
   #endif   
   return(status);
  } 
dx=(PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;//структура расширения
dx->fdo = pDeviceObject;  // обратный указатель
RtlInitUnicodeString(&dx->Win32_Filter_Name, WIN32_FILTER_NAME);
#if DBG
DbgPrint("=FltF= DriverEntry - FDO %X, DevExt=%X.",pDeviceObject,dx);
#endif
//-----------------------------------------------------------------------------
status=IoCreateSymbolicLink(&uniWin32Name,// видимое пользователю название
                            &uniNtName);// имя драйвера, созданный объект устройства
if(!NT_SUCCESS( status ))
  {IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
   #if DBG
   DbgPrint("=FltF= DriverEntry - Error IoCreateSymbolicLink");
   #endif
   return(status);
  }             
//-------------------------- регистрация фильтра ------------------------------
status = FltRegisterFilter( DriverObject,
                            &FilterRegistration,
                            &NullFilterData.FilterHandle
                          );
if(!NT_SUCCESS( status ))
  {IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
   #if DBG
   DbgPrint("=FltF= DriverEntry - Error FltRegisterFilter");
   #endif
   return(status); 
  }     
#if DBG
DbgPrint("=FltF= DriverEntry - OK FltRegisterFilter");
#endif 
status = FltStartFiltering( NullFilterData.FilterHandle );// запуск фильтра
if(!NT_SUCCESS( status ))
  {FltUnregisterFilter( NullFilterData.FilterHandle ); // разрегистрируем фильтр
   IoDeleteDevice(pDeviceObject);//удаляем Device Object и возвращаем управление
   #if DBG
   DbgPrint("=FltF= DriverEntry - Error FltStartFiltering");
   #endif
   return(status);
  }
#if DBG
DbgPrint("=FltF= DriverEntry - Driver is successfully");
#endif
return(status);
}// END DriverEntry(...)
//-----------------------------------------------------------------------------
NTSTATUS FilterUnload ( __in FLT_FILTER_UNLOAD_FLAGS Flags  )
{
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
FltUnregisterFilter( NullFilterData.FilterHandle );
#if DBG
DbgPrint("=FltF= FilterUnload");       
#endif
return(STATUS_SUCCESS);
}// END FilterUnload(...)
//-----------------------------------------------------------------------------
NTSTATUS QueryTeardown ( __in PCFLT_RELATED_OBJECTS FltObjects,
                         __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags
                       )
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
PAGED_CODE();
#if DBG
DbgPrint("=FltF= QueryTeardown");         
#endif
return(STATUS_SUCCESS);
}// END QueryTeardown(...)
//-----------------------------------------------------------------------------
VOID UnloadDriver(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT  pdeviceObject = pDriverObject->DeviceObject;
PDEVICE_EXTENSION dx;
UNREFERENCED_PARAMETER(pDriverObject);
dx = (PDEVICE_EXTENSION)pdeviceObject->DeviceExtension;
IoDeleteSymbolicLink(&dx->Win32_Filter_Name);
IoDeleteDevice( pdeviceObject );
#if DBG
DbgPrint("=FltF= UnloadDriver  ver. %s",VERSION );   
#endif   
return;
}// END UnloadDriver(...)
//-----------------------------------------------------------------------------
FLT_PREOP_CALLBACK_STATUS MyFiltr (
    __inout PFLT_CALLBACK_DATA Data,        // данные о файловой операции
    __in PCFLT_RELATED_OBJECTS FltObjects,  // не используется
    __deref_out_opt PVOID *CompletionContext//
    )
{
UNREFERENCED_PARAMETER( Data );
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( CompletionContext );
PAGED_CODE();
#if DBG
DbgPrint("=FltF= <<заглушка фильтрации>>");
#endif     
return FLT_PREOP_SUCCESS_WITH_CALLBACK; //  файл не блокируется
}// END NullPreCreate(...)
//-----------------------------------------------------------------------------
NTSTATUS InstanceSetup ( __in PCFLT_RELATED_OBJECTS FltObjects,
                         __in FLT_INSTANCE_SETUP_FLAGS Flags,
                         __in DEVICE_TYPE VolumeDeviceType,
                         __in FLT_FILESYSTEM_TYPE VolumeFilesystemType
                       )
{
UNREFERENCED_PARAMETER( FltObjects );
UNREFERENCED_PARAMETER( Flags );
UNREFERENCED_PARAMETER( VolumeDeviceType );
UNREFERENCED_PARAMETER( VolumeFilesystemType );
PAGED_CODE();
ASSERT( FltObjects->Filter == NullFilterData.FilterHandle );
if (VolumeDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM)
  {// не присоединять к сетевым томам
   DbgPrint("=FltF= == NullInstanceSetup ERR == 0x%08X",VolumeDeviceType);
   return(STATUS_FLT_DO_NOT_ATTACH);
  }
DbgPrint("=FltF= == InstanceSetup OK  == 0x%08X",VolumeDeviceType); 
return(STATUS_SUCCESS);
}// END InstanceSetup(...)
//-----------------------------------------------------------------------------

Записан
Ochkarik
Модератор

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

« Ответ #1 : 05-11-2010 22:28 » 

а что происходит по возвращению FLT_PREOP_SUCCESS_WITH_CALLBACK в MyFiltr?
может быть попробовать поменять статус  на FLT_PREOP_COMPLETE или FLT_PREOP_SUCCESS_NO_CALLBACK?
« Последнее редактирование: 05-11-2010 22:31 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
fermopili
Интересующийся

ua
Offline Offline

« Ответ #2 : 06-11-2010 07:07 » 

драйвер вообще не загружается, сразу перезагружается комп, такое ощущение что просто нажимается кнопка RESET
Записан
supermaxus
Участник

ru
Offline Offline

« Ответ #3 : 06-11-2010 12:20 » 

драйвер вообще не загружается, сразу перезагружается комп, такое ощущение что просто нажимается кнопка RESET

А Вы программируете драйвер вслепую, без отладчика? Какую ошибку выдает отладчик?
Записан
fermopili
Интересующийся

ua
Offline Offline

« Ответ #4 : 08-11-2010 06:52 » 

без отладчика

Добавлено через 7 часов, 16 минут и 4 секунды:
отладочные сообщения в DebagView не появляются
« Последнее редактирование: 08-11-2010 14:08 от fermopili » Записан
supermaxus
Участник

ru
Offline Offline

« Ответ #5 : 08-11-2010 17:14 » 

отладочные сообщения в DebagView не появляются


Ну, для этого надо как минимум откомпилировать драйвер в дебужной версии(также проверить, что DBG определена, или на крайний случай #if DBG временно закомментировать, но не рекомендуется) , а потом настроить связку ОС-система разработки->отладчик(именно отладчик, а не просмотр дебужных сообщений). Когда у вас случится несчастный случай, то отладчик поймает эту ситуацию и перейдет в командный режим, а попутно выдаст кучу полезной информации (причина возникновения ошибки, строка ошибки и пр.) Бывает полезно посмотреть стек вызовов. Зная причину ошибки легче искать. что не так. Бывает так, что ошибка совсем не там, где вы думаете.

Отладчик есть в поставке ddk, а связку лучше делать как два компьютера через COM-порт, или через VMWare (советов на эту тему на форуме достаточно), потому что если делаете отладку на одной машине, то даже хелп отладчика посмотреть не сможете, не говоря уже о ддк, или инет.

Что до вашего кода, не понятно, что делает FltRegisterFilter (в ddk такой функции не нашел). По сему, лучше привести фрагмент вашего кода, на который указывает стек отладчика при возникновении ошибки.

Кроме того, ваша callback функция MyFiltr размещена в page-секции (потенциально выгружаемая). Думается, что callback делается все-таки на уровне irql, отличном от PASSIVE_LEVEL (вплоть до DISPATCH_LEVEL), что приведет к тому, что когда ваша процедура потребуется (а она к тому моменту будет выгружена),то возникнет BSOD. Думается так потому, что callback (по логике) должен отработать быстрее, чем придет другой запрос в тот же callback. Но, возможно, я ошибаюсь. Проверить это можно с помощью того же отладчика. Либо, хотя бы попробуйте вынести процедуру в резидентную часть драйвера.
Записан
resource
Молодой специалист

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

« Ответ #6 : 08-11-2010 17:58 » 

supermaxus, никак не пойму, о чём вы говорите. "Война и мир" целая. Ochkarik еще в первом посте указал на причину.

fermopili, если пишешь и отлаживаешь драйвер, неплохо бы отрубать авторебут.
Записан
supermaxus
Участник

ru
Offline Offline

« Ответ #7 : 08-11-2010 21:09 » 

supermaxus, никак не пойму, о чём вы говорите. "Война и мир" целая. Ochkarik еще в первом посте указал на причину.

fermopili, если пишешь и отлаживаешь драйвер, неплохо бы отрубать авторебут.

Я тож еще только учусь, ответ от Ochkarik  был подан как вопрос, т.о. не воспринялся как причина.

PS Судя по ответу fermopili этого тож не понял..
« Последнее редактирование: 08-11-2010 21:14 от supermaxus » Записан
Ochkarik
Модератор

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

« Ответ #8 : 08-11-2010 21:31 » 

supermaxus, это был "пинок" в нужную сторону) объяснять подробнее не имеет смысла, тем более я область минифильтров никогда специально не изучал) просто в msdn на описание функции мельком глянул...
и потом - такой подход всегда полезнее) заставляет вопрошающего лишний раз подумать)

fermopili, подумать! а не скопипастить Ага
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
fermopili
Интересующийся

ua
Offline Offline

« Ответ #9 : 09-11-2010 07:02 » 

опиние функции  FltRegisterFilter  находится  в файле fltKernel.h
__checkReturn
__drv_maxIRQL(APC_LEVEL)
NTSTATUS
FLTAPI
FltRegisterFilter (
    __in PDRIVER_OBJECT Driver,
    __in CONST FLT_REGISTRATION *Registration,
    __deref_out PFLT_FILTER *RetFilter
    );

а в DDK  на станице  http://msdn.microsoft.com/en-us/library/ff544305(VS.85).aspx

и драйвер компилируется в дебужной версии
Записан
supermaxus
Участник

ru
Offline Offline

« Ответ #10 : 10-11-2010 23:09 » 

Подскажите, что за семпл с файлом fltKernel.h? В 2003 DDK такого нету..  Под свисту чтоль?
Записан
Ochkarik
Модератор

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

« Ответ #11 : 10-11-2010 23:14 » 

http://www.google.ru/search?hl=ru&q=fltKernel.h&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=
вторая ссылка на msdn
Записан

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

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

« Ответ #12 : 11-11-2010 20:23 » 

supermaxus, в WDK собственно есть раздел Samples. Там описаны все имеющиеся сэмплы. Плюс в каждом конкретном разделе эта информация частями дублируется.
Записан
supermaxus
Участник

ru
Offline Offline

« Ответ #13 : 11-11-2010 20:58 » 

supermaxus, в WDK собственно есть раздел Samples. Там описаны все имеющиеся сэмплы. Плюс в каждом конкретном разделе эта информация частями дублируется.

Ну, наверное ж и файловым поиском в ddk посмотрел и руками и в мсдне... Проблема в том, что web-формат мсдн-а поменяли, раньше они внизу указывали начиная с какой ОС функция доступна, теперь эта информация где-то в середине текста, мелким шрифтом - не с первой попытки найдешь. Данная функция доступна начиная со свисты, а  у меня ддк 2003, где этого семпла (и функции) в природе не существует. Потому и спросил.
Записан
fermopili
Интересующийся

ua
Offline Offline

« Ответ #14 : 12-11-2010 17:03 » 

 сборка 7600.16385.1
Записан
izlesa
Новенький

ru
Offline Offline

« Ответ #15 : 03-03-2011 09:33 » new

>>Подскажите, что за семпл с файлом fltKernel.h? В 2003 DDK такого нету..  Под свисту чтоль?
Это не семпл, это основной заголовочный файл для минифильтров, лежит в $(WDKDIR)\inc\ddk\fltKernel.h
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines