суть проблемы: мы разрабатываем устройство работающее под управлением windows embedded 8.
В системе будет использоваться HORM.
Horm это фича системы, суть которой что когда она включена, то все изменения файлов сохраняются в оперативной памяти, записи на диск не происходит. После перезагрузки системы все изменения теряются.
Подробнее об HORM — http://msdn.microsoft.com/en-us/library/jj980177(v=winembedded.81).aspx
(Мы вынуждены это использовать, т.к. это одно из требований.)
Проблема в том, что нам нужно чтобы определённые файлы всё-же писались на диск, к сожалению нормальным образом это сделать невозможно.
Мы поисследовали принцип работы HORM'а, работает он примерно так: запросы к файловой системе проходят через минифильтр uwfs.sys, изменения файлов редиректятся в драйвер uwfvol.sys, который сохраняет изменения в оверлее uwfswap.sys
B>Чтобы получить указатель на ntfs драйвер использую IoGetDeviceAttachmentBaseRef: B>PDEVICE_OBJECT lowestDriver = IoGetDeviceAttachmentBaseRef(DeviceObject); B>Как этому драйверу корректно послать полученный Irp? (как правильно настроить stack location и тд).
Ну да, верно, а потом нужный запрос шли ему так же, как выше в коде, только вместо pDevExt->AttachedToDeviceObject подставь lowestDriver. Это если просто прокинуть до нужного драйвера, а если, например, надо уведомление о завершении запроса получить, то уже чуть по-другому. И помни, что файловый фильтр может быть не один, что будет, если ты прокинешь не только uwfs.sys, но и какой-нибудь шифрующий фильтр по ходу дела? Нехорошо будет явно. Подробнее про обработку IRPs читать здесь:
Здравствуйте, belp, Вы писали:
B>Добрый день,
B>суть проблемы: мы разрабатываем устройство работающее под управлением windows embedded 8. B>В системе будет использоваться HORM. B>Horm это фича системы, суть которой что когда она включена, то все изменения файлов сохраняются в оперативной памяти, записи на диск не происходит. После перезагрузки системы все изменения теряются. B>Подробнее об HORM — http://msdn.microsoft.com/en-us/library/jj980177(v=winembedded.81).aspx
B>(Мы вынуждены это использовать, т.к. это одно из требований.)
[skip]
Правильным решением будет все-же просто добавить ваши файлы в исключения. По приведенной вами ссылке об этом упоминается. здесь
А то что вы хотите зделать, нарушит весь файловый стек и в общем случае будет не рабочим.
И вобще legacy фильтры зло, на дворе 21 век. здесь про минифильтры и зачем они задумывались, ключевое слова альтитуда
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Добрый день,
x64>Ну да, верно, а потом нужный запрос шли ему так же, как выше в коде, только вместо pDevExt->AttachedToDeviceObject подставь lowestDriver. Это если просто прокинуть до нужного драйвера, а если, например, надо уведомление о завершении запроса получить, то уже чуть по-другому. И помни, что файловый фильтр может быть не один, что будет, если ты прокинешь не только uwfs.sys, но и какой-нибудь шифрующий фильтр по ходу дела? Нехорошо будет явно. Подробнее про обработку IRPs читать здесь: x64>Different ways of handling IRPs — cheat sheet (part 1 of 2) x64>Different ways of handling IRPs — cheat sheet (part 2 of 2) B>>...есть готовые решения? x64>Готовые это вряд ли, посмотри здесь, например, но что-то я сомневаюсь, что оно поддерживает Embedded-системы.
Спасибо за ссылки, изучаю.
СР>Правильным решением будет все-же просто добавить ваши файлы в исключения. По приведенной вами ссылке об этом упоминается. здесь СР>А то что вы хотите зделать, нарушит весь файловый стек и в общем случае будет не рабочим. СР>И вобще legacy фильтры зло, на дворе 21 век. здесь про минифильтры и зачем они задумывались, ключевое слова альтитуда
Если добавить registry или file exclusion то HORM просто не включится, выдаст ошибку:
Error: Could not enable HORM (Generic failure). Please ensure following configurations are properly set in both current session and next session before enabling HORM:
1.Filter is enabled;
2.All fixed volumes are protected;
3.No user defined registry exclusion;
4.No user defined file exclusion;
5.Hibernation feature has been turned on by 'powercfg.exe -H ON'.
В windows embedded XP и Windows Embedded 7 был способ обойти эту проблему:
создавался дополнительный раздел, перед включением HORM'а этот раздел отмонтировался, потом когда HORM включался раздел снова монтировался. В результате этот раздел не защищался UWF, и данные писались на диск.
Но в Windows Embedded 8 это уже не прокатывает, вылазит та-же ошибка что и выше.
Я понимаю что то что я хочу сделать это не самая лучшая затея, но других идей пока нет..
Что касается минифильтра, мне показалось из legacy фильтра будет проще прокинуть irp вниз по стеку (вообще я думал это не так принципиально).
Уточню — мы делаем embedded систему, никакого пользовательского софта там не будет.
B>Уточню — мы делаем embedded систему, никакого пользовательского софта там не будет.
Коли так, то, наверное, пофигу, делай legacy-фильтр, только делай грамотно, нельзя просто так прокидывать одни запросы, и не трогать другие, делай виртуализацию тех файлов, которые хотите прокинуть, т.е. сопровождай их от момента Create до момента Close, я не в курсе особенностей работы uwfs.sys, но есть вероятность, что ему (а значит и всей системе в целом) может поплохеть, если он, например, вдруг увидит Close, для которого не видел ранее Create или записей. Но это всё мои домыслы, пробуй, начни с малого, а если не будет получаться, то всегда можно обратиться сюда или заказать работу тому, кто уже имел дело с фильтрацией файловой системы.
[skip]
СР>>Правильным решением будет все-же просто добавить ваши файлы в исключения. По приведенной вами ссылке об этом упоминается. здесь СР>>А то что вы хотите зделать, нарушит весь файловый стек и в общем случае будет не рабочим. СР>>И вобще legacy фильтры зло, на дворе 21 век. здесь про минифильтры и зачем они задумывались, ключевое слова альтитуда
B>Если добавить registry или file exclusion то HORM просто не включится, выдаст ошибку: B>Error: Could not enable HORM (Generic failure). Please ensure following configurations are properly set in both current session and next session before enabling HORM: B>1.Filter is enabled; B>2.All fixed volumes are protected; B>3.No user defined registry exclusion; B>4.No user defined file exclusion; B>5.Hibernation feature has been turned on by 'powercfg.exe -H ON'.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, belp, Вы писали:
B>Если добавить registry или file exclusion то HORM просто не включится, выдаст ошибку: B>Error: Could not enable HORM (Generic failure). Please ensure following configurations are properly set in both current session and next session before enabling HORM: B>1.Filter is enabled; B>2.All fixed volumes are protected; B>3.No user defined registry exclusion; B>4.No user defined file exclusion; B>5.Hibernation feature has been turned on by 'powercfg.exe -H ON'.
B>В windows embedded XP и Windows Embedded 7 был способ обойти эту проблему: B>создавался дополнительный раздел, перед включением HORM'а этот раздел отмонтировался, потом когда HORM включался раздел снова монтировался. В результате этот раздел не защищался UWF, и данные писались на диск. B>Но в Windows Embedded 8 это уже не прокатывает, вылазит та-же ошибка что и выше.
Хорошо бы разобраться, почему поведение в Windows Embedded 8 изменилось, очень возможно, что это неспроста и системе действительно может "пополохеть". А, возможно, какие-нибудь службы (типа System Restore) по умолчанию цепляют этот волум и оставляют следы в HORM.
Другой вариант — сделать этот дополнительный волум не fixed, а removable. Тем же фильтром. Тоже хак, но гораздо менее интрузивный.
[skip]
СР>>Значит надо писать в M$ что у них утилита не работает
B>Когда uwf фильтр включен без HORM (для одного или для всех разделов), то exclusions работают.
B>HORM же требует чтобы фильтры были включены для всех разделов, и все exclusions были убраны, в документации про это написано:
B>http://msdn.microsoft.com/en-us/library/jj980177%28v=winembedded.81%29.aspx
B>Я думаю что это какое то больше искусственное ограничение, нежели архитектурное. Непонятно почему microsoft так сделала.
Думаю для выполнения поставленного условия — загрузится с запомненого состояния, независимо от того как выключили систему.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re: Как обойти фильтры файловой системы?
От:
Аноним
Дата:
05.05.14 23:18
Оценка:
продолжаю мучить HORM, нормального решения так и нет
В данный момент исследую драйвер uwfs.sys
В Instance Setup коллбеке есть проверка на тип файловой системы, фильтр аттачится к волюму только если его тип fat или ntfs.
Т.е. если создать например ext2 раздел, то horm не будет мешать записи данных.
(проверили с драйвером ext2 http://www.ext2fsd.com/ — действительно так работает, правда сам ext2fsd драйвер кривоват и иногда глючит (win8 официально не поддерживается)
Вопрос — можно ли как-нибудь обмануть filter manager, написав legacy filter который будет менять filesystem type на неподдерживаемый (например на FLT_FSTYPE_NFS/FLT_FSTYPE_EXFAT), чтобы uwfs драйвер не приаттачился к волюму?
(или два драйвера, которые будут располагаться в стеке сверху и снизу фильтр менеджера, один меняет тип ФС, другой возвращает на место). Или эта дея полный бред?
Второй вопрос: для эксперимента я подправил бинарник в hex редакторе, чтобы uwfs драйвер игнорировал Fat разделы. Затем подменил файл windows/system32/drivers/uwfs.sys на свой.
Затем перезагрузился и система сразу запустила процесс восстановления. Никакими крешами это не сопровождалось, наверно сработал механизм обнаружения поврежденных системных файлов.
Возможно ли временно отключить этот механизм?
Всякие bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS
bcdedit -set TESTSIGNING ON
не помогают.
(Хочу попробовать просто для опыта, вариант с патчем системных файлов нам не подойдет )
Здравствуйте, vshemm, Вы писали:
V>Хорошо бы разобраться, почему поведение в Windows Embedded 8 изменилось, очень возможно, что это неспроста и системе действительно может "пополохеть". А, возможно, какие-нибудь службы (типа System Restore) по умолчанию цепляют этот волум и оставляют следы в HORM.
V>Другой вариант — сделать этот дополнительный волюм не fixed, а removable. Тем же фильтром. Тоже хак, но гораздо менее интрузивный.
Спасибо за совет. Честно говоря, копаясь в uwfs.sys я не нашел никакие проверок на проверку fixed или removable ли волюм. Может нужно еще посмотреть повнимательнее на uwfrtl.sys...
Эх, поздновато встретил этот топик, но лучше поздно чем никогда.
Данная задача не решаема в том контексте что тут описывалась. Во первых, основной драйвер HORMa — это драйвер тома, а не фильтр файловой системы. Поэтому он там не понимает что нужно сохранить в память, а что скинуть на диск, так же не поймете и вы сами. Далее. Если вы отправите часть данных в обход минифильтра FS, то запись данных произойдет на диск, который в состоянии ДО всех изменений, которые в памяти, другими словами вы нарушите целостность NTFS. Все что можно придумать в такой ситуации, это заранее создать нужные файлы на реальном диске, а потом в них писать работая напрямую с драйвером тома, т.е. пропустив все фильтры HORMa. Главное не забывать, что никаких других изменений FS делать нельзя.
Здравствуйте, belp, Вы писали:
B>HORM же требует чтобы фильтры были включены для всех разделов, и все exclusions были убраны, в документации про это написано:
B>http://msdn.microsoft.com/en-us/library/jj980177%28v=winembedded.81%29.aspx
B>Я думаю что это какое то больше искусственное ограничение, нежели архитектурное. Непонятно почему microsoft так сделала.
Есть сильное подозрение, что при гибернации сохраняется и состояние драйвера файловой системы. HORM всегда восстанавливает это состояние и может произойти рассинхронизация, а затем и порча ФС.