#include "ulib.hxx" #include "chainio.hxx" #include "diskedit.h" #include "rfatsa.hxx" extern "C" { #include } STATIC USHORT StartingCluster = 0; BOOLEAN CHAIN_IO::Setup( IN PMEM Mem, IN PLOG_IO_DP_DRIVE Drive, IN HANDLE Application, IN HWND WindowHandle, OUT PBOOLEAN Error ) { FARPROC proc; REAL_FAT_SA fatsa; MESSAGE msg; proc = MakeProcInstance((FARPROC) ReadChain, Application); if (!DialogBox((HINSTANCE)Application, TEXT("ReadChainBox"), WindowHandle, (DLGPROC) proc)) { *Error = FALSE; return FALSE; } FreeProcInstance(proc); *Error = TRUE; _drive = Drive; if (!_drive || !StartingCluster || !fatsa.Initialize(_drive, &msg) || !fatsa.FAT_SA::Read() || !_cluster.Initialize(Mem, _drive, &fatsa, fatsa.GetFat(), StartingCluster)) { return FALSE; } _buffer = _cluster.GetBuf(); _buffer_size = fatsa.QuerySectorsPerCluster()*_drive->QuerySectorSize()* _cluster.QueryLength(); wsprintf(_header_text, TEXT("DiskEdit - Starting Cluster 0x%X"), StartingCluster); return TRUE; } BOOLEAN CHAIN_IO::Read( OUT PULONG pError ) { *pError = 0; if (NULL == _drive) { return FALSE; } if (!_cluster.Read()) { *pError = _drive->QueryLastNtStatus(); return FALSE; } return TRUE; } BOOLEAN CHAIN_IO::Write( ) { return _drive ? _cluster.Write() : FALSE; } PVOID CHAIN_IO::GetBuf( OUT PULONG Size ) { if (Size) { *Size = _buffer_size; } return _buffer; } PTCHAR CHAIN_IO::GetHeaderText( ) { return _header_text; } BOOL ReadChain( IN HWND hDlg, IN UINT message, IN UINT wParam, IN LONG lParam ) { UNREFERENCED_PARAMETER(lParam); ULONG tmp; 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"), &tmp); StartingCluster = (USHORT) tmp; EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; }