Как заставить драйвер Windows FAT32 для перезагрузки таблицы FAT? - PullRequest
2 голосов
/ 06 июля 2011

Я реализую пользовательский драйвер диска Windows, и мне нужен драйвер Windows FAT32, который перезагружает его таблицы FAT 1 и 2, которые находятся ниже секторов данных. Как это можно сделать?

Мне нужен более быстрый способ без размонтирования диска. Почему я это делаю, потому что диск является виртуальным диском памяти, а данные берутся из сети в процессе доступа к секторам. Я записываю данные каталога на лету, это работает, но не для файлов - потому что время от времени драйвер загружает FAT - кластеры свободны, поэтому файлы не работают. Я распустил fastfat.sys и нашел некоторые моменты ... По крайней мере, я нашел ioctl коды устройства, которые, возможно, перезагрузят толстую таблицу, я опубликую здесь, если получу успех.

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Вы должны (ну, должны , действительно) размонтировать диск до , внося любые прямые изменения в FAT, а затем снова смонтировать, чтобы загрузить эти изменения,В противном случае вы рискуете перезаписать внесенные вами автономные изменения в ОС, используя (старую) копию таблицы в памяти, что может привести к повреждению вашей файловой системы без возможности восстановления.

2 голосов
/ 06 июля 2011

Принудительно отключить том и перемонтировать его, или подделать удаление устройства.

Кроме того, почему вы хотите это сделать? Это почти наверняка не безопасно, если вы пытаетесь записать в файловую систему одновременно с ОС.

0 голосов
/ 06 июля 2011

Вы можете начать с вызова DeviceIoControl с параметром FSCTL_LOCK_VOLUME. Если это не удастся, вы можете быть уверены, что вам лучше не изменять FAT самостоятельно, потому что где-то в разделе открыты другие маркеры.

Следующий вопрос - что делать, когда FSCTL_LOCK_VOLUME успешно выполняется. Два человека говорят, чтобы размонтировать громкость, но этого недостаточно. Вы должны отключить том, IOCTL_VOLUME_OFFLINE. Но когда я экспериментировал, этого все еще было недостаточно. В Windows еще что-то буферизовано.

...