Добрый день,
суть проблемы: мы разрабатываем устройство работающее под управлением 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. Может кто сталкивался с подобной задачей (обойти фильтр файловой системы), и есть готовые решения?