windows-nt/Source/XPSP1/NT/ds/security/ntmarta/newsrc/wndctx.cpp
2020-09-26 16:20:57 +08:00

374 lines
9.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows NT Security
// Copyright (C) Microsoft Corporation, 1997 - 1998
//
// File: wndctx.cpp
//
// Contents: Implementation of CWindowContext and NT Marta Window Functions
//
// History: 3-31-1999 kirtd Created
//
//----------------------------------------------------------------------------
#include <aclpch.hxx>
#pragma hdrstop
#include <wndctx.h>
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::CWindowContext, public
//
// Synopsis: Constructor
//
//----------------------------------------------------------------------------
CWindowContext::CWindowContext ()
{
m_cRefs = 1;
m_hWindowStation = NULL;
m_fNameInitialized = FALSE;
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::~CWindowContext, public
//
// Synopsis: Destructor
//
//----------------------------------------------------------------------------
CWindowContext::~CWindowContext ()
{
if ( ( m_hWindowStation != NULL ) && ( m_fNameInitialized == TRUE ) )
{
CloseWindowStation( m_hWindowStation );
}
assert( m_cRefs == 0 );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::InitializeByName, public
//
// Synopsis: initialize the context given the name of the window station
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::InitializeByName (LPCWSTR pObjectName, ACCESS_MASK AccessMask)
{
DWORD dwDesiredAccess = 0;
if ( AccessMask & GENERIC_READ )
{
dwDesiredAccess |= WINSTA_READATTRIBUTES;
}
if ( AccessMask & GENERIC_WRITE )
{
dwDesiredAccess |= WINSTA_WRITEATTRIBUTES;
}
m_hWindowStation = OpenWindowStationW(
pObjectName,
FALSE,
dwDesiredAccess
);
if ( m_hWindowStation == NULL )
{
return( GetLastError() );
}
m_fNameInitialized = TRUE;
return( ERROR_SUCCESS );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::InitializeByHandle, public
//
// Synopsis: initialize the context given a window station handle
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::InitializeByHandle (HANDLE Handle)
{
m_hWindowStation = (HWINSTA)Handle;
assert( m_fNameInitialized == FALSE );
return( ERROR_SUCCESS );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::AddRef, public
//
// Synopsis: add a reference to the context
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::AddRef ()
{
m_cRefs += 1;
return( m_cRefs );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::Release, public
//
// Synopsis: release a reference to the context
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::Release ()
{
m_cRefs -= 1;
if ( m_cRefs == 0 )
{
delete this;
return( 0 );
}
return( m_cRefs );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::GetWindowProperties, public
//
// Synopsis: get properties about the context
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::GetWindowProperties (
PMARTA_OBJECT_PROPERTIES pObjectProperties
)
{
if ( pObjectProperties->cbSize < sizeof( MARTA_OBJECT_PROPERTIES ) )
{
return( ERROR_INVALID_PARAMETER );
}
assert( pObjectProperties->dwFlags == 0 );
return( ERROR_SUCCESS );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::GetWindowRights, public
//
// Synopsis: get the window security descriptor
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::GetWindowRights (
SECURITY_INFORMATION SecurityInfo,
PSECURITY_DESCRIPTOR* ppSecurityDescriptor
)
{
BOOL fResult;
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
DWORD cb = 0;
assert( m_hWindowStation != NULL );
fResult = GetUserObjectSecurity(
m_hWindowStation,
&SecurityInfo,
pSecurityDescriptor,
0,
&cb
);
if ( ( fResult == FALSE ) && ( cb > 0 ) )
{
assert( ( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) ||
( GetLastError() == STATUS_BUFFER_TOO_SMALL ) );
pSecurityDescriptor = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR, cb );
if ( pSecurityDescriptor == NULL )
{
return( ERROR_OUTOFMEMORY );
}
fResult = GetUserObjectSecurity(
m_hWindowStation,
&SecurityInfo,
pSecurityDescriptor,
cb,
&cb
);
}
else
{
assert( fResult == FALSE );
return( GetLastError() );
}
if ( fResult == TRUE )
{
*ppSecurityDescriptor = pSecurityDescriptor;
}
else
{
return( GetLastError() );
}
return( ERROR_SUCCESS );
}
//+---------------------------------------------------------------------------
//
// Member: CWindowContext::SetWindowRights, public
//
// Synopsis: set the window security descriptor
//
//----------------------------------------------------------------------------
DWORD
CWindowContext::SetWindowRights (
SECURITY_INFORMATION SecurityInfo,
PSECURITY_DESCRIPTOR pSecurityDescriptor
)
{
assert( m_hWindowStation != NULL );
if ( SetUserObjectSecurity(
m_hWindowStation,
&SecurityInfo,
pSecurityDescriptor
) == FALSE )
{
return( GetLastError() );
}
return( ERROR_SUCCESS );
}
//
// Functions from window.h which dispatch unto the CWindowContext class
//
DWORD
MartaAddRefWindowContext(
IN MARTA_CONTEXT Context
)
{
return( ( (CWindowContext *)Context )->AddRef() );
}
DWORD
MartaCloseWindowContext(
IN MARTA_CONTEXT Context
)
{
return( ( (CWindowContext *)Context )->Release() );
}
DWORD
MartaGetWindowProperties(
IN MARTA_CONTEXT Context,
IN OUT PMARTA_OBJECT_PROPERTIES pProperties
)
{
return( ( (CWindowContext *)Context )->GetWindowProperties( pProperties ) );
}
DWORD
MartaGetWindowTypeProperties(
IN OUT PMARTA_OBJECT_TYPE_PROPERTIES pProperties
)
{
if ( pProperties->cbSize < sizeof( MARTA_OBJECT_TYPE_PROPERTIES ) )
{
return( ERROR_INVALID_PARAMETER );
}
assert( pProperties->dwFlags == 0 );
return( ERROR_SUCCESS );
}
DWORD
MartaGetWindowRights(
IN MARTA_CONTEXT Context,
IN SECURITY_INFORMATION SecurityInfo,
OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor
)
{
return( ( (CWindowContext *)Context )->GetWindowRights(
SecurityInfo,
ppSecurityDescriptor
) );
}
DWORD
MartaOpenWindowNamedObject(
IN LPCWSTR pObjectName,
IN ACCESS_MASK AccessMask,
OUT PMARTA_CONTEXT pContext
)
{
DWORD Result;
CWindowContext* pWindowContext;
pWindowContext = new CWindowContext;
if ( pWindowContext == NULL )
{
return( ERROR_OUTOFMEMORY );
}
Result = pWindowContext->InitializeByName( pObjectName, AccessMask );
if ( Result != ERROR_SUCCESS )
{
pWindowContext->Release();
return( Result );
}
*pContext = pWindowContext;
return( ERROR_SUCCESS );
}
DWORD
MartaOpenWindowHandleObject(
IN HANDLE Handle,
IN ACCESS_MASK AccessMask,
OUT PMARTA_CONTEXT pContext
)
{
DWORD Result;
CWindowContext* pWindowContext;
pWindowContext = new CWindowContext;
if ( pWindowContext == NULL )
{
return( ERROR_OUTOFMEMORY );
}
Result = pWindowContext->InitializeByHandle( Handle );
if ( Result != ERROR_SUCCESS )
{
pWindowContext->Release();
return( Result );
}
*pContext = pWindowContext;
return( ERROR_SUCCESS );
}
DWORD
MartaSetWindowRights(
IN MARTA_CONTEXT Context,
IN SECURITY_INFORMATION SecurityInfo,
IN PSECURITY_DESCRIPTOR pSecurityDescriptor
)
{
return( ( (CWindowContext *)Context )->SetWindowRights(
SecurityInfo,
pSecurityDescriptor
) );
}