mirror of https://github.com/tongzx/nt5src
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.
173 lines
4.3 KiB
173 lines
4.3 KiB
#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);
|
|
}
|