Когда скидывать данные на диск.
От: Ernesto  
Дата: 16.09.12 17:37
Оценка:
Есть драйвер виртуального диска с режимом записи. У него реализован плюс ко всему свой собственный кешь, формат файла можно сказать обязывает к этому. Необходимо при выключении компа скинуть этот кешь в файл, который может находиться на любом диске разумеется. Получается нужно дождаться такого момента, когда винда сама скинешь данные на мой виртуальный диск, и плсю к этому диск где лежит мой файл должен быть доступен для файловых операций.
Re: Когда скидывать данные на диск.
От: x64 Россия http://x64blog.name
Дата: 18.09.12 18:54
Оценка:
E>Необходимо при выключении компа скинуть этот кешь...

IoRegisterShutdownNotification()

E>...в файл, который может находиться на любом диске разумеется.


Это проблема?

E>Получается нужно дождаться такого момента, когда винда сама скинешь данные на мой виртуальный диск...


Зачем ждать?
Форсируй в нотификаторе.

E>...и плсю к этому диск где лежит мой файл должен быть доступен для файловых операций.


Опять же, это проблема?
JID: x64j@jabber.ru
Re[2]: Когда скидывать данные на диск.
От: Ernesto  
Дата: 18.09.12 19:18
Оценка:
Здравствуйте, x64, Вы писали:

E>>Необходимо при выключении компа скинуть этот кешь...


x64>IoRegisterShutdownNotification()


E>>...в файл, который может находиться на любом диске разумеется.


x64>Это проблема?


E>>Получается нужно дождаться такого момента, когда винда сама скинешь данные на мой виртуальный диск...


x64>Зачем ждать?

x64>Форсируй в нотификаторе.

E>>...и плсю к этому диск где лежит мой файл должен быть доступен для файловых операций.


x64>Опять же, это проблема?


Тут скорее вопрос не когда скидывать данные, а как сделать нужную очередность скидывания кеша. Вот пример такой:

Есть виртуальный диск, пусть на нем будит виртуальный партиция, которая маунтится на букву Z.
Есть файл, который лежит C:\Data_Z.dat

Начался процесс завершения виндовса, я поймал уведомление шатдауна.

1 — Поймал уведомление.
2 — Вызвал запись на диск С (Далее я думаю что больше данных не придет)
4 — В мой кешь пришли данные которые винда скинула со своего внутреннего кеша.
5 — Что мне с ними делать?

Если же предположить что на момент нотификации шатдауна все кеши пусты и запись невозможна, то и я уже не сохраню то что осталось лежать у меня в кеше. Получается закалдованный круг, который может победить лишь очередностью разрушения дисковых/FS стеков. Типа сначала полностью отработает мой стек, а потом тот на котором лежит мой файл.

ЗЫ: В Виндовсе 7 насколько я понял есть решение этой проблемы, там при создании дискового стека приходит запрос на зависимость IOCTL_STORAGE_DEPENDENT_DISK, но нигде не могу найти описание структуры для ответа. Размерность 20 байт. В инете вообще нет упоминания про этот контрол и тем более по структурам.
Re[3]: Когда скидывать данные на диск.
От: x64 Россия http://x64blog.name
Дата: 18.09.12 20:43
Оценка:
E>1 — Поймал уведомление.
E>2 — Вызвал запись на диск С (Далее я думаю что больше данных не придет)
E>4 — В мой кешь пришли данные которые винда скинула со своего внутреннего кеша.
E>5 — Что мне с ними делать?

Во-первых, тут у тебя ошибка в п.2 — в этот момент кэш надо сбрасывать не для файла-образа, а для виртуального тома, т.е. Z: в данном случае, при чём синхронно. Во-вторых, что значит "что делать"? Скидывать в файл-образ, а уже его данные, в свою очередь, будут автоматически сброшены на реальный диск самой системой сразу же после обработки первичных shutdown-колбеков.
JID: x64j@jabber.ru
Re[4]: Когда скидывать данные на диск.
От: Ernesto  
Дата: 18.09.12 21:35
Оценка:
Здравствуйте, x64, Вы писали:

E>>1 — Поймал уведомление.

E>>2 — Вызвал запись на диск С (Далее я думаю что больше данных не придет)
E>>4 — В мой кешь пришли данные которые винда скинула со своего внутреннего кеша.
E>>5 — Что мне с ними делать?

