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

140 lines
3.7 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include "ulib.hxx"
#include "partedit.hxx"
extern "C" {
#include <stdio.h>
}
BOOLEAN
PARTITION_TABLE_EDIT::Initialize(
IN HWND WindowHandle,
IN INT ClientHeight,
IN INT ClientWidth,
IN PLOG_IO_DP_DRIVE Drive
)
{
TEXTMETRIC textmetric;
HDC hdc;
hdc = GetDC(WindowHandle);
if (hdc == NULL)
return FALSE;
GetTextMetrics(hdc, &textmetric);
ReleaseDC(WindowHandle, hdc);
VERTICAL_TEXT_SCROLL::Initialize(
WindowHandle,
0,
ClientHeight,
ClientWidth,
textmetric.tmExternalLeading + textmetric.tmHeight,
textmetric.tmMaxCharWidth);
return TRUE;
}
VOID
PARTITION_TABLE_EDIT::SetBuf(
IN HWND WindowHandle,
IN OUT PVOID Buffer,
IN ULONG Size
)
{
_buffer = Buffer;
_size = Size;
SetScrollPos(WindowHandle, SB_VERT, 0, FALSE);
}
VOID
PARTITION_TABLE_EDIT::Paint(
IN HDC DeviceContext,
IN RECT InvalidRect,
IN HWND WindowHandle
)
{
PARTITION_TABLE_ENTRY Entry;
PPARTITION_TABLE_ENTRY p;
TEXTMETRIC textmetric;
INT ch, CurrentLine;
TCHAR buf[1024];
ULONG i, Checksum, *pul;
SelectObject(DeviceContext, GetStockObject(ANSI_FIXED_FONT));
if (!_buffer || _size < 512) {
return;
}
p = (PPARTITION_TABLE_ENTRY)((PBYTE)_buffer+0x1be);
GetTextMetrics(DeviceContext, &textmetric);
ch = textmetric.tmExternalLeading + textmetric.tmHeight;
CurrentLine = 0;
swprintf( buf, TEXT("Disk Signature: 0x%x"), *((PULONG)_buffer + 0x6E) );
WriteLine( DeviceContext, CurrentLine++, buf );
// Compute the sector checksum.
//
Checksum = 0;
for( i = 0, pul = (PULONG)_buffer; i < 0x80; i++, pul++ ) {
Checksum += *pul;
}
swprintf( buf, TEXT("Sector Checksum: 0x%x"), Checksum );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT("") );
WriteLine( DeviceContext, CurrentLine++, buf );
for( i = 0; i < 4; i++ ) {
memcpy( &Entry, p, sizeof(PARTITION_TABLE_ENTRY) );
swprintf( buf, TEXT("Entry %d"), i );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Boot Indicator: 0x%x"), Entry.BootIndicator );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Beginning Head: 0x%x"), Entry.BeginningHead );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Beginning Sector: 0x%x"), Entry.BeginningSector );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Beginning Cylinder: 0x%x"), Entry.BeginningCylinder );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" System ID: 0x%x"), Entry.SystemID );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Ending Head: 0x%x"), Entry.EndingHead );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Ending Sector: 0x%x"), Entry.EndingSector );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Ending Cylinder: 0x%x"), Entry.EndingCylinder );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Starting Sector: 0x%x"), Entry.StartingSector );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT(" Sectors: 0x%x"), Entry.Sectors );
WriteLine( DeviceContext, CurrentLine++, buf );
swprintf( buf, TEXT("") );
WriteLine( DeviceContext, CurrentLine++, buf );
p++;
}
SetRange(WindowHandle, CurrentLine - 1);
}