fermopili
Интересующийся
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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
fermopili
Интересующийся
Offline
|
|
« Ответ #2 : 06-11-2010 07:07 » |
|
драйвер вообще не загружается, сразу перезагружается комп, такое ощущение что просто нажимается кнопка RESET
|
|
|
Записан
|
|
|
|
supermaxus
Участник
Offline
|
|
« Ответ #3 : 06-11-2010 12:20 » |
|
драйвер вообще не загружается, сразу перезагружается комп, такое ощущение что просто нажимается кнопка RESET
А Вы программируете драйвер вслепую, без отладчика? Какую ошибку выдает отладчик?
|
|
|
Записан
|
|
|
|
fermopili
Интересующийся
Offline
|
|
« Ответ #4 : 08-11-2010 06:52 » |
|
без отладчика
Добавлено через 7 часов, 16 минут и 4 секунды: отладочные сообщения в DebagView не появляются
|
|
« Последнее редактирование: 08-11-2010 14:08 от fermopili »
|
Записан
|
|
|
|
supermaxus
Участник
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
Молодой специалист
Offline
Пол:
|
|
« Ответ #6 : 08-11-2010 17:58 » |
|
supermaxus, никак не пойму, о чём вы говорите. "Война и мир" целая. Ochkarik еще в первом посте указал на причину.
fermopili, если пишешь и отлаживаешь драйвер, неплохо бы отрубать авторебут.
|
|
|
Записан
|
|
|
|
supermaxus
Участник
Offline
|
|
« Ответ #7 : 08-11-2010 21:09 » |
|
supermaxus, никак не пойму, о чём вы говорите. "Война и мир" целая. Ochkarik еще в первом посте указал на причину.
fermopili, если пишешь и отлаживаешь драйвер, неплохо бы отрубать авторебут.
Я тож еще только учусь, ответ от Ochkarik был подан как вопрос, т.о. не воспринялся как причина. PS Судя по ответу fermopili этого тож не понял..
|
|
« Последнее редактирование: 08-11-2010 21:14 от supermaxus »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #8 : 08-11-2010 21:31 » |
|
supermaxus, это был "пинок" в нужную сторону) объяснять подробнее не имеет смысла, тем более я область минифильтров никогда специально не изучал) просто в msdn на описание функции мельком глянул... и потом - такой подход всегда полезнее) заставляет вопрошающего лишний раз подумать) fermopili, подумать! а не скопипастить
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
fermopili
Интересующийся
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
Участник
Offline
|
|
« Ответ #10 : 10-11-2010 23:09 » |
|
Подскажите, что за семпл с файлом fltKernel.h? В 2003 DDK такого нету.. Под свисту чтоль?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #11 : 10-11-2010 23:14 » |
|
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #12 : 11-11-2010 20:23 » |
|
supermaxus, в WDK собственно есть раздел Samples. Там описаны все имеющиеся сэмплы. Плюс в каждом конкретном разделе эта информация частями дублируется.
|
|
|
Записан
|
|
|
|
supermaxus
Участник
Offline
|
|
« Ответ #13 : 11-11-2010 20:58 » |
|
supermaxus, в WDK собственно есть раздел Samples. Там описаны все имеющиеся сэмплы. Плюс в каждом конкретном разделе эта информация частями дублируется.
Ну, наверное ж и файловым поиском в ddk посмотрел и руками и в мсдне... Проблема в том, что web-формат мсдн-а поменяли, раньше они внизу указывали начиная с какой ОС функция доступна, теперь эта информация где-то в середине текста, мелким шрифтом - не с первой попытки найдешь. Данная функция доступна начиная со свисты, а у меня ддк 2003, где этого семпла (и функции) в природе не существует. Потому и спросил.
|
|
|
Записан
|
|
|
|
fermopili
Интересующийся
Offline
|
|
« Ответ #14 : 12-11-2010 17:03 » |
|
сборка 7600.16385.1
|
|
|
Записан
|
|
|
|
izlesa
Новенький
Offline
|
|
« Ответ #15 : 03-03-2011 09:33 » |
|
>>Подскажите, что за семпл с файлом fltKernel.h? В 2003 DDK такого нету.. Под свисту чтоль? Это не семпл, это основной заголовочный файл для минифильтров, лежит в $(WDKDIR)\inc\ddk\fltKernel.h
|
|
|
Записан
|
|
|
|
|