Суть: Way 1: 1. Обнуляем содержимое файла на низком уровне в обход ФС 2. Смотрим через ReadFile = пустой файл. То, что нужно. Way 2: 1. Смотрим через ReadFile - файл с данными. Ну правильно, не снесли же еще. 2. Обнуляем содержимое файла на низком уровне в обход ФС 3. Смотрим через ReadFile - СНОВА файл с данными. WTF? 4. После перезагрузки имеем пустой файл, как и следовало ожидать. Понятно, что кеш. Вопрос один - где он? Хоть на каком уровне в стеке вызовов при вызове ReadFile?
IceFire, По картинке в Microsoft Windows Internals (4th ed.), Chapter 11: Cache Manager, драйвер файловой системы, получив IRP или вызов FastIoRead, обращается к CcCopyRead или CcFastCopyRead — это кэш-менеджер. Кэш-менеджер использует менеджер виртуальной памяти чтобы отобразить 256 KiB секци(ю|и) с нужными данными в системное виртуальное адресное пространство и копирует запрошенные данные. Кэш-менеджер естественным образом пролетает, если в вызове CreateFile() был использован флаг FILE_FLAG_NO_BUFFERING (хотя на слово я бы не верил ).