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 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |