windows-nt/Source/XPSP1/NT/base/fs/utils/diskedit/secio.cxx

137 lines
2.4 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#include "ulib.hxx"
#include "secio.hxx"
#include "diskedit.h"
extern "C" {
#include <stdio.h>
}
STATIC ULONG StartSector = 0;
STATIC ULONG NumSectors = 0;
BOOLEAN
SECTOR_IO::Setup(
IN PMEM Mem,
IN PLOG_IO_DP_DRIVE Drive,
IN HANDLE Application,
IN HWND WindowHandle,
OUT PBOOLEAN Error
)
{
FARPROC proc;
proc = MakeProcInstance((FARPROC) ReadSectors, Application);
if (!DialogBox((HINSTANCE)Application, TEXT("ReadSectorsBox"),
WindowHandle, (DLGPROC) proc)) {
*Error = FALSE;
return FALSE;
}
FreeProcInstance(proc);
*Error = TRUE;
_drive = Drive;
if (!NumSectors || !_drive) {
return FALSE;
}
if (!_secrun.Initialize(Mem, _drive, StartSector, NumSectors)) {
return FALSE;
}
swprintf(_header_text, TEXT("DiskEdit - Sector 0x%X for 0x%X"),
StartSector, NumSectors);
return TRUE;
}
BOOLEAN
SECTOR_IO::Read(
OUT PULONG pError
)
{
*pError = 0;
if (NULL == _drive) {
return FALSE;
}
if (!_secrun.Read()) {
*pError = _drive->QueryLastNtStatus();
return FALSE;
}
return TRUE;
}
BOOLEAN
SECTOR_IO::Write(
)
{
return _drive ? _secrun.Write() : FALSE;
}
PVOID
SECTOR_IO::GetBuf(
OUT PULONG Size
)
{
if (Size) {
*Size = _drive ? (_drive->QuerySectorSize()*_secrun.QueryLength()) : 0;
}
return _secrun.GetBuf();
}
PTCHAR
SECTOR_IO::GetHeaderText(
)
{
return _header_text;
}
BOOL
ReadSectors(
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) == 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"), &StartSector);
n = GetDlgItemText(hDlg, IDTEXT2, buf, sizeof(buf)/sizeof(TCHAR));
buf[n] = 0;
swscanf(buf, TEXT("%x"), &NumSectors);
EndDialog(hDlg, TRUE);
return TRUE;
}
break;
}
return FALSE;
}