none
Анализ битовой карты (Дефрагментация) RRS feed

  • Общие обсуждения

  • Здравствуйте, пишу дефрагментатор файловой системы. И столкнулся с проблемой непосредственно перемещения кластеров файла. Скорее всего я просто не правильно анализирую битовую карту полученную при вызове 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. Помогите пожалуйста..

    25 апреля 2015 г. 12:14