| 
							Thor
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 «  : 23-08-2004 07:56 »   | 
								
								 | 
							  
							 
							Добрый день, я пытаюсь написать драйвер фильтр файловой системы для фильтрации IRP_MJ_CREATE  запросов. За основу взял sfilter example из IFS Kit. Сейчас на этапе теста я просто отсылаю имя файла полученое в обработчике  IRP_MJ_CREATE юзер процессу. Я заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла. Все фаст функции зарегестрированы и все возвращают FALSE. Функция получения имени скопирована из ФайлСпая (ИФС Кит сампл). Но есть небольшое но.... после запуска и во время работы Файл Монитора с сис интерналс мне начинают приходить IRP_MJ_CREATE и всё работает чётко. Насколько я понял ФайлМон эту лазейку(через которую без IRP_MJ_CREATE открываются файлы) прикрывает. Если кто встречался с подобными проблемами или знает где я что не так сделал, пожалуйста подскажите как заставить систему присылать мне IRP_MJ_CREATE. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							mad
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 23-08-2004 08:17 »   | 
								
								 | 
							  
							 
							 Я заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла
 
 пример привести можешь этих условий?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Thor
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 23-08-2004 08:33 »   | 
								
								 | 
							  
							 
							Закономерностей особых не наблюдается - вобщето для теста должно заблокать .тхт файл - так вот иногда оно его блокает ( аксесс денаед ), иногда открывает. Я ДебагПринтом печатаю  - или это .тхт или нет - когда не блокает открытие то приходит один IRP_MJ_CREATE после него квери информатион и клосе - это вроде файл менеджер получает инфо по файлу - а второго IRP_MJ_CREATE , нотепадовского нету.  Если включить файлмон то блокает все файлы .тхт и приходит два IRP_MJ_CREATE с нормальным именем. Была версия что не ловлю нормально имя - но функция вроде Микрософтом написана и никакого ерора не возвращает. Была версия что что это нотепад с мемори маппед файлами чё то химичит - но копирование тоже блокется через раз. Квери опен заблокирован как и все фаст ио.
  Да что ещё интересно - ФайлСпай (мною не погрызеный ) эти IRP_MJ_CREATE  тоже не ловит - или их просто нету  :? . 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 26-08-2004 08:05 »   | 
								
								 | 
							  
							 
							На будущее- пиши названия на языке оригинала, а то если тут начнут все по русски писать, смешно будет.   заметил что не при всех открытиях файлов мне приходит IRP_MJ_CREATE для открываемового/копируемого файла
 
 Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT.   Функция получения имени скопирована из ФайлСпая (ИФС Кит сампл). 
 
 Чего за функция, имя бы написал.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sss
							
								Специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 26-08-2004 08:21 »   | 
								
								 | 
							  
							 
							Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет.
  А во всех операционных системах ?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							 while (8==8)  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 26-08-2004 09:05 »   | 
								
								 | 
							  
							 
							 А во всех операционных системах ?
 
 Да! :new_shot:  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Anonymous
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 26-08-2004 09:12 »   | 
								
								 | 
							  
							 
							IoCreateStreamFileObject - хотелось бы уточнить насчёт этой функции, с её помощью можна получить доступ к файлу и она не отсылает IRP_MJ_CREATE - но в параметрах  есть FILE_OBJECT - может быть 0 - при его получении прийдёт IRP_MJ_CREATE , и  DEVICE_OBJECT  - если FILE_OBJECT == 0 то , DEVICE_OBJECT  должен != 0. Интересно или DEVICE_OBJECT может получить юзер процес и может ли юзер процесс использовать IoCreateStreamFileObject .  Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. 
  Чёрт его знает - сел переписал общение с юзер процесом на масив событий - начало блокать все .тхт файлы (вроде бы). :?   Чего за функция, имя бы написал.
 
 Функция SpyGetFullPathName.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Thor
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 26-08-2004 09:16 »   | 
								
								 | 
							  
							 
							Верхний пост мой. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 26-08-2004 12:56 »   | 
								
								 | 
							  
							 
							Thor,  пиши более понятно.  IoCreateStreamFileObject - хотелось бы уточнить насчёт этой функции, с её помощью можна получить доступ к файлу 
 
 С ее помощью нельзя получить доступ к файлу, чтоб получить доступ нужно иметь FILE_OBJECT.   Интересно или DEVICE_OBJECT может получить юзер процес и может ли юзер процесс использовать IoCreateStreamFileObject . 
 
 Чего спросил понял? Как ты из юзер мода ее вызовешь? DeviceObject в нее передают для получения FILE_OBJECT чтоб юзать часть диска как файл, обычно чтоб закешировать. ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT.   :new_shot:   :new_shot:   :new_shot:  - Если кто не понял.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							point
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 27-08-2004 05:31 »   | 
								
								 | 
							  
							 
							"ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. " нет это не так -  http://www.osronline.com/article.cfm?id=102(нужна регистрация, но она формальная) "A file system has several mechanisms for creating file objects that it may use for its own internal processing.  These include IoCreateStreamFileObject, IoCreateStreamFileObjectLite, and IoCreateStreamFileObjectEx. " "“Thus filter drivers should expect to receive IRP_MJ_CLOSE requests for previously unseen file objects.” Of course, the fact that a file system filter driver receives an IRP_MJ_CLOSE operation for file objects which were never indicated to the filter driver does complicate reference counting." правда IoCreateStreamFileObject создает новый FileObject на основе ранее созданного и прошедшего через irp_mj_create.  но для файловых фильтров всегда нужно быть готовым к появлению FileObject, для которых не был вызван irp_mj_create. point.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							point
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 27-08-2004 05:40 »   | 
								
								 | 
							  
							 
							в догонку:
  если внимательно посмотреть на доку к IoCreateStreamFileObject, то в конце можно увидеть следующее:
  "File system filter driver writers should note that IoCreateStreamFileObject causes an IRP_MJ_CLEANUP request to be sent to the file system driver stack for the volume. Because file systems often create stream file objects as a side effect of operations other than IRP_MJ_CREATE, it is difficult for filter drivers to reliably detect stream file object creation. Thus a filter driver should expect to receive IRP_MJ_CLEANUP and IRP_MJ_CLOSE requests for previously unseen file objects. "
  плюс ко всему входной FileObject у этой ф-ии опциональный, на сколько я понимаю при его отсутствии происходит создание FileObject для доступа к тому на основе переданного DeviceObject.
  point. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Thor
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 27-08-2004 06:31 »   | 
								
								 | 
							  
							 
							 Чего спросил понял? Как ты из юзер мода ее вызовешь?  DeviceObject в нее передают для получения FILE_OBJECT чтоб юзать часть диска как файл, обычно чтоб закешировать. 
  ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT.     - Если кто не понял.
 
 Я то понял чего спросил , меня интересовало или юзер процес с помощью IoCreateStreamFileObject  может получить доступ к файлу.   Как ты из юзер мода ее вызовешь? 
 
 откуда я знаю как я её вызову? Но это похоже на ответ, спасибо.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 27-08-2004 08:02 »   | 
								
								 | 
							  
							 
							point, Эта ф-ция сделана только для УДОБСТВА чтоб не документировать закрытую ф-цию ObCreateObject, а так можно ее использовать.  нет это не так - 
 
 Так, именно так. А тебе наверно следовало более внимательно прочитать статью. Во первых FILE_OBJECT надо проинициализировать, это только в IRP_MJ_CREATE и ТОЛЬКО в нем. Если файловая система ХОЧЕТ создать FILE_OBJECT для своих целей- она это может сделать кучей способов, но это FILE_OBJECT для внутреннего использования. Также она может создавать какие угодно объекты для внутреннего использования, но внешний интерфейс- олько через IRP_MJ_CREATE.  плюс ко всему входной FileObject у этой ф-ии опциональный, на сколько я понимаю при его отсутствии происходит создание FileObject для доступа к тому на основе переданного DeviceObject. 
 
 Вот доку прочти внимательно про опциональность - два варианта 1) Если передал не NULL FILE_OBJECT - то созданный FILE_OBJECT используется для доступа к каким то специфичным свойствам файла. При этом на второй аргумент система забивает. 2) Если NULL передали то создается FILE_OBJECT для доступа к диску, наужно это для использования менеджера кэша для кеширования всего или части диска, как файла. ПРИ ЭТОМ- ФАЙЛОВАЯ СИСТЕМА САМА ИНИЦИАЛИЗИРУЕТ ЭТОТ FILE_OBJECT ТАКЖЕ КАК И В IRP_MJ_CRETATE. То есть использовать эту ф-цию для создания валидного объекта из внешнего по потношению к файловой системе модуля ты НЕ МОЖЕШЬ.  Вот такие вот пироги.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 27-08-2004 08:12 »   | 
								
								 | 
							  
							 
							Thor,   Я то понял чего спросил , меня интересовало или юзер процес с помощью IoCreateStreamFileObject может получить доступ к файлу. 
 
 НЕТ не может этот FileObject не будет до конца проинициализирован, все упадет в BSOD. Причем вызвать из юзер мода эту ф-цию нельзя - только посредством другого драйвера. Почему будет невалидным FileObject - читай в ответе к point.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							point
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 27-08-2004 08:13 »   | 
								
								 | 
							  
							 
							2slavai
  меня не надо учить.  вопрос был окуда беруться FileObject-ы не прошедшие через IRP_MJ_CREATE - я дал ссылку где это объясняется.. Ваша фраза "ЕЩЕ РАЗ! Все запросы на создание FILE_OBJECT идут через IRP_MJ_CREATE, другого пути нет. Это я тебе гарантирую - только там инициализируется FILE_OBJECT. " просто не верна в данном контексте..  человек разрабатывает фильтр файловой системы так что назвать этот продукт "внешним по отношению к fs" достаточно сложно...
  point. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 27-08-2004 08:16 »   | 
								
								 | 
							  
							 
							 меня не надо учить. 
 
 ну хорошо   вопрос был окуда беруться FileObject-ы не прошедшие через IRP_MJ_CREATE - я дал ссылку где это объясняется
 
 только почему то выглядело это так как утверждение о возможности создания валидного объекта в обход IRP_MJ_CREATE. Так сразу бы дал ссылку на ObCreateObject, только толку никакого, не сделаешь ей ничего в обход IRP_MJ_CREATE (особенно твой второй пост).  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							point
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #16 : 27-08-2004 08:30 »   | 
								
								 | 
							  
							 
							"сразу бы дал ссылку на ObCreateObject, только толку никакого, не сделаешь ей ничего в обход IRP_MJ_CREATE ."
  риторический вопрос: зачем ему ссылка на эту вещь? 
  мысли вслух: FS фильтры область сложна и запутаная. она усложнена как девелоперами от MS так и сторонними разработчиками фильтров. тот кто занимается разработкой в этой области должен держать в голове кучу инфы, которая толком нигде не описана и либо нарабатывается собственным опытом либо берется из чужих сырцов (в лучшем случае). поэтому перегружать себя инфой о таких подробностях реализации ОСи смысла особого нет... первоначальный вопрос этой ветки никаким образом к  ObCreateObject не относился может общие знания об этой ф-ии и будут полезны но не в данном случае... просто при отслеживании объектов открываемых на файловой системе нужно быть готовым к тому что в запросах будут приходить FileObject-ы не прошедшие IRP_MJ_CREATE и поэтому нельзя использовать FileObject в качестве ключа для поиска. обычно рекомендуют юзать FsContext. люди из OSR описали в своей статье как можно решить эту проблему. 
  point. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #17 : 27-08-2004 08:44 »   | 
								
								 | 
							  
							 
							 запросах будут приходить FileObject-ы не прошедшие IRP_MJ_CREATE и поэтому нельзя использовать FileObject в качестве ключа для поиска
 
 Я вобще не понимаю людей которые не предусматривают возможность того, что в их базе данных FILE_OBJECT ов не окажется пришедшего, такие ситуации надо корректно обрабатывать. У меня это всегда предусмотрено.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Thor
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #18 : 27-08-2004 18:39 »   | 
								
								 | 
							  
							 
							Понятно спасибо,  и ещё такой вопросик можно при обработке IRP_MJ_CREATE его передать нижнему драйверу потом отменить (IoCancelFileOpen) и потом ещё раз передать вниз? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Thor
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #19 : 30-08-2004 06:54 »   | 
								
								 | 
							  
							 
							Мне просто надо передать вниз чтоб узнать или это не директория, потом отменить открытия файла чтоб юзер процесс мог его открыть ну и потом уже или пустить вниз или отменить открытие. Так можна делать?: - Скопировать Irp в локальную пременную - Передать вниз  - Отменить открытие файла - Скопировать из локальной переменной назад в Irp - Передать вниз или отменить. Или просто перед открытием поставить в IrpSp->Parameters.Create.ShareAccess флажок FILE_SHARE_READ и не парится? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							SlavaI
							
								Главный специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #20 : 02-09-2004 07:13 »   | 
								
								 | 
							  
							 
							 Понятно спасибо, и ещё такой вопросик можно при обработке IRP_MJ_CREATE его передать нижнему драйверу потом отменить (IoCancelFileOpen) и потом ещё раз передать вниз?
 
 Можно.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |