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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Файлы в разных потоках  (Прочитано 17070 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Xor
Гость
« : 04-05-2004 22:17 » 

Возможно ли откыть файл в одном потоке а читать/писать в другом?

На практике у меня не получилось, хотя в MSDN ничего по этому поводу не видел :-/

Можно ли вообще это сделать?
Записан
npak
Команда клуба

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

« Ответ #1 : 05-05-2004 09:53 » 

Да, можно.  Handle можно передавать из потока (thread) в другой поток того же процесса.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Xor
Гость
« Ответ #2 : 05-05-2004 10:08 » 

Передать-то можно, только потом обламывается чтение/запись. Invalid handle (0xc00...08)

PS Это все в драйвере. И потоки разные получаются при вызове IRP запросов. Как только вызов идет из другого потока сразу обламываеть работа с файлом.
Записан
npak
Команда клуба

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

« Ответ #3 : 05-05-2004 10:13 » 

А если читать в том же потоке?

Файл открыт для чтения / записи (CreateFile)?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #4 : 05-05-2004 13:49 » 

npak, это в драйвере, тут API другой!!!

При работе с файлами из драйвера не стоит ИМХО пользоваться одинм файлом одновременно с разных потоков, я никогда такого не делал, но думаю тебе надо либо синхронизировать потоки так, что бы работать с данными а писать в файл только по запросу из одного потока, который будет иметь очередь входящих на запись данных!
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 05-05-2004 14:02 » 

В драйвере можно, только если драйвер всегда вызывается в том процессе, которому принадлежит handle.
Handle принадлежит процессу, а не потоку.
Записан
npak
Команда клуба

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

« Ответ #6 : 05-05-2004 14:15 » 

Так интересует работа с файлом внутри драйвера?

То есть как написать обработчики для IRP_MJ_CREATE/IRP_MJ_READ/IRP_MJ_WRITE, чтобы эти операции работали корректно при обращениях из разных потоков?

Или как из драйвера обращаться к файловой системе?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 05-05-2004 14:25 » 

npak,
Цитата

Или как из драйвера обращаться к файловой системе?

Именно это имелось ввиду!
Записан

А птичку нашу прошу не обижать!!!
Xor
Гость
« Ответ #8 : 05-05-2004 18:13 » 

Проблема была в том, что я открыл файл на обраюотке одного из вызовов IRP_MJ_READ/IRP_MJ_WRITE. И пару запросов прошло нормально, а потом, видимо вызвали из другого процесса(?) и все перестало работать.

Видимо придется делать поток и перенаправлять туда запросы.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 06-05-2004 06:49 » 

Цитата

 видимо вызвали из другого процесса(?)


Из другого процесса по handle обращаться нельзя, по указателю на FileObject можно. Handle - это индекс в таблице указателей, принадлежащей процессу.
Записан
npak
Команда клуба

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

« Ответ #10 : 06-05-2004 10:37 » new

Цитата: Xor
Проблема была в том, что я открыл файл на обраюотке одного из вызовов IRP_MJ_READ/IRP_MJ_WRITE. И пару запросов прошло нормально, а потом, видимо вызвали из другого процесса(?) и все перестало работать.

Видимо придется делать поток и перенаправлять туда запросы.

Что-то я не понимаю про процессы Жаль

Ты пишешь про код, который работает в ядре?  Так, насколько я понимаю, в ядре нет процессов.  Там есть многопотоковость и есть драйверные объекты (ну и ещё много чего, конечно).  Процесс -- это понятие уровня user-mode (или я не прав?).

Можно предложить такой способ -- при каждой отдельной опереации открывать файл, писать/читать и сразу закрывать.  Будут потери во времени, конечно.

Да, кстати, а FILE_SHARE_READ/FILE_SHARE_WRITE выставлены при открытии файла (ZwOpenFile/ZwCreateFile)?
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
npak
Команда клуба

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

« Ответ #11 : 06-05-2004 14:30 » 

Мда, похоже я был не прав про процессы и ядро.  

И  FILE_SHARE_READ/FILE_SHARE_WRITE здесь, похоже, тоже ни при чём.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 06-05-2004 15:00 » 

Цитата

 Процесс -- это понятие уровня user-mode (или я не прав?).


Не прав. Даже в пространстве ядра часть памяти разная для разных процессов.
Записан
npak
Команда клуба

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

« Ответ #13 : 06-05-2004 15:27 » 

Тогда, получается, пользоваться handle в драйвере небезопасно.  То есть при повторных обращениях к handle надо проверять, что обращение идет из того же процесса, в контексте которого данный handle был создан.  

Хочется надеяться, что в рамках одного процесса handle можно использовать из разных потоков.  Хотя ктож её знает, Винду.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
SlavaI
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline Offline

« Ответ #17 : 12-05-2004 10:25 » 

Цитата

но как потом его использовать для работы


создавать свой IRP
Записан
Anonymous
Гость
« Ответ #18 : 12-05-2004 13:14 » 

SlavaI, ты где был? =)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines