Нужно закрыть хендл файла в самый последний возможный момент при завершении винды. Не хочется дописывать драйверу функционал еще и фильтра файловой системы. Какие тут могут быть варианты?
Здравствуйте, 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. В принципе я могу подразумевать, что он всегда самый первый. Но этого же в МСДНе не оговаривается, поэтому данный подход немного не красивый и работает на честном слове. Вдруг потом изменится очередность этих вызовов.
E>... Так вот, драйвер файловой системы получает IRP_MJ_SHUTDOWN без всякой подписки, причем он потом кидает этот контрол вниз по стеку и мой драйвер тоже его ловит. Если я сам подпишусь на IRP_MJ_SHUTDOWN, то в итоге получу два раза этот контрол...
А в чем проблема создать еще одно устройство, которое не будет фильтром (и подписать его на shutdown)?
Я не совсем понял, у тебя именно фильтр класса Volume? Или всё же Disk? Т.е. ты SRBs ловишь? Если да, то там безо всяких подписок приходит SRB_FUNCTION_SHUTDOWN, — ну это тебе как вариант просто. А вообще зачем хендл-то закрывать? Как бы "в самый последний момент" система кэши всё равно сбросит, пусть хоть трижды открытый файл у тебя, или тебе другое надо?
Здравствуйте, x64, Вы писали:
E>>Думал что есть еще какой нибудь способ.
x64>Я не совсем понял, у тебя именно фильтр класса Volume? Или всё же Disk? Т.е. ты SRBs ловишь? Если да, то там безо всяких подписок приходит SRB_FUNCTION_SHUTDOWN, — ну это тебе как вариант просто. А вообще зачем хендл-то закрывать? Как бы "в самый последний момент" система кэши всё равно сбросит, пусть хоть трижды открытый файл у тебя, или тебе другое надо?
У меня Volume. По поводу зачем закрывать. Есть в винде плохой один момент, если не закрыть файл, который защитили от дефрага с помощью FSCTL_MARK_HANDLE, то при некоторых условиях винда банально не может выключиться. Если закрывать хендл такого файла, то проблемы нет.