|
|
#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 <stdio.h>
}
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; }
|