|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows NT Security
// Copyright (C) Microsoft Corporation, 1997 - 1998
//
// File: prtctx.cpp
//
// Contents: Implementation of CPrinterContext and NT Marta Printer Functions
//
// History: 3-31-1999 kirtd Created
//
//----------------------------------------------------------------------------
#if 0
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::CPrinterContext, public
//
// Synopsis: Constructor
//
//----------------------------------------------------------------------------
CPrinterContext::CPrinterContext () { m_cRefs = 1; m_hPrinter = NULL; m_fNameInitialized = FALSE; }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::~CPrinterContext, public
//
// Synopsis: Destructor
//
//----------------------------------------------------------------------------
CPrinterContext::~CPrinterContext () { if ( ( m_hPrinter != NULL ) && ( m_fNameInitialized == TRUE ) ) { ClosePrinter( m_hPrinter ); }
assert( m_cRefs == 0 ); }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::InitializeByName, public
//
// Synopsis: initialize the context given the name of the printer
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::InitializeByName (LPCWSTR pObjectName, ACCESS_MASK AccessMask) { PRINTER_DEFAULTSW PrinterDefaults;
PrinterDefaults.pDatatype = NULL; PrinterDefaults.pDevMode = NULL; PrinterDefaults.DesiredAccess = AccessMask;
if ( OpenPrinterW( (LPWSTR)pObjectName, &m_hPrinter, &PrinterDefaults ) == FALSE ) { return( GetLastError() ); }
m_fNameInitialized = TRUE;
return( ERROR_SUCCESS ); }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::InitializeByHandle, public
//
// Synopsis: initialize the context given a printer handle
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::InitializeByHandle (HANDLE Handle) { m_hPrinter = Handle; assert( m_fNameInitialized == FALSE );
return( ERROR_SUCCESS ); }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::AddRef, public
//
// Synopsis: add a reference to the context
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::AddRef () { m_cRefs += 1; return( m_cRefs ); }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::Release, public
//
// Synopsis: release a reference to the context
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::Release () { m_cRefs -= 1;
if ( m_cRefs == 0 ) { delete this; return( 0 ); }
return( m_cRefs ); }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::GetPrinterProperties, public
//
// Synopsis: get properties about the context
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::GetPrinterProperties ( PMARTA_OBJECT_PROPERTIES pObjectProperties ) { if ( pObjectProperties->cbSize < sizeof( MARTA_OBJECT_PROPERTIES ) ) { return( ERROR_INVALID_PARAMETER ); }
assert( pObjectProperties->dwFlags == 0 );
return( ERROR_SUCCESS ); }
//+---------------------------------------------------------------------------
//
// Member: CPrinterContext::GetPrinterRights, public
//
// Synopsis: get the Printer security descriptor
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::GetPrinterRights ( SECURITY_INFORMATION SecurityInfo, PSECURITY_DESCRIPTOR* ppSecurityDescriptor ) { PISECURITY_DESCRIPTOR pisd = NULL; PSECURITY_DESCRIPTOR psd = NULL; DWORD cb = 0; PPRINTER_INFO_3 pPrinterInfo = NULL;
assert( m_hPrinter != NULL );
if ( ( GetPrinterW( m_hPrinter, 3, (LPBYTE)pPrinterInfo, cb, &cb ) == FALSE ) && ( cb > 0 ) ) { pPrinterInfo = (PPRINTER_INFO_3)new BYTE [ cb ]; if ( pPrinterInfo != NULL ) { if ( GetPrinterW( m_hPrinter, 3, (LPBYTE)pPrinterInfo, cb, &cb ) == FALSE ) { delete pPrinterInfo; return( GetLastError() ); } } else { return( E_OUTOFMEMORY ); } } else { return( GetLastError() ); }
pisd = (PISECURITY_DESCRIPTOR)pPrinterInfo->pSecurityDescriptor; if ( pisd->Control & SE_SELF_RELATIVE ) { cb = GetSecurityDescriptorLength( pPrinterInfo->pSecurityDescriptor ); psd = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR, cb ); if ( psd == NULL ) { return( ERROR_OUTOFMEMORY ); }
memcpy( psd, pPrinterInfo->pSecurityDescriptor, cb ); } else { if ( MakeSelfRelativeSD( pPrinterInfo->pSecurityDescriptor, NULL, &cb ) == FALSE ) { if ( cb > 0 ) { psd = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR, cb ); if ( psd != NULL ) { if ( MakeSelfRelativeSD( pPrinterInfo->pSecurityDescriptor, psd, &cb ) == FALSE ) { LocalFree( psd ); return( GetLastError() ); } } } else { return( GetLastError() ); } } }
*ppSecurityDescriptor = psd;
return( ERROR_SUCCESS ); }
//+---------------------------------------------------------------------------
//
// Member: CServiceContext::SetPrinterRights, public
//
// Synopsis: set the window security descriptor
//
//----------------------------------------------------------------------------
DWORD CPrinterContext::SetPrinterRights ( SECURITY_INFORMATION SecurityInfo, PSECURITY_DESCRIPTOR pSecurityDescriptor ) { PRINTER_INFO_3 PrinterInfo;
assert( m_hPrinter != NULL );
PrinterInfo.pSecurityDescriptor = pSecurityDescriptor;
if ( SetPrinterW( m_hPrinter, 3, (LPBYTE)&PrinterInfo, 0 ) == FALSE ) { return( GetLastError() ); }
return( ERROR_SUCCESS ); }
//
// Functions from printer.h which dispatch unto the CPrinterContext class
//
DWORD MartaAddRefPrinterContext( IN MARTA_CONTEXT Context ) { return( ( (CPrinterContext *)Context )->AddRef() ); }
DWORD MartaClosePrinterContext( IN MARTA_CONTEXT Context ) { return( ( (CPrinterContext *)Context )->Release() ); }
DWORD MartaGetPrinterProperties( IN MARTA_CONTEXT Context, IN OUT PMARTA_OBJECT_PROPERTIES pProperties ) { return( ( (CPrinterContext *)Context )->GetPrinterProperties( pProperties ) ); }
DWORD MartaGetPrinterTypeProperties( 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 MartaGetPrinterRights( IN MARTA_CONTEXT Context, IN SECURITY_INFORMATION SecurityInfo, OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor ) { return( ( (CPrinterContext *)Context )->GetPrinterRights( SecurityInfo, ppSecurityDescriptor ) ); }
DWORD MartaOpenPrinterNamedObject( IN LPCWSTR pObjectName, IN ACCESS_MASK AccessMask, OUT PMARTA_CONTEXT pContext ) { DWORD Result; CPrinterContext* pPrinterContext;
pPrinterContext = new CPrinterContext; if ( pPrinterContext == NULL ) { return( ERROR_OUTOFMEMORY ); }
Result = pPrinterContext->InitializeByName( pObjectName, AccessMask ); if ( Result != ERROR_SUCCESS ) { pPrinterContext->Release(); return( Result ); }
*pContext = pPrinterContext; return( ERROR_SUCCESS ); }
DWORD MartaOpenPrinterHandleObject( IN HANDLE Handle, OUT PMARTA_CONTEXT pContext ) { DWORD Result; CPrinterContext* pPrinterContext;
pPrinterContext = new CPrinterContext; if ( pPrinterContext == NULL ) { return( ERROR_OUTOFMEMORY ); }
Result = pPrinterContext->InitializeByHandle( Handle ); if ( Result != ERROR_SUCCESS ) { pPrinterContext->Release(); return( Result ); }
*pContext = pPrinterContext; return( ERROR_SUCCESS ); }
DWORD MartaSetPrinterRights( IN MARTA_CONTEXT Context, IN SECURITY_INFORMATION SecurityInfo, IN PSECURITY_DESCRIPTOR pSecurityDescriptor ) { return( ( (CPrinterContext *)Context )->SetPrinterRights( SecurityInfo, pSecurityDescriptor ) ); }
#endif
|