Re[11]: Остановить выполнение DeviceIoControl
От: MShura  
Дата: 03.04.07 06:50
Оценка:
MS>>P.S.
MS>>По-моему такой подход (использование мега буффера) неправильный, потому как можно иметь достаточно небольшой буффер для retieval points и получать описание фрагментов порциями.


SO>а что вы можете мне посоветовать в решении моей проблемы, либо что мне передать в ClusterCount используя даный код, либо что вы мне посоветуете переделать или дописать в даном коде (что был в ссылке)?


Честно говоря нет никакого желания изучать код по ссылке.

Перемещать можно порциями кратными 16 кластерам:
— Больше шансов отработать FSCTL_MOVE_FILE успешно (ведь с момента, когда вы нашли свободный фрагмент до момента когда начнет отрабатывать FSCTL_MOVE_FILE этот фрагмент может уже перестать быть свободным, а чем больше размер перемещаемого фрагмента, тем больше шансов на такой случай)
Однако если вам удалось залочить том, то можете двигать любыми порциями, однако помните о том, что если вы синхронно ждете завершения операции, то время отклика (на Cancel) может стать неприлично большим.
— Работает и на сжатых файлах
— Если при запросе retieval points StartingVcn кратен 16, то в выходном буффере точки будут начинаться именно с заданного Vcn (Если StartingVcn не кратно 16, то в выходном буффере возможно округление вниз StartingVcn до кратности 16 или 8)
— Можете вообще не пользоваться FSCTL_GET_RETRIEVAL_POINTERS, а пользоваться FSCTL_GET_NTFS_FILE_RECORD и парсить retieval points вручную (так делает dfrgntfs, входящий в состав Windows 2000).

Итого:
Используя мега буффер алгоритм обработки retrieval points упрощается.
Если ваша программа не предназначена для серверов, то решение вполне уместное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.