x64>Во-первых, тут у тебя ошибка в п.2 — в этот момент кэш надо сбрасывать не для файла-образа, а для виртуального тома, т.е. Z: в данном случае, при чём синхронно. Во-вторых, что значит "что делать"? Скидывать в файл-образ, а уже его данные, в свою очередь, будут автоматически сброшены на реальный диск самой системой сразу же после обработки первичных shutdown-колбеков.


А если эти первичные shutdown-колбеки для стека диска С уже были отработаны до моего колбека, те я его получил последним?
Re[5]: Когда скидывать данные на диск.
От: x64 Россия http://x64blog.name
Дата: 18.09.12 21:52
Оценка: 6 (1)
E>А если эти первичные shutdown-колбеки для стека диска С уже были отработаны до моего колбека, те я его получил последним?

Кэши файловых систем гарантировано сбрасываются после того, как отработают первичные нотификаторы, но до того, как будут вызваны вторичные.
JID: x64j@jabber.ru
Re[6]: Когда скидывать данные на диск.
От: Ernesto  
Дата: 18.09.12 21:57
Оценка:
Здравствуйте, x64, Вы писали:

E>>А если эти первичные shutdown-колбеки для стека диска С уже были отработаны до моего колбека, те я его получил последним?


x64>Кэши файловых систем гарантировано сбрасываются после того, как отработают первичные нотификаторы, но до того, как будут вызваны вторичные.


Согласен, но это делается не постоянно же, а единоразово, когда именно это будит сделано? Поидее мне нужно как то форсировать сброс кеша моего виртулаьного диска, что бы эти данные были уже у моего драйвера, что бы скинуть в файл. И плюс к тому же, кто то другой не должен ничего писать на мой диск при колбеке шатдауна.
Re[6]: Когда скидывать данные на диск.
От: Ernesto  
Дата: 18.09.12 21:59
Оценка:
В догонку:
я должен не только получить содержимое вин-кеша, но и заставить винду вообще закрыть мой том, ну те скинуть все метаданные, записать все NTFS логи.
Re[7]: Когда скидывать данные на диск.
От: x64 Россия http://x64blog.name
Дата: 18.09.12 22:21
Оценка: 6 (1)
E>...единоразово, когда именно это будит сделано?

Ещё раз: кэши файловых систем гарантировано сбрасываются после того, как отработают все первичные нотификаторы, но до того, как будут вызваны вторичные, — что из этого тебе не понятно?

E>Поидее мне нужно как то форсировать сброс кеша моего виртулаьного диска, что бы эти данные были уже у моего драйвера, что бы скинуть в файл.


Я уже говорил об этом здесь
Автор: x64
Дата: 19.09.12
, ты внимательно читаешь, что я пишу?

E>И плюс к тому же, кто то другой не должен ничего писать на мой диск при колбеке шатдауна.


Во-первых, я тут проблемы не вижу: словил нотификатор, размонтировал свой же том FSCTL_DISMOUNT_VOLUME, предварительно попытавшись мирно заблокировать том через FSCTL_LOCK_VOLUME и сбросив кэши через IRP_MJ_FLUSH_BUFFERS, кэши виндовые сбросились — всё, больше туда никто ничего не запишет, это я тебе как врач говорю. Во-вторых, кто там кому что должен это всё бабка надвое сказала: если какой-то драйвер решил вдруг использовать твой виртуальный диск как некое хранилище неких данных, то ты никак ему не помешаешь писать на твой диск и после того, как ты уже обработал нотификатор. Другой вопрос, что насколько грамотно тот драйвер будет спроектирован, по хорошему, он должен будет, как минимум, ловить размонтирование.
JID: x64j@jabber.ru
Re[8]: Когда скидывать данные на диск.
От: Ernesto  
Дата: 18.09.12 22:42
Оценка:
Здравствуйте, x64, Вы писали:

E>>...единоразово, когда именно это будит сделано?


x64>Ещё раз: кэши файловых систем гарантировано сбрасываются после того, как отработают все первичные нотификаторы, но до того, как будут вызваны вторичные, — что из этого тебе не понятно?


E>>Поидее мне нужно как то форсировать сброс кеша моего виртулаьного диска, что бы эти данные были уже у моего драйвера, что бы скинуть в файл.


x64>Я уже говорил об этом здесь
Автор: x64
Дата: 19.09.12
, ты внимательно читаешь, что я пишу?


E>>И плюс к тому же, кто то другой не должен ничего писать на мой диск при колбеке шатдауна.


