Форум программистов, компьютерный форум CyberForum.ru

Дефрагментация и FSCTL_MOVE_FILE - C++

Восстановить пароль Регистрация
 
bixbit
0 / 0 / 0
Регистрация: 11.08.2012
Сообщений: 3
11.08.2012, 22:38     Дефрагментация и FSCTL_MOVE_FILE #1
Делал так как пишет мсдн
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

откуда брать параметры для FSCTL_MOVE_FILE

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
int GetClusters(const char* name,bool d)
{
 
 
    MOVE_FILE_DATA MoveParams;
 
    ULONG  ClCount;
    LARGE_INTEGER FileSize;
    HANDLE  hFile;
    ULONG   OutSize;
    ULONG   Bytes,CnCount;
    LARGE_INTEGER PrevVCN, Lcn;
    STARTING_VCN_INPUT_BUFFER  InBuf;
    PRETRIEVAL_POINTERS_BUFFER OutBuf;
    int next=1;
    MOVE_FILE_DATA md;
    hFile = CreateFile(name,FILE_READ_ATTRIBUTES,
        FILE_READ_DATA| FILE_WRITE_DATA| FILE_APPEND_DATA,
        NULL, OPEN_EXISTING, 0, 0);
    char namef[MAX_PATH];
    sprintf(namef,"\\\\.\\%c:",name[0]);
    HANDLE hDisk = CreateFile(namef,FILE_READ_ATTRIBUTES,
        FILE_READ_DATA| FILE_WRITE_DATA| FILE_APPEND_DATA,
        NULL, OPEN_EXISTING, 0, 0);
    MoveParams.FileHandle = hFile;
 
    if (hFile != INVALID_HANDLE_VALUE)
    {
 
 
        GetFileSizeEx(hFile, &FileSize);
        OutSize = (ULONG)sizeof(RETRIEVAL_POINTERS_BUFFER) + (FileSize.QuadPart / ClusterSize) * sizeof(OutBuf->Extents);
        OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize);
        InBuf.StartingVcn.QuadPart = 0;
        MoveParams.StartingLcn.QuadPart = 0;
        if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
        {
            ClCount = (FileSize.QuadPart + ClusterSize - 1) / ClusterSize;
            LONGLONG prev_num=0;
 
            MoveParams.ClusterCount = ClCount;
            PrevVCN = OutBuf->StartingVcn;
            MoveParams.StartingVcn.QuadPart = PrevVCN.QuadPart;
            ULONG r = 0, Cls = 0, all;
 
            bool first=0;
            for (; r < OutBuf->ExtentCount; r++)
            {
                Lcn = OutBuf->Extents[r].Lcn ;
                for (CnCount=OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart; CnCount; CnCount--, Cls++, Lcn.QuadPart++)
                {
                    if(prev_num+1!=Lcn.QuadPart&&first)
                        next++;
                    prev_num=Lcn.QuadPart;
 
                    first=1;
                    DWORD br;
                    if(d)
                    {
                        if(!DeviceIoControl(hDisk,FSCTL_MOVE_FILE,&MoveParams,sizeof(MoveParams),NULL,0,&br,NULL))
                            printf("error %d\n",GetLastError());
                    }
                }
                PrevVCN = OutBuf->Extents[r].NextVcn;
            }
        }
 
        free(OutBuf);
        CloseHandle(hFile);
    }
    else
        printf("Error opening file %s\n",name);
    if(next!=1)
    {
        if(!d)
        {
            frag_files.push_back(name);
        }
    }
    return next;
}
/////////////////////////////////////////
 
 
bool GetBitmap (void)
{
    HANDLE Handle = CreateFile("\\\\.\\f:",
        MAXIMUM_ALLOWED,                          // access
        FILE_SHARE_READ | FILE_SHARE_WRITE,       // share type
        NULL,                                     // security descriptor
        OPEN_EXISTING,                            // open type
        NULL,                                     // attributes (none)
        NULL                                      // template
    );
 
    STARTING_LCN_INPUT_BUFFER StartingLCN;
    VOLUME_BITMAP_BUFFER *Bitmap = NULL;
    int BitmapSize;
    DWORD BytesReturned;
    BOOL Result;
 
    StartingLCN.StartingLcn.QuadPart = 0;
 
    // Allocate buffer
    // Call FSCTL_GET_VOLUME_BITMAP once with a very small buffer
    // This will leave the total number of clusters in Bitmap->BitmapSize and we can
    // then correctly allocate based off that
    // I suppose this won't work if your drive has only 40 clusters on it or so :)
    BitmapSize = sizeof (VOLUME_BITMAP_BUFFER) + 4;
    Bitmap = (VOLUME_BITMAP_BUFFER *) malloc (BitmapSize);
 
    Result = DeviceIoControl
    (
        Handle,
        FSCTL_GET_VOLUME_BITMAP,
        &StartingLCN,
        sizeof (StartingLCN),
        Bitmap,
        BitmapSize,
        &BytesReturned,
        NULL
    );
 
    // Bad result?
    if (Result == FALSE  &&  GetLastError () != ERROR_MORE_DATA)
    {
        //wprintf ("\nDeviceIoControl returned false, GetLastError() was not ERROR_MORE_DATA\n");
        free (Bitmap);
        return (false);
    }
 
    // Otherwise, we're good
    BitmapSize = sizeof (VOLUME_BITMAP_BUFFER) + (Bitmap->BitmapSize.QuadPart / 8) + 1;
    Bitmap = (VOLUME_BITMAP_BUFFER *) realloc (Bitmap, BitmapSize);
    Result = DeviceIoControl
    (
        Handle,
        FSCTL_GET_VOLUME_BITMAP,
        &StartingLCN,
        sizeof (StartingLCN),
        Bitmap,
        BitmapSize,
        &BytesReturned,
        NULL
    );
 
    DWORD LastError = GetLastError ();
 
    if (Result == FALSE)
    {
        wprintf (L"\nCouldn't properly read volume bitmap\n");
        free (Bitmap);
        return (false);
    }
 
 
    free (Bitmap);
    return (true);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2012, 22:38     Дефрагментация и FSCTL_MOVE_FILE
Посмотрите здесь:

Дефрагментация C#
Windows Дефрагментация MFT
Дефрагментация Windows 7
Windows *** дефрагментация (Win2000)
Windows 7 Дефрагментация в Windows 7
Дефрагментация
Дефрагментация DVD
Delphi WinAPI Дефрагментация диска

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru