| 
			| 
					
						| Xor 
								Гость
 | 
								|  | «  : 04-05-2004 22:17 »  |  | 
 
 Возможно ли откыть файл в одном потоке а читать/писать в другом?
 На практике у меня не получилось, хотя в MSDN ничего по этому поводу не видел :-/
 
 Можно ли вообще это сделать?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| npak | 
								|  | « Ответ #1 : 05-05-2004 09:53 »  |  | 
 
 Да, можно.  Handle можно передавать из потока (thread) в другой поток того же процесса. |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Xor 
								Гость
 | 
								|  | « Ответ #2 : 05-05-2004 10:08 »  |  | 
 
 Передать-то можно, только потом обламывается чтение/запись. Invalid handle (0xc00...08)
 PS Это все в драйвере. И потоки разные получаются при вызове IRP запросов. Как только вызов идет из другого потока сразу обламываеть работа с файлом.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| npak | 
								|  | « Ответ #3 : 05-05-2004 10:13 »  |  | 
 
 А если читать в том же потоке?
 Файл открыт для чтения / записи (CreateFile)?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #4 : 05-05-2004 13:49 »  |  | 
 
 npak, это в драйвере, тут API другой!!!
 При работе с файлами из драйвера не стоит ИМХО пользоваться одинм файлом одновременно с разных потоков, я никогда такого не делал, но думаю тебе надо либо синхронизировать потоки так, что бы работать с данными а писать в файл только по запросу из одного потока, который будет иметь очередь входящих на запись данных!
 |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #5 : 05-05-2004 14:02 »  |  | 
 
 В драйвере можно, только если драйвер всегда вызывается в том процессе, которому принадлежит handle.Handle принадлежит процессу, а не потоку.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| npak | 
								|  | « Ответ #6 : 05-05-2004 14:15 »  |  | 
 
 Так интересует работа с файлом внутри драйвера?
 То есть как написать обработчики для IRP_MJ_CREATE/IRP_MJ_READ/IRP_MJ_WRITE, чтобы эти операции работали корректно при обращениях из разных потоков?
 
 Или как из драйвера обращаться к файловой системе?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Гром 
								Птычк. Тьфу, птычник... Вот! 
								Готовлюсь к пенсии
								
								    Offline 
								Пол:   
								Бодрый птах
								
								
								
								
								
							 | 
								|  | « Ответ #7 : 05-05-2004 14:25 »  |  | 
 
 npak,  Или как из драйвера обращаться к файловой системе?
 
 Именно это имелось ввиду! |  
						| 
								|  |  
								|  |  Записан | 
 
 А птичку нашу прошу не обижать!!! |  |  | 
	| 
			| 
					
						| Xor 
								Гость
 | 
								|  | « Ответ #8 : 05-05-2004 18:13 »  |  | 
 
 Проблема была в том, что я открыл файл на обраюотке одного из вызовов IRP_MJ_READ/IRP_MJ_WRITE. И пару запросов прошло нормально, а потом, видимо вызвали из другого процесса(?) и все перестало работать.
 Видимо придется делать поток и перенаправлять туда запросы.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #9 : 06-05-2004 06:49 »  |  | 
 
 видимо вызвали из другого процесса(?)
 
 Из другого процесса по handle обращаться нельзя, по указателю на FileObject можно. Handle - это индекс в таблице указателей, принадлежащей процессу. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| npak | 
								|  | « Ответ #10 : 06-05-2004 10:37 »  |  | 
 
 Проблема была в том, что я открыл файл на обраюотке одного из вызовов IRP_MJ_READ/IRP_MJ_WRITE. И пару запросов прошло нормально, а потом, видимо вызвали из другого процесса(?) и все перестало работать.
 Видимо придется делать поток и перенаправлять туда запросы.
 Что-то я не понимаю про процессы   Ты пишешь про код, который работает в ядре?  Так, насколько я понимаю, в ядре нет процессов.  Там есть многопотоковость и есть драйверные объекты (ну и ещё много чего, конечно).  Процесс -- это понятие уровня user-mode (или я не прав?). Можно предложить такой способ -- при каждой отдельной опереации открывать файл, писать/читать и сразу закрывать.  Будут потери во времени, конечно. Да, кстати, а FILE_SHARE_READ/FILE_SHARE_WRITE выставлены при открытии файла (ZwOpenFile/ZwCreateFile)? |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| npak | 
								|  | « Ответ #11 : 06-05-2004 14:30 »  |  | 
 
 Мда, похоже я был не прав про процессы и ядро.  
 И  FILE_SHARE_READ/FILE_SHARE_WRITE здесь, похоже, тоже ни при чём.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #12 : 06-05-2004 15:00 »  |  | 
 
 Процесс -- это понятие уровня user-mode (или я не прав?).
 
 Не прав. Даже в пространстве ядра часть памяти разная для разных процессов. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| npak | 
								|  | « Ответ #13 : 06-05-2004 15:27 »  |  | 
 
 Тогда, получается, пользоваться handle в драйвере небезопасно.  То есть при повторных обращениях к handle надо проверять, что обращение идет из того же процесса, в контексте которого данный handle был создан.  
 Хочется надеяться, что в рамках одного процесса handle можно использовать из разных потоков.  Хотя ктож её знает, Винду.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #14 : 07-05-2004 06:17 »  |  | 
 
 Тогда, получается, пользоваться handle в драйвере небезопасно. То есть при повторных обращениях к handle надо проверять, что обращение идет из того же процесса, в контексте которого данный handle был создан.
 
 Используй FileObject или ставь флаг KERNEL_HANDLE- тогда он будет в глобальной таблице ядра и будет доступен только в режиме ядра.  Хочется надеяться, что в рамках одного процесса handle можно использовать из разных потоков. Хотя ктож её знает, Винду.
 
 Еще раз- Handle это индекс в таблице, содержащей адреса объектов, у каждого процесса эта таблица своя. Соотвественно все потоки процесса используют эту же таблицу. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Xor 
								Гость
 | 
								|  | « Ответ #15 : 07-05-2004 17:31 »  |  | 
 
 Спасибо. дельно все объяснил. Для общности думаю стоит сделать класс на  FileObject. 
 Но какие фукции нужно использовать? ZwReadFile использует Handle. Я могу получить указатель на объект для файла -ObReferenceObjectByHandle, но как потом его использовать для работы?
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Anonymous 
								Гость
 | 
								|  | « Ответ #16 : 11-05-2004 20:48 »  |  | 
 
 npak, это в драйвере, тут API другой!!!
 
 При работе с файлами из драйвера не стоит ИМХО пользоваться одинм файлом одновременно с разных потоков, я никогда такого не делал, но думаю тебе надо либо синхронизировать потоки так, что бы работать с данными а писать в файл только по запросу из одного потока, который будет иметь очередь входящих на запись данных!
 
 Какая чушь. Синхронизация доступа к устройству (HDD) формируется на самом низком драйвере. И я на все 100 уверен что так оно и есть. И синхронизовывать zwRead/Write или IoCallDriver никчему |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| SlavaI 
								Главный специалист    Offline | 
								|  | « Ответ #17 : 12-05-2004 10:25 »  |  | 
 
 но как потом его использовать для работы
 
 создавать свой IRP |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Anonymous 
								Гость
 | 
								|  | « Ответ #18 :  12-05-2004 13:14 »   |  | 
 
 SlavaI, ты где был? =) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |