153 lines
3.7 KiB
C++
153 lines
3.7 KiB
C++
#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 <stdio.h>
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// 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);
|
|
}
|
|
|
|
|
|
|