#include "ulib.hxx" #include "list.hxx" #include "iterator.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 "rfatsa.hxx" #include "secio.hxx" #include "clusio.hxx" #include "frsio.hxx" #include "rootio.hxx" #include "chainio.hxx" #include "fileio.hxx" #include "logrecio.hxx" #include "secedit.hxx" #include "frsedit.hxx" #include "indxedit.hxx" #include "secstr.hxx" #include "bootedit.hxx" #include "nbedit.hxx" #include "ofsbedit.hxx" #include "partedit.hxx" #include "gptedit.hxx" #include "restarea.hxx" #include "logreced.hxx" #include "rcache.hxx" #include "hmem.hxx" #include "attrio.hxx" #include "recordpg.hxx" #include "crack.hxx" #include "atrlsted.hxx" #include "diskedit.h" extern "C" { #include } DECLARE_CLASS( IO_COUPLE ); class IO_COUPLE : public OBJECT { public: DECLARE_CONSTRUCTOR( IO_COUPLE ); VIRTUAL ~IO_COUPLE( ) { Destroy(); }; PHMEM Mem; PIO_OBJECT IoObject; PEDIT_OBJECT EditObject; PEDIT_OBJECT OtherEditObject; PEDIT_OBJECT SplitEditObject; private: NONVIRTUAL VOID Construct() { Mem = NULL; IoObject = NULL; EditObject = NULL; OtherEditObject = NULL; SplitEditObject = NULL; }; NONVIRTUAL VOID Destroy( ); }; enum SPLIT_OPERATION { eSplitToggle, eSplitCreate, eSplitDestroy, eSplitQuery }; extern BOOLEAN SplitView(HWND, SPLIT_OPERATION); DEFINE_CONSTRUCTOR( IO_COUPLE, OBJECT ); VOID IO_COUPLE::Destroy( ) { DELETE(Mem); DELETE(IoObject); DELETE(EditObject); DELETE(OtherEditObject); DELETE(SplitEditObject); } #define IoCoupleSetEdit(IoCouple,type,hWnd,hwndChild,ClientHeight,ClientWidth,Drive) \ { \ VERTICAL_TEXT_SCROLL *V = NEW type; \ \ do { \ \ if (NULL == V) { \ ReportError(hwndChild, 0); \ continue; \ } \ if (!V->Initialize(hwndChild, ClientHeight, ClientWidth, Drive)) { \ DELETE(V); \ ReportError(hWnd, 0); \ continue; \ } \ \ IoCouple->EditObject->KillFocus(hwndChild); \ DELETE(IoCouple->OtherEditObject); \ IoCouple->OtherEditObject = IoCouple->EditObject; \ IoCouple->EditObject = V; \ IoCouple->IoObject->GetBuf(&size); \ IoCouple->EditObject->SetBuf(hwndChild, \ IoCouple->IoObject->GetBuf(), size); \ IoCouple->EditObject->SetFocus(hwndChild); \ InvalidateRect(hwndChild, NULL, TRUE); \ \ if (NULL != hwndSplit) { \ if (NULL == (V = NEW type)) { \ ReportError(hwndSplit, 0); \ continue; \ } \ if (!V->Initialize(hwndSplit, ClientHeight, \ ClientWidth, Drive)) { \ DELETE(V); \ ReportError(hWnd, 0); \ continue; \ } \ \ IoCouple->SplitEditObject = V; \ IoCouple->IoObject->GetBuf(&size); \ IoCouple->SplitEditObject->SetBuf(hwndSplit, \ IoCouple->IoObject->GetBuf(), size); \ } \ } while ( 0 ); \ } PLOG_IO_DP_DRIVE Drive = NULL; LSN Lsn; STATIC HINSTANCE hInst; STATIC PIO_COUPLE IoCouple = NULL; STATIC PLIST IoList = NULL; STATIC PITERATOR IoListIterator = NULL; STATIC INT ClientHeight = 0; STATIC INT ClientWidth = 0; STATIC INT BacktrackFileNumber; BOOLEAN DbgOutput( PCHAR Stuff ) { OutputDebugStringA(Stuff); return TRUE; } VOID ReportError( IN HWND hWnd, IN ULONG Error ) { FARPROC lpProc; TCHAR message[64]; lpProc = MakeProcInstance((FARPROC) About, hInst); DialogBox(hInst, TEXT("ErrorBox"), hWnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); if (0 != Error) { wsprintf(message, TEXT("Error code: 0x%x\n"), Error); MessageBox(hWnd, message, TEXT("Error Information"), MB_OK|MB_ICONINFORMATION); } } INT WinMain( IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN INT nCmdShow ) { MSG msg; HACCEL hAccel; HWND hWnd; HICON hIcon; if (!hPrevInstance && !InitApplication(hInstance)) { return FALSE; } if (!InitInstance(hInstance, nCmdShow, &hWnd, &hAccel)) { return FALSE; } while (GetMessage(&msg, NULL, NULL, NULL)) { if (!TranslateAccelerator(hWnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int)msg.wParam; } BOOLEAN InitApplication( IN HINSTANCE hInstance ) { WNDCLASS wc; // // Class for the normal viewing window // wc.style = NULL; wc.lpfnWndProc = ChildWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, TEXT("diskedit")); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("ChildWinClass"); if (0 == RegisterClass(&wc)) return 0; // // Class for the split, byte-view window. // wc.style = NULL; wc.lpfnWndProc = SplitWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("SplitWinClass"); if (0 == RegisterClass(&wc)) return 0; // // Class for the parent window. // wc.style = NULL; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, TEXT("diskedit")); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = TEXT("DiskEditMenu"); wc.lpszClassName = TEXT("DiskEditWinClass"); if (0 == RegisterClass(&wc)) return 0; return 1; } BOOLEAN InitInstance( IN HINSTANCE hInstance, IN INT nCmdShow, OUT HWND* phWnd, OUT HACCEL* hAccel ) { HDC hdc; TEXTMETRIC textmetric; hInst = hInstance; hdc = GetDC(NULL); if (hdc == NULL) return FALSE; SelectObject(hdc, GetStockObject(ANSI_FIXED_FONT)); GetTextMetrics(hdc, &textmetric); ReleaseDC(NULL, hdc); *phWnd = CreateWindow( TEXT("DiskEditWinClass"), TEXT("DiskEdit"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 84*textmetric.tmMaxCharWidth, 36*(textmetric.tmExternalLeading + textmetric.tmHeight), NULL, NULL, hInstance, NULL ); if (NULL == *phWnd) { return FALSE; } *hAccel = (HACCEL) LoadAccelerators(hInst, TEXT("DiskEditAccel")); ShowWindow(*phWnd, nCmdShow); UpdateWindow(*phWnd); return TRUE; } BOOL FrsNumberDialogProc( IN HWND hDlg, IN UINT message, IN WPARAM wParam, IN LPARAM lParam ) /*++ Routine Description: This is the dialog procedure for the dialog box which queries an FRS number to backtrack. Arguments: hDlg -- identifies the dialog box message -- supplies the message ID received by the dialog box wParam -- message-type-dependent parameter lParam -- message-type-dependent parameter Returns: TRUE if this procedure handled the message, FALSE if it did not. --*/ { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: 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; swscanf(buf, TEXT("%x"), &BacktrackFileNumber); EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } STATIC HWND hwndChild = NULL; STATIC HWND hwndSplit = NULL; LRESULT MainWndProc( IN HWND hWnd, IN UINT message, IN WPARAM wParam, IN LPARAM lParam ) { FARPROC lpProc; HDC hDC; PAINTSTRUCT ps; PDOS_BOOT_EDIT boot_edit; PNTFS_BOOT_EDIT ntboot_edit; PPARTITION_TABLE_EDIT part_edit; PGUID_PARTITION_TABLE_EDIT guid_part_edit; PRESTART_AREA_EDIT rest_area_edit; PRECORD_PAGE_EDIT rec_page_edit; PLOG_RECORD_EDIT log_rec_edit; ULONG size; WORD command; BOOLEAN error; ULONG error_status = 0; PIO_COUPLE next_couple; PEDIT_OBJECT tmp_edit; switch (message) { case WM_SETFOCUS: IoCouple->EditObject->SetFocus(hwndChild); break; case WM_CREATE: if (!DEFINE_CLASS_DESCRIPTOR( IO_COUPLE ) || !(IoCouple = NEW IO_COUPLE) || !(IoCouple->IoObject = NEW IO_OBJECT) || !(IoCouple->EditObject = NEW EDIT_OBJECT) || !(IoCouple->OtherEditObject = NEW EDIT_OBJECT) || !(IoList = NEW LIST) || !IoList->Initialize() || !IoList->Put((POBJECT) IoCouple) || !(IoListIterator = IoList->QueryIterator()) || !IoListIterator->GetNext()) { PostQuitMessage(0); } hwndChild = CreateWindow( TEXT("ChildWinClass"), TEXT("PrimaryView"), WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE, 0, 0, ClientWidth, ClientHeight, hWnd, NULL, hInst, NULL ); if (NULL == hwndChild) { int error = GetLastError(); PostQuitMessage(0); } ShowWindow(hwndChild, SW_SHOW); UpdateWindow(hwndChild); SetWindowPos(hwndChild, HWND_TOP, 0, 0, ClientWidth, ClientHeight, SWP_SHOWWINDOW); break; case WM_SIZE: ClientHeight = HIWORD(lParam); ClientWidth = LOWORD(lParam); if (NULL == hwndSplit) { IoCouple->EditObject->ClientSize(ClientHeight, ClientWidth); SetWindowPos(hwndChild, HWND_TOP, 0, 0, ClientWidth, ClientHeight, SWP_SHOWWINDOW); } else { IoCouple->EditObject->ClientSize(ClientHeight, ClientWidth / 2); IoCouple->SplitEditObject->ClientSize(ClientHeight, ClientWidth / 2); SetWindowPos(hwndChild, HWND_TOP, 0, 0, ClientWidth / 2, ClientHeight, SWP_SHOWWINDOW); SetWindowPos(hwndSplit, HWND_TOP, ClientWidth / 2, 0, ClientWidth / 2, ClientHeight, SWP_SHOWWINDOW); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_ABOUT: lpProc = MakeProcInstance((FARPROC) About, hInst); DialogBox(hInst, TEXT("AboutBox"), hWnd, (DLGPROC) lpProc); FreeProcInstance(lpProc); break; case IDM_EXIT: DestroyWindow(hWnd); break; case IDM_OPEN: lpProc = MakeProcInstance((FARPROC) OpenVolume, hInst); if (!DialogBox(hInst, TEXT("OpenVolumeBox"), hWnd, (DLGPROC) lpProc)) { ReportError(hWnd, 0); } FreeProcInstance(lpProc); SplitView(hWnd, eSplitDestroy); IoCouple->EditObject->KillFocus(hwndChild); IoListIterator->Reset(); IoList->DeleteAllMembers(); if (!(IoCouple = NEW IO_COUPLE) || !(IoCouple->IoObject = NEW IO_OBJECT) || !(IoCouple->EditObject = NEW EDIT_OBJECT) || !(IoCouple->OtherEditObject = NEW EDIT_OBJECT) || !IoList->Initialize() || !IoList->Put(IoCouple) || !IoListIterator->GetNext()) { PostQuitMessage(0); } SetWindowText(hWnd, TEXT("DiskEdit")); InvalidateRect(hWnd, NULL, TRUE); InvalidateRect(hwndChild, NULL, TRUE); break; case IDM_READ_SECTORS: case IDM_READ_CLUSTERS: case IDM_READ_FRS: case IDM_READ_ROOT: case IDM_READ_CHAIN: case IDM_READ_FILE: case IDM_READ_ATTRIBUTE: case IDM_READ_LOG_RECORD: if (!(next_couple = NEW IO_COUPLE)) { break; } switch (LOWORD(wParam)) { case IDM_READ_SECTORS: next_couple->IoObject = NEW SECTOR_IO; command = IDM_VIEW_BYTES; break; case IDM_READ_CLUSTERS: next_couple->IoObject = NEW CLUSTER_IO; command = IDM_VIEW_BYTES; break; case IDM_READ_FRS: next_couple->IoObject = NEW FRS_IO; command = IDM_VIEW_FRS; break; case IDM_READ_ATTRIBUTE: next_couple->IoObject = NEW ATTR_IO; command = IDM_VIEW_BYTES; break; case IDM_READ_LOG_RECORD: next_couple->IoObject = NEW LOG_RECORD_IO; command = IDM_VIEW_LOG_RECORD; break; case IDM_READ_ROOT: next_couple->IoObject = NEW ROOT_IO; command = IDM_VIEW_BYTES; break; case IDM_READ_CHAIN: next_couple->IoObject = NEW CHAIN_IO; command = IDM_VIEW_BYTES; break; case IDM_READ_FILE: next_couple->IoObject = NEW FILE_IO; command = IDM_VIEW_BYTES; break; default: next_couple->IoObject = NULL; break; } error = TRUE; if (next_couple->IoObject && (next_couple->Mem = NEW HMEM) && next_couple->Mem->Initialize() && next_couple->IoObject->Setup(next_couple->Mem, Drive, hInst, hwndChild, &error) && next_couple->IoObject->Read(&error_status) && (next_couple->EditObject = NEW EDIT_OBJECT) && (next_couple->OtherEditObject = NEW EDIT_OBJECT) && IoList->Put(next_couple)) { if (NULL != hwndSplit) { next_couple->SplitEditObject = NEW EDIT_OBJECT; if (NULL == next_couple->SplitEditObject) { DELETE(next_couple); break; } } IoCouple->EditObject->KillFocus(hwndChild); IoCouple = next_couple; IoCouple->EditObject->SetFocus(hwndChild); IoListIterator->Reset(); IoListIterator->GetPrevious(); SetWindowText(hWnd, IoCouple->IoObject->GetHeaderText()); SendMessage(hWnd, WM_COMMAND, command, 0); if (NULL != hwndSplit) { SendMessage(hwndSplit, WM_COMMAND, command, 0); } } else { if (error) { ReportError(hWnd, error_status); } DELETE(next_couple); } break; case IDM_READ_PREVIOUS: if (NULL != IoListIterator->GetPrevious()) { IoCouple->EditObject->KillFocus(hwndChild); IoCouple = (PIO_COUPLE)IoListIterator->GetCurrent(); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hWnd, NULL, TRUE); if (NULL != IoCouple->SplitEditObject && NULL == hwndSplit) { SplitView(hwndChild, eSplitCreate); InvalidateRect(hwndSplit, NULL, TRUE); } if (NULL == IoCouple->SplitEditObject && NULL != hwndSplit) { SplitView(hwndChild, eSplitDestroy); } SetWindowText(hWnd, IoCouple->IoObject->GetHeaderText()); } else { ReportError(hwndChild, 0); IoListIterator->GetNext(); } break; case IDM_READ_NEXT: if (IoListIterator->GetNext()) { IoCouple->EditObject->KillFocus(hwndChild); IoCouple = (PIO_COUPLE) IoListIterator->GetCurrent(); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); if (NULL != IoCouple->SplitEditObject && NULL == hwndSplit) { SplitView(hwndChild, eSplitCreate); InvalidateRect(hwndSplit, NULL, TRUE); } if (NULL == IoCouple->SplitEditObject && NULL != hwndSplit) { SplitView(hwndChild, eSplitDestroy); } SetWindowText(hWnd, IoCouple->IoObject->GetHeaderText()); } else { ReportError(hwndChild, 0); IoListIterator->GetPrevious(); } break; case IDM_READ_REMOVE: if (IoList->QueryMemberCount() > 1) { IoCouple->EditObject->KillFocus(hwndChild); IoCouple = (PIO_COUPLE) IoList->Remove(IoListIterator); DELETE(IoCouple); IoCouple = (PIO_COUPLE) IoListIterator->GetCurrent(); if (!IoCouple) { IoCouple = (PIO_COUPLE) IoListIterator->GetPrevious(); } IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); SetWindowText(hWnd, IoCouple->IoObject->GetHeaderText()); } break; case IDM_RELOCATE_SECTORS: case IDM_RELOCATE_CLUSTERS: case IDM_RELOCATE_FRS: case IDM_RELOCATE_ROOT: case IDM_RELOCATE_CHAIN: case IDM_RELOCATE_FILE: IoCouple->IoObject->GetBuf(&size); DELETE(IoCouple->IoObject); switch (LOWORD(wParam)) { case IDM_RELOCATE_SECTORS: IoCouple->IoObject = NEW SECTOR_IO; command = IDM_VIEW_BYTES; break; case IDM_RELOCATE_CLUSTERS: IoCouple->IoObject = NEW CLUSTER_IO; command = IDM_VIEW_BYTES; break; case IDM_RELOCATE_FRS: IoCouple->IoObject = NEW FRS_IO; command = IDM_VIEW_FRS; break; case IDM_RELOCATE_ROOT: IoCouple->IoObject = NEW ROOT_IO; command = IDM_VIEW_BYTES; break; case IDM_RELOCATE_CHAIN: IoCouple->IoObject = NEW CHAIN_IO; command = IDM_VIEW_BYTES; break; case IDM_RELOCATE_FILE: IoCouple->IoObject = NEW FILE_IO; if (IoCouple->IoObject) { if (!((PFILE_IO) IoCouple->IoObject)->Initialize(size)) { DELETE(IoCouple->IoObject); } } command = IDM_VIEW_BYTES; break; default: IoCouple->IoObject = NULL; break; } error = TRUE; if (IoCouple->IoObject && IoCouple->IoObject->Setup(IoCouple->Mem, Drive, hInst, hwndChild, &error)) { SetWindowText(hWnd, IoCouple->IoObject->GetHeaderText()); } else { if (error) { ReportError(hWnd, 0); } } break; case IDM_VIEW_BYTES: IoCoupleSetEdit( IoCouple, SECTOR_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_FRS: IoCoupleSetEdit( IoCouple, FRS_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_ATTR_LIST: IoCoupleSetEdit( IoCouple, ATTR_LIST_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_NTFS_INDEX: IoCoupleSetEdit( IoCouple, NAME_INDEX_BUFFER_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_NTFS_SECURITY_ID: IoCoupleSetEdit( IoCouple, SECURITY_ID_INDEX_BUFFER_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_NTFS_SECURITY_HASH: IoCoupleSetEdit( IoCouple, SECURITY_HASH_INDEX_BUFFER_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_NTFS_SECURITY_STREAM: IoCoupleSetEdit( IoCouple, SECURITY_STREAM_EDIT, hWnd, hwndChild, ClientHeight, ClientWidth, Drive ); break; case IDM_VIEW_FAT_BOOT: if (NULL == (boot_edit = NEW DOS_BOOT_EDIT)) { ReportError(hwndChild, 0); break; } IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = boot_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); break; case IDM_VIEW_NTFS_BOOT: if (ntboot_edit = NEW NTFS_BOOT_EDIT) { IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = ntboot_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); } else { DELETE(ntboot_edit); ReportError(hWnd, 0); } break; case IDM_VIEW_PARTITION_TABLE: if ( (part_edit = NEW PARTITION_TABLE_EDIT) && part_edit->Initialize(hwndChild, ClientHeight, ClientWidth, Drive)) { IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = part_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); } else { DELETE( part_edit ); ReportError(hWnd, 0); } break; case IDM_VIEW_GPT: if ( (guid_part_edit = NEW GUID_PARTITION_TABLE_EDIT) && guid_part_edit->Initialize(hwndChild, ClientHeight, ClientWidth, Drive)) { IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = guid_part_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); } else { DELETE( guid_part_edit ); ReportError(hWnd, 0); } break; case IDM_VIEW_RESTART_AREA: if ((rest_area_edit = NEW RESTART_AREA_EDIT) && rest_area_edit->Initialize(hwndChild, ClientHeight, ClientWidth, Drive )) { IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = rest_area_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); } else { DELETE(rest_area_edit); ReportError(hWnd, 0); } break; case IDM_VIEW_RECORD_PAGE: if ((rec_page_edit = NEW RECORD_PAGE_EDIT) && rec_page_edit->Initialize(hwndChild, ClientHeight, ClientWidth, Drive)) { IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = rec_page_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); } else { DELETE(rec_page_edit); ReportError(hWnd, 0); } break; case IDM_VIEW_LOG_RECORD: if ((log_rec_edit = NEW LOG_RECORD_EDIT) && log_rec_edit->Initialize(hwndChild, ClientHeight, ClientWidth, Drive)) { IoCouple->EditObject->KillFocus(hwndChild); DELETE(IoCouple->OtherEditObject); IoCouple->OtherEditObject = IoCouple->EditObject; IoCouple->EditObject = log_rec_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->EditObject->SetBuf(hwndChild, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); } else { DELETE(log_rec_edit); ReportError(hWnd, 0); } break; case IDM_VIEW_LAST: IoCouple->EditObject->KillFocus(hwndChild); tmp_edit = IoCouple->EditObject; IoCouple->EditObject = IoCouple->OtherEditObject; IoCouple->OtherEditObject = tmp_edit; IoCouple->EditObject->SetFocus(hwndChild); InvalidateRect(hwndChild, NULL, TRUE); break; case IDM_VIEW_SPLIT: SplitView(hWnd, eSplitToggle); break; case IDM_WRITE_IT: if (!IoCouple->IoObject->Write()) { ReportError(hWnd, 0); } break; case IDM_CRACK_NTFS: lpProc = MakeProcInstance((FARPROC)InputPath, hInst); if (DialogBox(hInst, TEXT("InputPathBox"), hWnd, (DLGPROC)lpProc)) { CrackNtfsPath(hWnd); } FreeProcInstance(lpProc); break; case IDM_CRACK_FAT: lpProc = MakeProcInstance((FARPROC)InputPath, hInst); if (DialogBox(hInst, TEXT("InputPathBox"), hWnd, (DLGPROC)lpProc)) { CrackFatPath(hWnd); } FreeProcInstance(lpProc); break; case IDM_CRACK_LSN: lpProc = MakeProcInstance((FARPROC)InputLsn, hInst); if (DialogBox(hInst, TEXT("CrackLsnBox"), hWnd, (DLGPROC)lpProc)) { CrackLsn(hWnd); } FreeProcInstance(lpProc); break; case IDM_CRACK_NEXT_LSN: lpProc = MakeProcInstance((FARPROC)InputLsn, hInst); if (DialogBox(hInst, TEXT("CrackNextLsnBox"), hWnd, (DLGPROC)lpProc)) { CrackNextLsn(hWnd); } FreeProcInstance(lpProc); break; case IDM_BACKTRACK_FRS: lpProc = MakeProcInstance((FARPROC)FrsNumberDialogProc, hInst); if (DialogBox(hInst, TEXT("BacktrackFrsBox"), hWnd, (DLGPROC)lpProc)) { BacktrackFrsFromScratch(hWnd, BacktrackFileNumber); } FreeProcInstance(lpProc); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hDC = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; case WM_DESTROY: IoCouple->EditObject->KillFocus(hwndChild); IoList->DeleteAllMembers(); DELETE(IoListIterator); DELETE(IoList); DELETE(Drive); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } BOOL About( IN HWND hDlg, IN UINT message, IN UINT wParam, IN LONG lParam ) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } BOOL OpenVolume( IN HWND hDlg, IN UINT message, IN UINT wParam, IN LONG lParam ) { PREAD_CACHE rcache; switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, TRUE); return TRUE; } if (LOWORD(wParam) == IDOK) { DSTRING dos_name, nt_name, tmp_name; DSTRING volfile_name, volfile_path, backslash; TCHAR volume_buf[32]; TCHAR volfile_buf[32]; INT n; n = GetDlgItemText(hDlg, IDTEXT, volume_buf, sizeof(volume_buf)/sizeof(TCHAR)); volume_buf[n] = 0; n = GetDlgItemText(hDlg, IDTEXT2, volfile_buf, sizeof(volfile_buf)/sizeof(TCHAR)); volfile_buf[n] = 0; DELETE(Drive); if (!backslash.Initialize("\\") || !dos_name.Initialize(volume_buf)) { EndDialog(hDlg, FALSE); return TRUE; } if (dos_name.QueryChCount() > 0 && dos_name.QueryChAt(0) >= '0' && dos_name.QueryChAt(0) <= '9') { if (!nt_name.Initialize("\\device\\harddisk") || !nt_name.Strcat(&dos_name) || !tmp_name.Initialize("\\partition0") || !nt_name.Strcat(&tmp_name)) { EndDialog(hDlg, FALSE); return TRUE; } } else { if (!IFS_SYSTEM::DosDriveNameToNtDriveName(&dos_name, &nt_name)) { EndDialog(hDlg, FALSE); return TRUE; } } if (!volfile_name.Initialize(volfile_buf)) { EndDialog(hDlg, FALSE); return TRUE; } if (0 != wcslen(volfile_buf)) { if (!volfile_path.Initialize(&nt_name) || !volfile_path.Strcat(&backslash) || !volfile_path.Strcat(&volfile_name)) { EndDialog(hDlg, FALSE); return TRUE; } if (NULL == (Drive = NEW LOG_IO_DP_DRIVE) || !Drive->Initialize(&nt_name, &volfile_path)) { EndDialog(hDlg, FALSE); return TRUE; } } else { if (NULL == (Drive = NEW LOG_IO_DP_DRIVE) || !Drive->Initialize(&nt_name)) { EndDialog(hDlg, FALSE); return TRUE; } } if ((rcache = NEW READ_CACHE) && rcache->Initialize(Drive, 1024)) { Drive->SetCache(rcache); } else { DELETE(rcache); } if (IsDlgButtonChecked(hDlg, IDCHECKBOX) && !Drive->Lock()) { EndDialog(hDlg, FALSE); return TRUE; } EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } BOOL InputPath( IN HWND hDlg, IN UINT message, IN UINT wParam, IN LONG lParam ) { INT n; switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, FALSE); return TRUE; } if (LOWORD(wParam) == IDOK) { n = GetDlgItemText(hDlg, IDTEXT, Path, MAX_PATH/sizeof(TCHAR)); Path[n] = 0; EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } BOOL InputLsn( IN HWND hDlg, IN UINT message, IN UINT wParam, IN LONG lParam ) { INT n; TCHAR buf[40]; PTCHAR pch; switch (message) { case WM_INITDIALOG: wsprintf(buf, TEXT("%x:%x"), Lsn.HighPart, Lsn.LowPart); SetDlgItemText(hDlg, IDTEXT, buf); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, FALSE); return TRUE; } if (LOWORD(wParam) == IDOK) { n = GetDlgItemText(hDlg, IDTEXT, buf, sizeof(buf)/sizeof(TCHAR)); buf[n] = 0; if (NULL == (pch = wcschr(buf, ':'))) { Lsn.HighPart = 0; swscanf(buf, TEXT("%x"), &Lsn.LowPart); } else { *pch = 0; swscanf(buf, TEXT("%x"), &Lsn.HighPart); swscanf(pch + 1, TEXT("%x"), &Lsn.LowPart); *pch = ':'; } EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } static ULONG SeqNumberBits; ULONG GetLogPageSize( PLOG_IO_DP_DRIVE Drive ) { static ULONG PageSize; static BOOLEAN been_here = FALSE; static UCHAR buf[0x600]; NTFS_SA NtfsSa; MESSAGE Msg; NTFS_MFT_FILE Mft; NTFS_FILE_RECORD_SEGMENT Frs; NTFS_ATTRIBUTE Attrib; PLFS_RESTART_PAGE_HEADER pRestPageHdr; PLFS_RESTART_AREA pRestArea; ULONG bytes_read; BOOLEAN error; if (been_here) { return PageSize; } pRestPageHdr = (PLFS_RESTART_PAGE_HEADER)buf; if (!Drive || !NtfsSa.Initialize(Drive, &Msg) || !NtfsSa.Read() || !Mft.Initialize(Drive, NtfsSa.QueryMftStartingLcn(), NtfsSa.QueryClusterFactor(), NtfsSa.QueryFrsSize(), NtfsSa.QueryVolumeSectors(), NULL, NULL) || !Mft.Read() || !Frs.Initialize((VCN)LOG_FILE_NUMBER, &Mft) || !Frs.Read() || !Frs.QueryAttribute(&Attrib, &error, $DATA) || !Attrib.Read((PVOID)pRestPageHdr, 0, 0x600, &bytes_read) || bytes_read != 0x600) { return 0; } PageSize = pRestPageHdr->LogPageSize; pRestArea = PLFS_RESTART_AREA(PUCHAR(pRestPageHdr) + pRestPageHdr->RestartOffset); SeqNumberBits = pRestArea->SeqNumberBits; been_here = 1; return PageSize; } ULONG GetSeqNumberBits( PLOG_IO_DP_DRIVE Drive ) { (void)GetLogPageSize(Drive); return SeqNumberBits; } BOOLEAN SplitView( HWND hWnd, SPLIT_OPERATION Op ) { static BOOLEAN CheckState = FALSE; int flags; PSECTOR_EDIT sector_edit; CREATESTRUCT cs; ULONG size; HMENU hMenu = GetMenu(hWnd); if (Op == eSplitToggle) { CheckState = !CheckState; } else if (Op == eSplitCreate) { CheckState = TRUE; } else if (Op == eSplitDestroy) { CheckState = FALSE; } else if (Op == eSplitQuery) { DebugAssert(hWnd == NULL); return CheckState; } else { return FALSE; } if (!CheckState) { // Destroy the extra window, remove the checkbox from // the menu entry. if (NULL == hwndSplit) { return 0; } DestroyWindow(hwndSplit); hwndSplit = NULL; flags = MF_BYCOMMAND | MF_UNCHECKED; if (hMenu == NULL) { return FALSE; } CheckMenuItem(hMenu, IDM_VIEW_SPLIT, flags); SetWindowPos(hwndChild, HWND_TOP, 0, 0, ClientWidth, ClientHeight, SWP_SHOWWINDOW); IoCouple->EditObject->SetFocus(hwndChild); SetFocus(hwndChild); return TRUE; } // // Split the window. // memset(&cs, 0, sizeof(cs)); cs.y = ClientWidth / 2; cs.x = 0; cs.cy = ClientWidth / 2; cs.cx = ClientHeight; hwndSplit = CreateWindow(TEXT("SplitWinClass"), TEXT("hwndSplit"), WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE, ClientWidth / 2, 0, ClientWidth / 2, ClientHeight, hWnd, NULL, hInst, &cs); if (NULL == hwndSplit) { int error = GetLastError(); return FALSE; } SetWindowPos(hwndChild, HWND_TOP, 0, 0, ClientWidth / 2, ClientHeight, SWP_SHOWWINDOW); flags = MF_BYCOMMAND | MF_CHECKED; CheckMenuItem(hMenu, IDM_VIEW_SPLIT, flags); ShowWindow(hwndSplit, SW_SHOW); UpdateWindow(hwndSplit); if (NULL != IoCouple->SplitEditObject) { // use the existing edit object return TRUE; } if ((sector_edit = NEW SECTOR_EDIT) && sector_edit->Initialize(hwndSplit, ClientHeight, ClientWidth / 2, Drive)) { IoCouple->SplitEditObject = sector_edit; IoCouple->IoObject->GetBuf(&size); IoCouple->SplitEditObject->SetBuf(hwndSplit, IoCouple->IoObject->GetBuf(), size); IoCouple->EditObject->SetFocus(hwndChild); SetFocus(hwndChild); } else { DELETE(sector_edit); DestroyWindow(hwndSplit); ReportError(hWnd, 0); } return TRUE; } LRESULT ChildWndProc( IN HWND hwnd, IN UINT message, IN WPARAM wParam, IN LPARAM lParam ) { FARPROC lpProc; HDC hdc; PAINTSTRUCT ps; ULONG size; WORD command; BOOLEAN error; ULONG error_status; switch (message) { default: return DefWindowProc(hwnd, message, wParam, lParam); case WM_PAINT: hdc = BeginPaint(hwnd, &ps); IoCouple->EditObject->Paint(hdc, ps.rcPaint, hwnd); EndPaint(hwnd, &ps); return 0; case WM_CHAR: IoCouple->EditObject->Character(hwnd, (CHAR)wParam); break; case WM_VSCROLL: switch (LOWORD(wParam)) { case SB_LINEUP: IoCouple->EditObject->ScrollUp(hwnd); break; case SB_LINEDOWN: IoCouple->EditObject->ScrollDown(hwnd); break; case SB_PAGEUP: IoCouple->EditObject->PageUp(hwnd); break; case SB_PAGEDOWN: IoCouple->EditObject->PageDown(hwnd); break; case SB_THUMBPOSITION: IoCouple->EditObject->ThumbPosition(hwnd, HIWORD(wParam)); break; default: break; } break; case WM_KEYDOWN: switch (LOWORD(wParam)) { case VK_UP: IoCouple->EditObject->KeyUp(hwnd); break; case VK_DOWN: IoCouple->EditObject->KeyDown(hwnd); break; case VK_LEFT: IoCouple->EditObject->KeyLeft(hwnd); break; case VK_RIGHT: IoCouple->EditObject->KeyRight(hwnd); break; case VK_PRIOR: IoCouple->EditObject->PageUp(hwnd); break; case VK_NEXT: IoCouple->EditObject->PageDown(hwnd); break; default: break; } break; case WM_SETFOCUS: IoCouple->EditObject->SetFocus(hwnd); break; case WM_KILLFOCUS: IoCouple->EditObject->KillFocus(hwnd); break; case WM_LBUTTONDOWN: IoCouple->EditObject->Click(hwnd, LOWORD(lParam), HIWORD(lParam)); break; } return 0; } LRESULT SplitWndProc( IN HWND hwnd, IN UINT message, IN WPARAM wParam, IN LPARAM lParam ) { FARPROC lpProc; HDC hdc; PAINTSTRUCT ps; ULONG size; WORD command; BOOLEAN error; ULONG error_status; switch (message) { default: return DefWindowProc(hwnd, message, wParam, lParam); case WM_PAINT: hdc = BeginPaint(hwnd, &ps); if (NULL != IoCouple->SplitEditObject) { IoCouple->SplitEditObject->Paint(hdc, ps.rcPaint, hwnd); } EndPaint(hwnd, &ps); return 0; case WM_CHAR: IoCouple->SplitEditObject->Character(hwnd, (CHAR)wParam); break; case WM_VSCROLL: switch (LOWORD(wParam)) { case SB_LINEUP: IoCouple->SplitEditObject->ScrollUp(hwnd); break; case SB_LINEDOWN: IoCouple->SplitEditObject->ScrollDown(hwnd); break; case SB_PAGEUP: IoCouple->SplitEditObject->PageUp(hwnd); break; case SB_PAGEDOWN: IoCouple->SplitEditObject->PageDown(hwnd); break; case SB_THUMBPOSITION: IoCouple->SplitEditObject->ThumbPosition(hwnd, HIWORD(wParam)); break; default: break; } break; case WM_KEYDOWN: switch (LOWORD(wParam)) { case VK_UP: IoCouple->SplitEditObject->KeyUp(hwnd); break; case VK_DOWN: IoCouple->SplitEditObject->KeyDown(hwnd); break; case VK_LEFT: IoCouple->SplitEditObject->KeyLeft(hwnd); break; case VK_RIGHT: IoCouple->SplitEditObject->KeyRight(hwnd); break; case VK_PRIOR: IoCouple->SplitEditObject->PageUp(hwnd); break; case VK_NEXT: IoCouple->SplitEditObject->PageDown(hwnd); break; default: break; } break; case WM_SETFOCUS: IoCouple->SplitEditObject->SetFocus(hwnd); break; case WM_KILLFOCUS: IoCouple->SplitEditObject->KillFocus(hwnd); break; case WM_LBUTTONDOWN: IoCouple->SplitEditObject->Click(hwnd, LOWORD(lParam), HIWORD(lParam)); break; } return 0; }