//+--------------------------------------------------------------------------- // // 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 #pragma hdrstop #include //+--------------------------------------------------------------------------- // // 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 ) ); }