#include "ulib.hxx" #include "frsio.hxx" #include "drive.hxx" #include "ifssys.hxx" #include "ntfssa.hxx" #include "frs.hxx" #include "attrib.hxx" #include "mftfile.hxx" #include "bitfrs.hxx" #include "ntfsbit.hxx" #include "upfile.hxx" #include "upcase.hxx" #include "diskedit.h" extern "C" { #include } extern PLOG_IO_DP_DRIVE Drive; STATIC ULONG FileNumber = 0; BOOLEAN FRS_IO::Setup( IN PMEM Mem, IN PLOG_IO_DP_DRIVE Drive, IN HANDLE Application, IN HWND WindowHandle, OUT PBOOLEAN Error ) { FARPROC proc; NTFS_SA ntfssa; MESSAGE msg; HMEM hmem; proc = MakeProcInstance((FARPROC) ReadFrs, Application); if (!DialogBox((HINSTANCE)Application, TEXT("ReadFrsBox"), WindowHandle, (DLGPROC) proc)) { *Error = FALSE; return FALSE; } FreeProcInstance(proc); *Error = TRUE; _drive = Drive; if (!_drive) { return FALSE; } if (!ntfssa.Initialize(_drive, &msg) || !ntfssa.Read() || !hmem.Initialize() || !_frs.Initialize(&hmem, _drive, ntfssa.QueryMftStartingLcn(), ntfssa.QueryClusterFactor(), ntfssa.QueryVolumeSectors(), ntfssa.QueryFrsSize(), NULL) || !_frs.Read() || !_frs.SafeQueryAttribute($DATA, &_mftdata, &_mftdata) || !_frs.Initialize(Mem, &_mftdata, FileNumber, ntfssa.QueryClusterFactor(), ntfssa.QueryVolumeSectors(), ntfssa.QueryFrsSize(), NULL)) { return FALSE; } swprintf(_header_text, TEXT("DiskEdit - File Record 0x%X"), FileNumber); return TRUE; } BOOLEAN FRS_IO::Read( OUT PULONG pError ) { *pError = 0; if (NULL == _drive) { return FALSE; } if (!_frs.Read()) { *pError = _drive->QueryLastNtStatus(); return FALSE; } return TRUE; } BOOLEAN FRS_IO::Write( ) { return _drive ? _frs.Write() : FALSE; } PVOID FRS_IO::GetBuf( OUT PULONG Size ) { if (Size) { *Size = _frs.QuerySize(); } return *((PVOID*) ((PCHAR) &_frs + 2*sizeof(PVOID))); } PTCHAR FRS_IO::GetHeaderText( ) { return _header_text; } BOOL ReadFrs( IN HWND hDlg, IN UINT message, IN UINT wParam, IN LONG lParam ) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: SetDlgItemText( hDlg, IDVOLUME, Drive->GetNtDriveName()->GetWSTR() ); CheckDlgButton( hDlg, IDRADIO1, BST_CHECKED ); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, FALSE); return TRUE; } if (LOWORD(wParam) == IDOK) { TCHAR buf[1024]; INT n; n = GetDlgItemText(hDlg, IDTEXT, buf, sizeof(buf)/sizeof(TCHAR)); buf[n] = 0; if (IsDlgButtonChecked( hDlg, IDRADIO2)) { swscanf(buf, TEXT("%x"), &FileNumber); } else { DSTRING path; NTFS_SA ntfssa; MESSAGE msg; NTFS_MFT_FILE mft; NTFS_BITMAP_FILE bitmap_file; NTFS_ATTRIBUTE bitmap_attribute; NTFS_BITMAP volume_bitmap; NTFS_UPCASE_FILE upcase_file; NTFS_ATTRIBUTE upcase_attribute; NTFS_UPCASE_TABLE upcase_table; NTFS_FILE_RECORD_SEGMENT file_record; BOOLEAN error; BOOLEAN system_file; if (!path.Initialize(buf)) { wsprintf(buf, TEXT("Out of memory")); MessageBox(hDlg, buf, TEXT("DiskEdit"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } else if (!Drive || !ntfssa.Initialize(Drive, &msg) || !ntfssa.Read() || !mft.Initialize(Drive, ntfssa.QueryMftStartingLcn(), ntfssa.QueryClusterFactor(), ntfssa.QueryFrsSize(), ntfssa.QueryVolumeSectors(), NULL, NULL) || !mft.Read() || !bitmap_file.Initialize(mft.GetMasterFileTable()) || !bitmap_file.Read() || !bitmap_file.QueryAttribute(&bitmap_attribute, &error, $DATA) || !volume_bitmap.Initialize(ntfssa.QueryVolumeSectors() / (ULONG) ntfssa.QueryClusterFactor(), FALSE, NULL, 0) || !volume_bitmap.Read(&bitmap_attribute) || !upcase_file.Initialize(mft.GetMasterFileTable()) || !upcase_file.Read() || !upcase_file.QueryAttribute(&upcase_attribute, &error, $DATA) || !upcase_table.Initialize(&upcase_attribute) || !mft.Initialize(Drive, ntfssa.QueryMftStartingLcn(), ntfssa.QueryClusterFactor(), ntfssa.QueryFrsSize(), ntfssa.QueryVolumeSectors(), &volume_bitmap, &upcase_table) || !mft.Read()) { swprintf(buf, TEXT("Could not init NTFS data structures")); MessageBox(hDlg, buf, TEXT("DiskEdit"), MB_OK|MB_ICONEXCLAMATION); return FALSE; } else if (!ntfssa.QueryFrsFromPath(&path, mft.GetMasterFileTable(), &volume_bitmap, &file_record, &system_file, &error)) { wsprintf(buf, TEXT("File not found.")); MessageBox(hDlg, buf, TEXT("DiskEdit"), MB_OK|MB_ICONINFORMATION); return FALSE; } else { FileNumber = file_record.QueryFileNumber().GetLowPart(); } } EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; }