Как обойти фильтры файловой системы?
От: belp  
Дата: 19.04.14 23:05
Оценка:
Добрый день,

суть проблемы: мы разрабатываем устройство работающее под управлением 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

Возникла идея написать свой драйвер фильтр, который бы смотрел на имя файла, и редиректил io реквесты напрямую в драйвер ntfs.
За основу взял пример драйвера legacy filter http://www.codeproject.com/Articles/43586/File-System-Filter-Driver-Tutorial

Драйвер располагается на вершине стека драйверов, и будет первым получать IRP.

В примере IRP пускаются дальше вниз по стеку:

/////////////////////////////////////////////////////////////////
// PassThrough IRP Handler

NTSTATUS FsFilterDispatchPassThrough(
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
)
{
PFSFILTER_DEVICE_EXTENSION pDevExt =
(PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(pDevExt->AttachedToDeviceObject, Irp);
}

Чтобы получить указатель на ntfs драйвер использую IoGetDeviceAttachmentBaseRef:

PDEVICE_OBJECT lowestDriver = IoGetDeviceAttachmentBaseRef(DeviceObject);

Как этому драйверу корректно послать полученный Irp? (как правильно настроить stack location и тд).

Спасибо.

p.s. Может кто сталкивался с подобной задачей (обойти фильтр файловой системы), и есть готовые решения?
windows ninifilter uwf horm
Re: Как обойти фильтры файловой системы?
От: x64 Россия http://x64blog.name
Дата: 19.04.14 23:56
Оценка: 14 (1)
B>Чтобы получить указатель на ntfs драйвер использую IoGetDeviceAttachmentBaseRef:
B>PDEVICE_OBJECT lowestDriver = IoGetDeviceAttachmentBaseRef(DeviceObject);
B>Как этому драйверу корректно послать полученный Irp? (как правильно настроить stack location и тд).

Ну да, верно, а потом нужный запрос шли ему так же, как выше в коде, только вместо pDevExt->AttachedToDeviceObject подставь lowestDriver. Это если просто прокинуть до нужного драйвера, а если, например, надо уведомление о завершении запроса получить, то уже чуть по-другому. И помни, что файловый фильтр может быть не один, что будет, если ты прокинешь не только uwfs.sys, но и какой-нибудь шифрующий фильтр по ходу дела? Нехорошо будет явно. Подробнее про обработку IRPs читать здесь:

Different ways of handling IRPs — cheat sheet (part 1 of 2)
Different ways of handling IRPs — cheat sheet (part 2 of 2)

B>...есть готовые решения?


Готовые это вряд ли, посмотри здесь, например, но что-то я сомневаюсь, что оно поддерживает Embedded-системы.
JID: x64j@jabber.ru
Re: Как обойти фильтры файловой системы?
От: Свиридов Роман Россия  
Дата: 21.04.14 08:47
Оценка:
Здравствуйте, 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 век. здесь про минифильтры и зачем они задумывались, ключевое слова альтитуда
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[2]: Как обойти фильтры файловой системы?
От: belp  
Дата: 21.04.14 15:04
Оценка:
Добрый день,

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 систему, никакого пользовательского софта там не будет.

С уважением,
Павел
Re[3]: Как обойти фильтры файловой системы?
От: x64 Россия http://x64blog.name
Дата: 21.04.14 15:29
Оценка:
B>Уточню — мы делаем embedded систему, никакого пользовательского софта там не будет.

Коли так, то, наверное, пофигу, делай legacy-фильтр, только делай грамотно, нельзя просто так прокидывать одни запросы, и не трогать другие, делай виртуализацию тех файлов, которые хотите прокинуть, т.е. сопровождай их от момента Create до момента Close, я не в курсе особенностей работы uwfs.sys, но есть вероятность, что ему (а значит и всей системе в целом) может поплохеть, если он, например, вдруг увидит Close, для которого не видел ранее Create или записей. Но это всё мои домыслы, пробуй, начни с малого, а если не будет получаться, то всегда можно обратиться сюда или заказать работу тому, кто уже имел дело с фильтрацией файловой системы.
JID: x64j@jabber.ru
Re[3]: Как обойти фильтры файловой системы?
От: Свиридов Роман Россия  
Дата: 22.04.14 05:36
Оценка:
Здравствуйте, belp, Вы писали:

[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'.

Значит надо писать в M$ что у них утилита не работает

со следующими параметрами.

File
Help | ?
Get-Exclusions {<volume> | all}
Add-Exclusion <file>
Remove-Exclusion <file>
Commit <file>
Commit-Delete <file>

Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: Как обойти фильтры файловой системы?
От: vshemm  
Дата: 22.04.14 12:39
Оценка:
Здравствуйте, 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. Тем же фильтром. Тоже хак, но гораздо менее интрузивный.
Re[4]: Как обойти фильтры файловой системы?
От: belp  
Дата: 22.04.14 14:41
Оценка:
Здравствуйте, Свиридов Роман, Вы писали:

СР>Значит надо писать в M$ что у них утилита не работает


Когда uwf фильтр включен без HORM (для одного или для всех разделов), то exclusions работают.

HORM же требует чтобы фильтры были включены для всех разделов, и все exclusions были убраны, в документации про это написано:

http://msdn.microsoft.com/en-us/library/jj980177%28v=winembedded.81%29.aspx

Я думаю что это какое то больше искусственное ограничение, нежели архитектурное. Непонятно почему microsoft так сделала.
Re[5]: Как обойти фильтры файловой системы?
От: Свиридов Роман Россия  
Дата: 23.04.14 06:34
Оценка:
Здравствуйте, belp, Вы писали:

[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
не помогают.

(Хочу попробовать просто для опыта, вариант с патчем системных файлов нам не подойдет )
Re[4]: Как обойти фильтры файловой системы?
От: belp  
Дата: 05.05.14 23:24
Оценка:
Здравствуйте, vshemm, Вы писали:

V>Хорошо бы разобраться, почему поведение в Windows Embedded 8 изменилось, очень возможно, что это неспроста и системе действительно может "пополохеть". А, возможно, какие-нибудь службы (типа System Restore) по умолчанию цепляют этот волум и оставляют следы в HORM.


V>Другой вариант — сделать этот дополнительный волюм не fixed, а removable. Тем же фильтром. Тоже хак, но гораздо менее интрузивный.


Спасибо за совет. Честно говоря, копаясь в uwfs.sys я не нашел никакие проверок на проверку fixed или removable ли волюм. Может нужно еще посмотреть повнимательнее на uwfrtl.sys...

Не подскажете на какие IOCTL коды смотреть?
Re[2]: Как обойти фильтры файловой системы?
От: belp  
Дата: 05.05.14 23:26
Оценка:
Здравствуйте, Аноним, Вы писали:
.....

извиняюсь, не залогинился
Re: Как обойти фильтры файловой системы?
От: Denwer Россия  
Дата: 25.09.14 11:09
Оценка:
Здравствуйте, belp, Вы писали:

B>Добрый день,


Эх, поздновато встретил этот топик, но лучше поздно чем никогда.

Данная задача не решаема в том контексте что тут описывалась. Во первых, основной драйвер HORMa — это драйвер тома, а не фильтр файловой системы. Поэтому он там не понимает что нужно сохранить в память, а что скинуть на диск, так же не поймете и вы сами. Далее. Если вы отправите часть данных в обход минифильтра FS, то запись данных произойдет на диск, который в состоянии ДО всех изменений, которые в памяти, другими словами вы нарушите целостность NTFS. Все что можно придумать в такой ситуации, это заранее создать нужные файлы на реальном диске, а потом в них писать работая напрямую с драйвером тома, т.е. пропустив все фильтры HORMa. Главное не забывать, что никаких других изменений FS делать нельзя.
Re[5]: Как обойти фильтры файловой системы?
От: Somescout  
Дата: 25.09.14 15:40
Оценка:
Здравствуйте, belp, Вы писали:

B>HORM же требует чтобы фильтры были включены для всех разделов, и все exclusions были убраны, в документации про это написано:


B>http://msdn.microsoft.com/en-us/library/jj980177%28v=winembedded.81%29.aspx


B>Я думаю что это какое то больше искусственное ограничение, нежели архитектурное. Непонятно почему microsoft так сделала.


Есть сильное подозрение, что при гибернации сохраняется и состояние драйвера файловой системы. HORM всегда восстанавливает это состояние и может произойти рассинхронизация, а затем и порча ФС.
ARI ARI ARI... Arrivederci!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.