174 lines
4.3 KiB
C++
174 lines
4.3 KiB
C++
|
#include "ulib.hxx"
|
||
|
#include "untfs.hxx"
|
||
|
#include "frsstruc.hxx"
|
||
|
#include "ntfssa.hxx"
|
||
|
#include "attrrec.hxx"
|
||
|
#include "cmem.hxx"
|
||
|
#include "ntfssa.hxx"
|
||
|
#include "atrlsted.hxx"
|
||
|
#include "crack.hxx"
|
||
|
#include "attrlist.hxx"
|
||
|
|
||
|
extern "C" {
|
||
|
#include <stdio.h>
|
||
|
}
|
||
|
|
||
|
BOOLEAN
|
||
|
ATTR_LIST_EDIT::Initialize(
|
||
|
IN HWND WindowHandle,
|
||
|
IN INT ClientHeight,
|
||
|
IN INT ClientWidth,
|
||
|
IN PLOG_IO_DP_DRIVE Drive
|
||
|
)
|
||
|
{
|
||
|
TEXTMETRIC textmetric;
|
||
|
HDC hdc;
|
||
|
NTFS_SA ntfssa;
|
||
|
MESSAGE msg;
|
||
|
|
||
|
hdc = GetDC(WindowHandle);
|
||
|
if (hdc == NULL)
|
||
|
return FALSE;
|
||
|
GetTextMetrics(hdc, &textmetric);
|
||
|
ReleaseDC(WindowHandle, hdc);
|
||
|
|
||
|
_buffer = NULL;
|
||
|
_size = 0;
|
||
|
_drive = Drive;
|
||
|
|
||
|
if (!_drive) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return VERTICAL_TEXT_SCROLL::Initialize(
|
||
|
WindowHandle,
|
||
|
0,
|
||
|
ClientHeight,
|
||
|
ClientWidth,
|
||
|
textmetric.tmExternalLeading + textmetric.tmHeight,
|
||
|
textmetric.tmMaxCharWidth);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ATTR_LIST_EDIT::SetBuf(
|
||
|
IN HWND WindowHandle,
|
||
|
IN OUT PVOID Buffer,
|
||
|
IN ULONG Size
|
||
|
)
|
||
|
{
|
||
|
_buffer = Buffer;
|
||
|
_size = Size;
|
||
|
SetRange(WindowHandle, _size/3);
|
||
|
}
|
||
|
|
||
|
STATIC TCHAR buf[1024];
|
||
|
|
||
|
VOID
|
||
|
ATTR_LIST_EDIT::Paint(
|
||
|
IN HDC DeviceContext,
|
||
|
IN RECT InvalidRect,
|
||
|
IN HWND WindowHandle
|
||
|
)
|
||
|
{
|
||
|
PATTRIBUTE_LIST_ENTRY CurrentEntry;
|
||
|
PTCHAR pc;
|
||
|
TCHAR sbFlags[32];
|
||
|
ULONG LengthOfList = _size;
|
||
|
ULONG CurrentOffset;
|
||
|
ULONG CurrentLine = 0;
|
||
|
|
||
|
SetScrollRange(WindowHandle, SB_VERT, 0, _size/3, FALSE);
|
||
|
SetScrollPos(WindowHandle, SB_VERT, QueryScrollPosition(), TRUE);
|
||
|
|
||
|
SelectObject(DeviceContext, GetStockObject(ANSI_FIXED_FONT));
|
||
|
|
||
|
if (!_buffer || !_size) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
CurrentEntry = (PATTRIBUTE_LIST_ENTRY)((PCHAR)_buffer);
|
||
|
CurrentOffset = 0;
|
||
|
|
||
|
while (CurrentOffset < LengthOfList) {
|
||
|
|
||
|
if (0 != CurrentOffset) {
|
||
|
CurrentLine++;
|
||
|
}
|
||
|
|
||
|
PTCHAR SymbolicTypeCode = GetNtfsAttributeTypeCodeName(
|
||
|
CurrentEntry->AttributeTypeCode);
|
||
|
|
||
|
swprintf(buf, TEXT("Attribute type code: \t%x (%s)"),
|
||
|
CurrentEntry->AttributeTypeCode, SymbolicTypeCode);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Record length \t\t%x"), CurrentEntry->RecordLength);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Attribute name length \t%x"),
|
||
|
CurrentEntry->AttributeNameLength);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Attribute name offset \t%x"),
|
||
|
CurrentEntry->AttributeNameOffset);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Lowest vcn \t\t<%x,%x>"),
|
||
|
CurrentEntry->LowestVcn.GetHighPart(),
|
||
|
CurrentEntry->LowestVcn.GetLowPart());
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Segment reference: \t<%x,%x>"),
|
||
|
CurrentEntry->SegmentReference.HighPart,
|
||
|
CurrentEntry->SegmentReference.LowPart,
|
||
|
CurrentEntry->SegmentReference.SequenceNumber);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Sequence number: \t%x"),
|
||
|
CurrentEntry->SegmentReference.SequenceNumber);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Instance: \t\t%x"), CurrentEntry->Instance);
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
swprintf(buf, TEXT("Attribute name:\t\t"));
|
||
|
pc = buf + wcslen(buf);
|
||
|
|
||
|
for (int i = 0; i < min(64, CurrentEntry->AttributeNameLength); ++i) {
|
||
|
*pc++ = (CHAR)CurrentEntry->AttributeName[i];
|
||
|
}
|
||
|
*pc++ = '\0';
|
||
|
|
||
|
if (CurrentEntry->AttributeNameLength > 64) {
|
||
|
wcscat(buf, TEXT("..."));
|
||
|
}
|
||
|
WriteLine(DeviceContext, CurrentLine++, buf);
|
||
|
|
||
|
if (CurrentEntry->RecordLength == 0) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
CurrentOffset += CurrentEntry->RecordLength;
|
||
|
CurrentEntry = NextEntry(CurrentEntry);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ATTR_LIST_EDIT::KeyUp(
|
||
|
IN HWND WindowHandle
|
||
|
)
|
||
|
{
|
||
|
ScrollUp(WindowHandle);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
ATTR_LIST_EDIT::KeyDown(
|
||
|
IN HWND WindowHandle
|
||
|
)
|
||
|
{
|
||
|
ScrollDown(WindowHandle);
|
||
|
}
|