You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.9 KiB
139 lines
3.9 KiB
#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);
|
|
}
|