Закрыть хендл файла.
От: Ernesto  
Дата: 19.06.13 19:41
Оценка:
Нужно закрыть хендл файла в самый последний возможный момент при завершении винды. Не хочется дописывать драйверу функционал еще и фильтра файловой системы. Какие тут могут быть варианты?
Re: Закрыть хендл файла.
От: EreTIk EreTIk's Box
Дата: 20.06.13 10:36
Оценка:
E>Нужно закрыть хендл файла в самый последний возможный момент при завершении винды.
IoRegisterShutdownNotification:

The system sends the driver the IRP_MJ_SHUTDOWN request before it flushes the file systems.

Re[2]: Закрыть хендл файла.
От: Ernesto  
Дата: 21.06.13 21:06
Оценка:
Здравствуйте, EreTIk, Вы писали:

E>>Нужно закрыть хендл файла в самый последний возможный момент при завершении винды.

ETI>IoRegisterShutdownNotification:

ETI>

ETI>The system sends the driver the IRP_MJ_SHUTDOWN request before it flushes the file systems.


Думал что есть еще какой нибудь способ. Минус этого подхода сейчас расскажу. У меня драйвер фильтр тома, т.е. он по сути в дисковом стеке, на конце которого драйвер файловой системы. Так вот, драйвер файловой системы получает IRP_MJ_SHUTDOWN без всякой подписки, причем он потом кидает этот контрол вниз по стеку и мой драйвер тоже его ловит. Если я сам подпишусь на IRP_MJ_SHUTDOWN, то в итоге получу два раза этот контрол. Причем они сильно отличаются по своим возможностям, точнее тому, что я могу делать в этих обработчиках. Вот IRP_MJ_SHUTDOWN мне подойдет, но подойдет тот, что отрабатывает по моей подписки через IoRegisterShutdownNotification. В принципе я могу подразумевать, что он всегда самый первый. Но этого же в МСДНе не оговаривается, поэтому данный подход немного не красивый и работает на честном слове. Вдруг потом изменится очередность этих вызовов.
Re[3]: Закрыть хендл файла.
От: EreTIk EreTIk's Box
Дата: 21.06.13 21:17
Оценка: +1
E>... Так вот, драйвер файловой системы получает IRP_MJ_SHUTDOWN без всякой подписки, причем он потом кидает этот контрол вниз по стеку и мой драйвер тоже его ловит. Если я сам подпишусь на IRP_MJ_SHUTDOWN, то в итоге получу два раза этот контрол...

А в чем проблема создать еще одно устройство, которое не будет фильтром (и подписать его на shutdown)?
Re[3]: Закрыть хендл файла.
От: x64 Россия http://x64blog.name
Дата: 22.06.13 00:06
Оценка:
E>Думал что есть еще какой нибудь способ.

Я не совсем понял, у тебя именно фильтр класса Volume? Или всё же Disk? Т.е. ты SRBs ловишь? Если да, то там безо всяких подписок приходит SRB_FUNCTION_SHUTDOWN, — ну это тебе как вариант просто. А вообще зачем хендл-то закрывать? Как бы "в самый последний момент" система кэши всё равно сбросит, пусть хоть трижды открытый файл у тебя, или тебе другое надо?
JID: x64j@jabber.ru
Re[4]: Закрыть хендл файла.
От: Ernesto  
Дата: 22.06.13 00:13
Оценка:
Здравствуйте, x64, Вы писали:

E>>Думал что есть еще какой нибудь способ.


x64>Я не совсем понял, у тебя именно фильтр класса Volume? Или всё же Disk? Т.е. ты SRBs ловишь? Если да, то там безо всяких подписок приходит SRB_FUNCTION_SHUTDOWN, — ну это тебе как вариант просто. А вообще зачем хендл-то закрывать? Как бы "в самый последний момент" система кэши всё равно сбросит, пусть хоть трижды открытый файл у тебя, или тебе другое надо?


У меня Volume. По поводу зачем закрывать. Есть в винде плохой один момент, если не закрыть файл, который защитили от дефрага с помощью FSCTL_MARK_HANDLE, то при некоторых условиях винда банально не может выключиться. Если закрывать хендл такого файла, то проблемы нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.