Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2015, 14:48   #1
vladikxd4
Новичок
Джуниор
 
Регистрация: 25.04.2015
Сообщений: 1
По умолчанию Анализ битовой карты (Дефрагментация)

Здравствуйте, пишу дефрагментатор файловой системы. И столкнулся с проблемой непосредственно перемещения кластеров файла. Скорее всего я просто не правильно анализирую битовую карту полученную при вызове GET_VOLUME_BITMAP.Вот вызов FSCTL_MOVE_FILE.
Код:
bool DefragmentateFile(FILE_INFO file, PVOLUME_BITMAP_BUFFER vbb, Disk drive){
    MOVE_FILE_DATA movFileStruct;
    DWORD pBytes;
    movFileStruct.FileHandle = file.hFile;
    movFileStruct.StartingVcn.QuadPart = 0;
    movFileStruct.StartingLcn = GetStartLcn(file, vbb);
    movFileStruct.ClusterCount = file.buffer.Extents[0].NextVcn.QuadPart - file.buffer.StartingVcn.QuadPart;
    wcout << drive.Letter;
    bool ret = DeviceIoControl(drive.hDisk, FSCTL_MOVE_FILE, &movFileStruct, sizeof(MOVE_FILE_DATA), NULL, 0, &pBytes, NULL);
    if (!ret && GetLastError() == ERROR_ACCESS_DENIED){
        cout << "nu emae"<<GetLastError();
    }
    else{
        cout << "yes";
    }
    return true;
}
Вот анализ битовой карты:
Код:
LARGE_INTEGER GetStartLcn(FILE_INFO file, PVOLUME_BITMAP_BUFFER vbb){
    LARGE_INTEGER StartLcn;
    RETRIEVAL_POINTERS_BUFFER buf =  file.buffer;
    unsigned long long int count = 0;
    bool chainIsSearched = false;
    StartLcn.QuadPart = 0;
    unsigned long long int clustersLength = buf.Extents[0].NextVcn.QuadPart - buf.StartingVcn.QuadPart;
    for (unsigned long long int i = 0; i < vbb->BitmapSize.QuadPart; i++){
        if (vbb->Buffer[i] == 0 && chainIsSearched == true){
            count++;
        }
        if (vbb->Buffer[i] == 0 && chainIsSearched == false){
            count++;
            StartLcn.QuadPart = i;
            chainIsSearched == true;
        }
        if (vbb->Buffer[i] != 0){
            chainIsSearched = false;
            count = 0;
        }
        if (count == clustersLength){
            break;
        }
    }
    return StartLcn;
}
Не обращайте внимания, что я пытаюсь переместить только одну экстенту файла. Я просто хочу вникнуть в вызов FSCTL_MOVE_FILE.
Структура FILE_INFO содержит в себе дескриптор файла и структуру RETRIEVAL_POINTERS_BUFFER. Кстати, GetLastError() возвращает ERROR_ACCESS_DENIED. Помогите пожалуйста..
vladikxd4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Визуализация битовой карты, нужна компонента newuserim Компоненты Delphi 1 13.08.2011 15:30
дефрагментация диска syperman96 Помощь студентам 1 24.11.2010 16:18
Дефрагментация (симуляция) Manson90 Помощь студентам 0 16.01.2010 00:34
Дефрагментация ryton SQL, базы данных 20 27.05.2008 15:16
Дефрагментация диска Viteef Софт 8 06.12.2007 23:33