Я недавно делал USB MSD с программной генерацией: MBR, BS, FAT, Root, и тремя файлами в корневом каталоге. Два файла фиксированной длины, и один переменной, который иногда должен переписываться. Вся "флешка" объёмом около 1мб. Файловая система FAT16.
Вроде бы здесь о похожем говорят

В общем приведу по памяти, вдруг то что надо.
При перезаписи переменного файла (например он назывался File.exe) Винда делает так.
1. В корневой каталог записывается новый блок данных, в котором у File.exe поля: длина и начальный кластер - равны 0.
2. В FAT1 записываются новые данные, где вся цепочка кластеров этого файла равна 0.
3. Аналогично дублируется FAT2.
4. В корневом каталоге у файла File.exe прописываются стартовый адрес кластера и новая длина в байтах (т.е. Root снова переписывается).
У меня стартовый кластер равен тому-же, что был и у предыдущей версии файла.
5. FAT1 записывается новая таблица, где очищенные до этого кластеры заполнены новой цепочкой.
6. FAT2 дублируется.
7. В корневом каталоге у файла File.exe меняются поля "Дата последн. записи" и "Время последн. записи" на новые (т.е. Root ещё раз переписывается).
8. Записывается тело файла
в те-же сектора где была прежняя версия.
9. В корневом каталоге снова делается запись с изменённым полем времени (снова запись Root).
10. Делается ещё одна запись с изменённым полем времени (и ещё раз пишется Root).
По пунктам 7,9,10 я сейчас точно не помню, какие временные поля, и в какой очерёдности переписываются. Помню только что их три: дата создания, дата модификации, и дата открытия. И вроде бы, оно три раза те поля и переписывает. Почему это делается в три приёма (а не за один раз) я не помню. Вроде бы поле "дата модификации" несколько раз переписывается... зачем-то... Не помню
Чтения секторов при этом процессе вообще нет. Как считала Винда всё в кэш при подключении, так из кэша все сведения и черпает: и FAT1,2 и Root.