You are not logged in.
Pages: 1
Всем здрасте!
Я вот тут дефрагментатор и оптимизатор размещения файлов пишу, львиная доля кода уже готова, но анализ диска(составление списка файлов) был реализован через - FindFirstFile, FindNextFile - как вы уже наверное догадались не очень быстрые:)
Так вот решил просканировать $MFT с использование NTFSlib чтобы не писать уйму уже готового кода:)
Так вот процедура вроде отрабатывает корректно, но через секунду после её завершения получаем смачный Debug Assertion Failed: HEAP CORRUPTION DETECTED . Понятно что так дело не пойдёт, но в чём же проблема?Названия многих типов на русском потому-что я не люблю слэнг, а не потому-что не умею програмировать:)
Код .NET /clr .
Код процедуры:
void analis_ntfs(Object^ drivee){
String^ drive =static_cast <String^> (drivee);
file_info^ MFT = gcnew file_info;
LPWSTR drive_t = (LPWSTR) Marshal::StringToHGlobalAuto(drive).ToPointer();
MFT->name = new wchar_t[7]; //c:\&mft + /0
wcscpy(MFT->name,drive_t);
wcscat(MFT->name,L"$MFT");
MFT->type = tip_faila::MFT;
if (!prpb(MFT)) return;
LARGE_INTEGER dis;
dis.QuadPart = 0;
BYTE* buf = new BYTE[83886080]; //8mb
ULONG64 atr = 8388608; //сколько считать
ULONG64 dch = 0;//дополнительное чтение в следуйщем куске мфт, если тот фрагментирован
BYTE* kdp;//куда дописывать инфу при дополнительном чтении
BYTE* och = &buf[0];
DWORD n;
Volume->GetClusterSize();
for (ULONG64 i = 0;i < MFT->file_frg->ExtentCount;i++)
{
dis.QuadPart = MFT->file_frg->Extents[i]->LCN*Volume->GetClusterSize();//позиция в байтах, а не кластерах
if (!SetFilePointerEx(Volume->hVolume,dis,NULL,FILE_BEGIN))return;
if (dch)
{
och = kdp;
atr = dch;
dch = 0;
}
ULONG64 el = MFT->file_frg->Extents[i]->Len*Volume->ClusterSize;
for (ULONG64 j = 0;j < el;j += 8388608) //8 mb
{
if (el-j < 8388608)
{
atr = el - j;
dch = 8388608 - el - j; //сколько осталось в следуйщем куске
kdp = &buf[atr];
if (!SetFilePointerEx(Volume->hVolume,dis,NULL,FILE_BEGIN))return;
if (!ReadFile(Volume->hVolume,och,atr,&n,NULL)) {
MessageBox::Show("Ошибка чтения MFT");
return;
}
//no-parse
} else {
if (!SetFilePointerEx(Volume->hVolume,dis,NULL,FILE_BEGIN))return;
if (!ReadFile(Volume->hVolume,och,atr,&n,NULL)) {
MessageBox::Show("Ошибка чтения MFT");
return;
}
//parse
parse_buffer(buf,8388608 / Volume->FileRecordSize);
}
atr = 8388608;
dis.QuadPart += 8388608;
och = &buf[0];
}
}
if (dch)
{
//parse 8388608 - dch bytes
parse_buffer(buf,(8388608 - dch) / Volume->FileRecordSize);
}
delete [] buf;
}Определения типов:
public ref struct ExtentStruct{
ULONG64 VCN;
ULONG64 LCN;
ULONG64 Len;
ULONG64 ILen; //длина с избытком получающаюся при уборке VF - лучше чем лишний кусок и лишние расчёты
};
public ref struct file_fragments
{
DWORD ExtentCount;
array<ExtentStruct^>^ Extents;
};
enum tip_faila {file,dir,reparse_point,MFT,system};
enum phase {nichego = -1,operation_completed,sost_spis_failov,anal_rasp_failov,podgotovka,defragmenting};
public ref struct file_info {
~file_info(){
this->!file_info();
}
!file_info(){
if (this->name != NULL)
{
delete [] this->name; //LongPointerToString , Long,PointedTCHARString = LPTSTR;LongPointerWideCharacterString = LPWSTR
}
}
file_fragments^ file_frg;
LPWSTR name;
//bool error;
//bool unmovable; всё равно нельзя раскрасить
tip_faila type;
};
Last edited by kostay scr (19-09-2010 14:05)
GTA VC - ЭТО НАСТОЯЩАЯ ГТА!
Offline
Интересно, что-ли никто не знает в чём проблема?
Правка:
Проблема была в том что под имя mft выделялось 7 wchar_t вместо 8
Поэтому мы хотели удалить лишний байт из защищённой памяти.
П.С. Хотелось бы узнать - кто здесь имеет опыт в сфере электронной комерции или просто програмит на цпп:).
Last edited by kostay scr (20-09-2010 17:08)
GTA VC - ЭТО НАСТОЯЩАЯ ГТА!
Offline
Pages: 1