Драйвер фильтра файловой системы: создание дефрагментатора
Я только начал работать над драйвером фильтра файловой системы, который отслеживает записи ввода-вывода в любой файл (прослушивание IRP_MJ_WRITE
запросы) и прозрачно дефрагментирует файл, если он становится фрагментированным.
В настоящее время у меня есть такой код:
NTSTATUS FsFilterDispatchWrite(__in PDEVICE_OBJECT DeviceObject, __in PIRP Irp)
{
PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject;
NTSTATUS result = FsFilterDispatchPassThrough(DeviceObject, Irp);
//FltFsControlFile(???);
return result;
}
в котором мне нужно будет оформить FSCTL_GET_RETRIEVAL_POINTERS
Контрольный код ввода / вывода.
Тем не менее, я довольно новичок в области разработки драйверов... FltFsControlFile
правильная функция для меня, чтобы использовать здесь? Если так, то что Instance
параметр представляете? А если нет, то как мне это сделать?
1 ответ
Merhad,
FltFsControlFile - это правильный API для использования, но помните, что не стоит выполнять дефрагментацию из драйвера фильтра, дефрагментация по пути ввода-вывода (или из рабочего потока будет очень неэффективной) в режиме ядра очень эффективна.
Windows сделала большинство файлов дефрагментируемыми из пользовательского режима. проверьте http://technet.microsoft.com/en-us/library/dd405526(VS.85).asp и http://technet.microsoft.com/en-us/library/aa364577(VS.85).aspx
Для мониторинга действий FS лучше всего использовать журнал USN, что очень эффективно. Не накладывает никакой нагрузки на систему
http://technet.microsoft.com/en-us/library/aa365736(VS.85).aspx