windows-nt/Source/XPSP1/NT/base/fs/utils/diskedit/atrlsted.cxx
2020-09-26 16:20:57 +08:00

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);
}