Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
6.5 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
All rights reserved
Module Name:
lsasecbfrd.cxx
Abstract:
This file provides useful accssors and mutators.
Author:
Larry Zhu (LZhu) May 1, 2001 Created
Environment:
User Mode -Win32
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "lsasecbfrd.hxx"
#include <stdio.h>
#include <string.h>
#define SECBUFFER_TOKEN 2 // Security token
TSecBufferDesc::TSecBufferDesc(void) : m_hr(E_FAIL)
{
}
TSecBufferDesc::TSecBufferDesc(IN ULONG64 baseOffset)
: m_baseOffset(baseOffset), m_hr(E_FAIL)
{
m_hr = Initialize();
}
TSecBufferDesc::~TSecBufferDesc(void)
{
}
HRESULT TSecBufferDesc::IsValid(void) const
{
return m_hr;
}
ULONG TSecBufferDesc::GetcBuffersDirect(void) const
{
ULONG cbBuffers = 0;
if (!ReadMemory(m_baseOffset + sizeof(ULONG), &cbBuffers, sizeof(cbBuffers), NULL)) {
DBG_LOG(LSA_ERROR, ("Unable to read cBuffers for SecBufferDesc at %#I64x\n", m_baseOffset));
throw "TSecBufferDesc::GetcBuffersDirect failed";
}
return cbBuffers;
}
ULONG TSecBufferDesc::GetulVersionDirect(void) const
{
ULONG ulVersion = 0;
if (!ReadMemory(m_baseOffset, &ulVersion, sizeof(ulVersion), NULL)) {
DBG_LOG(LSA_ERROR, ("Unable to read ulVersion for SecBufferDesc at %#I64x\n", m_baseOffset));
throw "TSecBuffer::GetulVersionDirect failed";
}
return ulVersion;
}
ULONG64 TSecBufferDesc::GetpBuffersDirect(void) const
{
DBG_LOG(LSA_LOG, ("TSecBufferDesc::GetpBuffersDirect reading _SecBuffer::pBuffers from %#I64x\n", m_baseOffset));
return toPtr(ReadPtrVar(ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG))));
}
ULONG64 TSecBufferDesc::GetTokenAddrDirect(OUT ULONG* pcbBuffer OPTIONAL) const
{
ULONG64 addr = 0;
ULONG cbSecBufferInArray = TSecBuffer::GetcbSecBufferSizeInArrayDirect();
ULONG cBuffers = GetcBuffersDirect();
ULONG64 addrBuffers = GetpBuffersDirect();
if (pcbBuffer) {
*pcbBuffer = 0;
}
for (ULONG i = 0; i < min(cBuffers, 16); i++) {
TSecBuffer sb(addrBuffers + i * cbSecBufferInArray);
ULONG type = sb.GetBufferTypeDirect();
if (type & SECBUFFER_TOKEN) {
addr = sb.GetpvBufferDirect();
if (pcbBuffer) {
*pcbBuffer = sb.GetcbBufferDirect();
}
break;
}
}
//
// return NULL if no token buffer is found
//
return addr;
}
void TSecBufferDesc::ShowDirect(IN BOOL bVerbose) const
{
ULONG64 addrpBuffers = 0;
ULONG64 addrBuffers = 0;
ULONG cBuffers = 0;
ULONG cbSecBufferInArray = 0;
CHAR szBanner[MAX_PATH] = {0};
ExitIfControlC();
cBuffers = GetcBuffersDirect();
cbSecBufferInArray = TSecBuffer::GetcbSecBufferSizeInArrayDirect();
dprintf("ulVersion \t%d\n", GetulVersionDirect());
addrpBuffers = ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG));
DBG_LOG(LSA_LOG, ("TSecBufferDesc::ShowDirect reading _SecBufferDesc::pBuffers from %#I64x\n", addrpBuffers));
addrBuffers = ReadPtrVar(addrpBuffers);
dprintf("pBuffers \t%#I64x\n", addrBuffers);
dprintf("cBuffers \t%x\n", cBuffers);
//
// Display not more than 16 SecBuffer at a time
//
for (ULONG i = 0; i < min(cBuffers, 16); i++) {
_snprintf(szBanner, sizeof(szBanner) - 1, "%s%d) %s %#I64x: ", kstr4Spaces, i, kstrSecBuffer, addrBuffers + i * cbSecBufferInArray);
TSecBuffer(addrBuffers + i * cbSecBufferInArray).ShowDirect(szBanner, bVerbose);
}
if (cBuffers > 16) {
dprintf(kstrSbdWrn);
}
}
PCSTR TSecBufferDesc::toStrDirect(void) const
{
HRESULT hRetval = E_FAIL;
static CHAR szBuffer[1024] = {0};
PSTR pszBuffer = szBuffer;
ULONG cbBuffer = sizeof(szBuffer) - 1;
LONG cStored = 0;
CHAR szBanner[MAX_PATH] = {0};
ULONG64 addrpBuffers = 0;
ULONG64 addrBuffers = 0;
ULONG cbSecBufferInArray = 0;
ExitIfControlC();
ULONG cBuffers = GetcBuffersDirect();
cbSecBufferInArray = TSecBuffer::GetcbSecBufferSizeInArrayDirect();
if (SUCCEEDED(hRetval)) {
addrpBuffers = ForwardAdjustPtrAddr(m_baseOffset + 2 * sizeof(ULONG));
DBG_LOG(LSA_LOG, ("TSecBufferDesc::toStrDirect reading _SecBufferDesc::pBuffers from %#I64x\n", addrpBuffers));
addrBuffers = ReadPtrVar(addrpBuffers);
cStored = _snprintf(pszBuffer, cbBuffer,
"ulVersion \t%d\n"
"pBuffers \t%#I64x\n"
"cBuffers \t%x\n",
GetulVersionDirect(),
addrBuffers,
cBuffers);
hRetval = cStored >= 0 ? S_OK : HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
//
// Display not more than 16 SecBuffer at a time
//
for (ULONG i = 0; SUCCEEDED(hRetval) && (i < min(cBuffers, 16)); i++) {
cbBuffer -= cStored;
pszBuffer += cStored;
_snprintf(szBanner, sizeof(szBanner) - 1, "%s%d) %s %#I64x: ", kstr4Spaces, i, kstrSecBuffer, addrBuffers + i * cbSecBufferInArray);
cStored = _snprintf(pszBuffer, cbBuffer, "%s", EasyStr(TSecBuffer(addrBuffers + i * cbSecBufferInArray).toStrDirect(szBanner)));
hRetval = cStored >= 0 ? S_OK : HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
}
if (SUCCEEDED(hRetval) && (cBuffers > 16)) {
dprintf(kstrSbdWrn);
}
if (FAILED(hRetval)) {
DBG_LOG(LSA_ERROR, ("TSecBuffer::toStrDirect _SecBufferDesc %#I64x failed with error code %#x\n", m_baseOffset, hRetval));
throw "TSecBuffer::toStrDirect failed";
}
return szBuffer;
}
/******************************************************************************
Private Methods
******************************************************************************/
/*++
Routine Name:
Initialize
Routine Description:
Do necessary initialization.
Arguments:
None
Return Value:
An HRESULT
--*/
HRESULT TSecBufferDesc::Initialize(void)
{
HRESULT hRetval = E_FAIL;
hRetval = S_OK;
return hRetval;
}
HRESULT TSecBufferDesc::Initialize(IN ULONG64 baseOffset)
{
m_baseOffset = baseOffset;
m_hr = Initialize();
return m_hr;
}