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

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