x64>Во-первых, я тут проблемы не вижу: словил нотификатор, размонтировал свой же том FSCTL_DISMOUNT_VOLUME, предварительно попытавшись мирно заблокировать том через FSCTL_LOCK_VOLUME и сбросив кэши через IRP_MJ_FLUSH_BUFFERS, кэши виндовые сбросились — всё, больше туда никто ничего не запишет, это я тебе как врач говорю. Во-вторых, кто там кому что должен это всё бабка надвое сказала: если какой-то драйвер решил вдруг использовать твой виртуальный диск как некое хранилище неких данных, то ты никак ему не помешаешь писать на твой диск и после того, как ты уже обработал нотификатор. Другой вопрос, что насколько грамотно тот драйвер будет спроектирован, по хорошему, он должен будет, как минимум, ловить размонтирование.


Получается что я как бы не смогу выполнить обязательства, ведь другие драйвера тоже захотят скинуть на мой диск во время шатдауна данные. Если каждый начнет размонтировать когда не попадя, то это совсем не хорошо. Или все драйвера которые банально работают с файлами должны ловить размонтирование? И что даст это ловля, если диск уже не доступен? Если есть правило что при шатдауне можно что то писать, значит его и нужно придерживаться. Сам подумай, если так же поступит майкрософт, я начну в шатдауне писать, а диска С уже нет.
Re[9]: Когда скидывать данные на диск.
От: x64 Россия http://x64blog.name
Дата: 18.09.12 23:24
Оценка:
E>Получается что я как бы не смогу выполнить обязательства, ведь другие драйвера тоже захотят скинуть на мой диск во время шатдауна данные.

Какие-такие обязательства? В этом смысле момент завершения работы системы ни чем не отличается от момента за 5 минут до этого, за час до этого и т.д. — том может быть размонтирован в любой момент времени и, если какой-либо драйвер решил использовать его для своих каких-то очень важных системных нужд, он должен быть к этому готов или он должен железобетонно знать, что том никуда не денется.

E>Если каждый начнет размонтировать когда не попадя, то это совсем не хорошо.


Это демагогия. Не, можно порассуждать об этом, если очень хочется, но факт останется фактом — никто не запрещает размонтировать свои виртуальные тома в любой момент времени. А кроме того, голубчик, ты же сам говорил, что не хочешь, чтобы перед флашем своих данных кто-то писал на твой диск, — а раз так, зачем тебе чтобы кто-то мог туда писать? Бессмысленно. Это требование равносильно размонтированию, ну так почему бы тогда не сделать это правильно сразу?

E>Или все драйвера которые банально работают с файлами должны ловить размонтирование?


А как ты думал? Если некий драйвер делает с твоим томом нечто очень важное, он может не просто ловить размонтирование, а и даже запрещать его до тех пор, пока не завершит с ним работу.

E>И что даст это ловля, если диск уже не доступен?


Доступен.

E>Если есть правило что при шатдауне можно что то писать, значит его и нужно придерживаться.


Тот факт, что писать можно, совершенно не означает, что все смонтированные в системе тома должны быть доступны в каждый момент времени вплоть до перезагрузки. Не, я могу согласиться, что размонтирование фиксированных томов может выглядеть как-то странновато, но ничего особо страшного в этом не вижу, всё равно же пользователь принимает решение о том, какой софт ему ставить, если его устраивает, что у него том демонтируется перед перезагрузкой — ну так почему бы и нет?

E>Сам подумай, если так же поступит майкрософт, я начну в шатдауне писать, а диска С уже нет.


Я думаю, что Microsoft не демонтирует свои тома при завершении работы просто потому что они могут не делать этого. У тебя же нет выбора.
JID: x64j@jabber.ru
Re[10]: Когда скидывать данные на диск.
От: Ernesto  
Дата: 21.09.12 15:01
Оценка:
Здравствуйте, x64, Вы писали:

x64>Я думаю, что Microsoft не демонтирует свои тома при завершении работы просто потому что они могут не делать этого. У тебя же нет выбора.


Microsoft не демонтирует по той причине, что они просто реализовали нужный функционал. Выбор есть и у меня, реализовать тоже этот же функционал или разобраться с их реализаций и использовать ее. Сделали они это с помощью минифильтра файловой системы, который ставят на том, на котором лежит файл виртуального диска. Этот функционал экспортируется драйвером fsdepends.sys(там всего 7-8 функций), вот только объявление функций нигде нет в инете, IDA канечно помогла, но все же вопросов куча по этим функциям. В скопе решается проблема демонтирования тома, на котром леджиит файл, что бы скинуть все не сохраненные данные и корректно закрыть файл виртуального диска.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.