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, ты где был? =)
|
|
|
Записан
|
|
|
|
|