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