#include "ulib.hxx" #include "untfs.hxx" #include "secstr.hxx" #include "frsstruc.hxx" #include "ntfssa.hxx" #include "attrrec.hxx" #include "cmem.hxx" #include "ntfssa.hxx" extern "C" { #include } /////////////////////////////////////////////////////////////////////////////// // Security stream support // /////////////////////////////////////////////////////////////////////////////// BOOLEAN SECURITY_STREAM_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; return VERTICAL_TEXT_SCROLL::Initialize( WindowHandle, 0, ClientHeight, ClientWidth, textmetric.tmExternalLeading + textmetric.tmHeight, textmetric.tmMaxCharWidth); } VOID SECURITY_STREAM_EDIT::SetBuf( IN HWND WindowHandle, IN OUT PVOID Buffer, IN ULONG Size ) { _buffer = Buffer; _size = Size; SetScrollPos(WindowHandle, SB_VERT, 0, FALSE); } VOID SECURITY_STREAM_EDIT::KeyUp( IN HWND WindowHandle ) { ScrollUp(WindowHandle); } VOID SECURITY_STREAM_EDIT::KeyDown( IN HWND WindowHandle ) { ScrollDown(WindowHandle); } VOID SECURITY_STREAM_EDIT::Paint( IN HDC DeviceContext, IN RECT InvalidRect, IN HWND WindowHandle ) { TCHAR buf[1024]; if (!_buffer || !_size) { return; } SelectObject(DeviceContext, GetStockObject(ANSI_FIXED_FONT)); // // While there are more windows to dump // PVOID CurrentWindow = _buffer; INT CurrentLine = 0; while ((PCHAR)CurrentWindow < (PCHAR)_buffer + _size) { // // Dump window // PSECURITY_DESCRIPTOR_HEADER Header = (PSECURITY_DESCRIPTOR_HEADER) CurrentWindow; while ((PBYTE)Header < (PBYTE)CurrentWindow + 256 * 1024 && Header->HashKey.SecurityId != SECURITY_ID_INVALID) { swprintf( buf, TEXT( "%08x: Hash %08x SecurityId %08x Offset %016I64x Length %08x" ), (PCHAR)Header - (PCHAR)_buffer, Header->HashKey.Hash, Header->HashKey.SecurityId, Header->Offset, Header->Length ); WriteLine( DeviceContext, CurrentLine++, buf ); Header = (PSECURITY_DESCRIPTOR_HEADER) ((PBYTE)Header + ((Header->Length + 15) & ~15)); } // // Dump mirror // Header = (PSECURITY_DESCRIPTOR_HEADER) ((PBYTE) CurrentWindow + 256 * 1024); while ((PBYTE)Header < (PBYTE)_buffer + _size && (PBYTE)Header < (PBYTE)CurrentWindow + 512 * 1024 && Header->HashKey.SecurityId != SECURITY_ID_INVALID) { swprintf( buf, TEXT( "%08x: Hash %08x SecurityId %08x Offset %016I64x Length %08x" ), (PCHAR)Header - (PCHAR)_buffer, Header->HashKey.Hash, Header->HashKey.SecurityId, Header->Offset, Header->Length ); WriteLine( DeviceContext, CurrentLine++, buf ); Header = (PSECURITY_DESCRIPTOR_HEADER) ((PBYTE)Header + ((Header->Length + 15) & ~15)); } // // Advance to next block // CurrentWindow = (PVOID) ((PBYTE)CurrentWindow + 512 * 1024); } SetRange(WindowHandle, CurrentLine + 50); }