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