Сначала опишу, что я хочу сделать. Допустим у нас на компьютере есть папка E:\Data\Private, где будут лежать секретные файлы, содержащие схемы по отмыванию денег
![](/Forum/Images/smile.gif)
Так как они являются очень секретными, то и просматривать их хочу только я. Т.е. при сохранении файла в эту папку он будет шифроваться, а при чтении расшифровываться.
Решение придумал такое, что есть некое приложение, через которое можно будет открыть эту папку. И в тот момент когда происходит открытие папки, запускался драйвер, который будет перехватывать запросы по чтению/записи к E:\Data\Private.
За основу взял драйвер с WDK: SwapBuffer File System Minifilter Driver. Добавил только возможность пересылать массив символов с драйвера в мое приложение, где собственно будет шифрование/расшифрование данных. Алгоритм шифрования использую AES.
Пару месяцев работы прошли не зря, почти не зря. Я добился того, что бы при записи файлы шифровались, а при чтении расшифровывались. Рассматриваю для начала текстовые файлы. Но столкнулся с такой проблемой.
Повторюсь, у нас уже лежит ранее зашифрованный файл. При его чтении происходит следующее, выделяется буфер размером таким же как этот зашифрованный файл и заполняется этими данными, зашифрованными данными. Он называется swappedBuffer. Создается еще один буфер уже в PostRead, называется origBuf, для расшифрованного содержимого. И у origBuf размер ТАКОЙ ЖЕ как и у swappedBuffer. При этом мы знаем, что размер зашифрованных данных будет вегда больше чем реальных. Это связанно с блоками в AES алгоритме, в моем случае блоки кратны 16 байт. Во время копирования из swappedBuffer в origBuf происходит расшифровка. В итоге в origBuf будет лежать реальный контент файла. НО этот буфер велик для реальных данных и по этому при открытии файла я вижу в конце лишние байты(символы).
Создается origBuf буфер всего одной строчкой кода:
origBuf = MmGetSystemAddressForMdlSafe(iopb->Parameters.Read.MdlAddress, NormalPagePriority);
И как так получается, что этот буфер равняется размеру swappedBuffer для меня загадка.
Я искал переменную, которая показывала бы размер файла, который считывается, например length = 64 байта, а после расшифрования присвоить ей реальный размер, там length = 55. Как бы принудительно сказать системе, что там 55 байт, а не 64. Но не находил такого. И еще в добавок все переменные структур, которые я просматривал, связанные с размером файла по 512 байт.
И того сейчас так
strlen(origBuf) = strlen(swappedBuffer) = 64 байт
в реале, для нашего примера, должно быть так
strlen(origBuf) = 55 байт, а strlen(swappedBuffer) = 64 байт
нужно как-то такое обойти, но не могу найти или придумать что-либо как усечь размер origBuf до нужно нам размера.
Вообще можно смухлевать в драйвере с размерами файлов?