Кеширование
От: axelx  
Дата: 06.07.05 17:42
Оценка:
Пишу драйвер виртуального диска, который монтируется с файла с поддрержкой шифрования.

при записи/чтении обрабатываю IRP_MJ_READ/....WRITE. в файл пишу с помощью KeWriteFile.

Проблкма в следующем. После запроса на запись, данные шифруются и кидаются не на диск, как мне бы хотелось, а в кеш. После попытки читания, ОС. подставляет пользователю данные из кеша, обходя при этом мой обработич IRP_WRITE, т.е. пользователь получает на разшифрованные, а зашифрованные данные.

Как решить эту проблему??
Re: Кеширование
От: serg_fork  
Дата: 07.07.05 05:15
Оценка:
Здравствуйте, axelx, Вы писали:

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


A>при записи/чтении обрабатываю IRP_MJ_READ/....WRITE. в файл пишу с помощью KeWriteFile.


A>Проблкма в следующем. После запроса на запись, данные шифруются и кидаются не на диск, как мне бы хотелось, а в кеш. После попытки читания, ОС. подставляет пользователю данные из кеша, обходя при этом мой обработич IRP_WRITE, т.е. пользователь получает на разшифрованные, а зашифрованные данные.


A>Как решить эту проблему??


Могу сказать одно — не тем путем вы пошли.
Re[2]: Кеширование
От: axelx  
Дата: 07.07.05 10:10
Оценка:
Почему же?
Re: Кеширование
От: Alter_ Украина http://alter.org.ua
Дата: 07.07.05 10:17
Оценка:
Здравствуйте, axelx, Вы писали:

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


A>при записи/чтении обрабатываю IRP_MJ_READ/....WRITE. в файл пишу с помощью KeWriteFile.


A>Проблкма в следующем. После запроса на запись, данные шифруются и кидаются не на диск, как мне бы хотелось, а в кеш. После попытки читания, ОС. подставляет пользователю данные из кеша, обходя при этом мой обработич IRP_WRITE, т.е. пользователь получает на разшифрованные, а зашифрованные данные.


Я как-то не совсем понял, где и кому отдаются зашифрованые данные ?

Если вы — драйвер диска (пусть и виртуального), весь файловый кеш — над вами. И там данные (даже закешированые) в раскодированом виде. Поэтому над драйверм диска все данные в человеческом виде.

Т.к. диск все-таки виртуальный, под ним есть еще файловая система, которая кеширует ваши зашифрованые данные на пути к image-файлу. Но это все происходит под вашим драйвером.

А вот если у вас задача этому дать, а этому — не дать, тогда нужно еще писать FS filter и уже на этом уровне делать разделение доступа. Просто тот, кому не положено не сможет открыть файл вообще. image-файл при этом все равно хранится в зашифрованом виде.

Кажцатак (с) Винни-Пух
--
Alter, http://alter.org.ua
Re: Кеширование
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 07.07.05 16:17
Оценка:
A>Проблкма в следующем. После запроса на запись, данные шифруются и кидаются не на диск, как мне бы хотелось, а в кеш.
firstly, pay attention: there are 2 caches: for disk level and for file level. Sure, there is only one cache (Cc) for all OS, but let's think about it like about separate entities.

So, you should have cached data for your virtual disk (and file system layer with 3d cache above) and you should have your encrypted file that only your driver normally use — with separate cache structures handled by real FSD.

in this situation it's OK by OS to satisfy your internal ZwReadFile(encrypted file-continer handle,...) from cache — you'll get back your encrypted data, as expected.

To don't allow use your container to someone else (Ex: don't allow to open its second instance in the FAR and fall into the real cache problems), you might just open it exclusively — internally from your virtual disk driver. Or invent FS filter... there are a lot of products with disk/volume/FS filters bunch of drivers, but I don't think it is what you are looking for.

in short, everything as Alter_ said, exactly.

but if you want to solve your problem easy way, I give you another hints

Hint 1:
to pass data to disk directly through file handle you might use (FILE_NO_INTERMEDIATE_BUFFERING | FILE_SYNCHRONOUS_IO_NONALERT) flags, if you prefer ZwCreateFile. FILE_WRITE_THROUGH sometimes is also useful.

Hint 2:
just do encryption/decryption in separate buffers, not in-place:
— allocate another buffer/MDL
— copy original data being processed
— process it (encrypt/decrypt)
— pass down (call XxRead/WriteFile, for ex)
— do cleanup of previously allocated buffers

A>Как решить эту проблему??

check ideas above
find available sources of virtual disks over internet
do the search by this forum, if google doesn't help
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.