//+--------------------------------------------------------------------------- // // Microsoft Windows NT Security // Copyright (C) Microsoft Corporation, 1997 - 1998 // // File: lmsctx.cpp // // Contents: Implementation of CLMShareContext and NT Marta LanMan Functions // // History: 3-31-1999 kirtd Created // //---------------------------------------------------------------------------- #include #pragma hdrstop extern "C" { #include #include #include } #include #include #include #include #include //+--------------------------------------------------------------------------- // // Member: CLMShareContext::CLMShareContext, public // // Synopsis: Constructor // //---------------------------------------------------------------------------- CLMShareContext::CLMShareContext () { m_cRefs = 1; m_pwszMachine = NULL; m_pwszShare = NULL; } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::~CLMShareContext, public // // Synopsis: Destructor // //---------------------------------------------------------------------------- CLMShareContext::~CLMShareContext () { if ( m_pwszMachine != NULL ) { delete m_pwszMachine; } if ( m_pwszShare != NULL ) { delete m_pwszShare; } assert( m_cRefs == 0 ); } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::InitializeByName, public // // Synopsis: initialize the context given the name of the lanman share // //---------------------------------------------------------------------------- DWORD CLMShareContext::InitializeByName (LPCWSTR pObjectName, ACCESS_MASK AccessMask) { return( LMShareContextParseLMShareName( pObjectName, &m_pwszMachine, &m_pwszShare ) ); } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::AddRef, public // // Synopsis: add a reference to the context // //---------------------------------------------------------------------------- DWORD CLMShareContext::AddRef () { m_cRefs += 1; return( m_cRefs ); } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::Release, public // // Synopsis: release a reference to the context // //---------------------------------------------------------------------------- DWORD CLMShareContext::Release () { m_cRefs -= 1; if ( m_cRefs == 0 ) { delete this; return( 0 ); } return( m_cRefs ); } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::GetLMShareProperties, public // // Synopsis: get properties about the context // //---------------------------------------------------------------------------- DWORD CLMShareContext::GetLMShareProperties ( PMARTA_OBJECT_PROPERTIES pObjectProperties ) { if ( pObjectProperties->cbSize < sizeof( MARTA_OBJECT_PROPERTIES ) ) { return( ERROR_INVALID_PARAMETER ); } assert( pObjectProperties->dwFlags == 0 ); return( ERROR_SUCCESS ); } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::GetLMShareRights, public // // Synopsis: get the LMShare security descriptor // //---------------------------------------------------------------------------- DWORD CLMShareContext::GetLMShareRights ( SECURITY_INFORMATION SecurityInfo, PSECURITY_DESCRIPTOR* ppSecurityDescriptor ) { DWORD Result; PSHARE_INFO_502 psi = NULL; PISECURITY_DESCRIPTOR pisd = NULL; PSECURITY_DESCRIPTOR psd = NULL; DWORD cb = 0; assert( m_pwszShare != NULL ); Result = NetShareGetInfo( m_pwszMachine, m_pwszShare, 502, (PBYTE *)&psi ); if ( Result == ERROR_SUCCESS ) { if ( psi->shi502_security_descriptor == NULL ) { *ppSecurityDescriptor = NULL; Result = ERROR_SUCCESS; goto Cleanup; } pisd = (PISECURITY_DESCRIPTOR)psi->shi502_security_descriptor; if ( pisd->Control & SE_SELF_RELATIVE ) { cb = GetSecurityDescriptorLength( psi->shi502_security_descriptor ); psd = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR, cb ); if ( psd == NULL ) { Result = ERROR_OUTOFMEMORY; goto Cleanup; } memcpy( psd, psi->shi502_security_descriptor, cb ); } else { if ( MakeSelfRelativeSD( psi->shi502_security_descriptor, NULL, &cb ) == FALSE ) { if ( cb > 0 ) { psd = (PSECURITY_DESCRIPTOR)LocalAlloc( LPTR, cb ); if ( psd != NULL ) { if ( MakeSelfRelativeSD( psi->shi502_security_descriptor, psd, &cb ) == FALSE ) { LocalFree( psd ); Result = GetLastError(); goto Cleanup; } } else { Result = ERROR_OUTOFMEMORY; goto Cleanup; } } else { Result = GetLastError(); goto Cleanup; } } else { assert( FALSE && "Should not get here!" ); Result = ERROR_INVALID_PARAMETER; goto Cleanup; } } *ppSecurityDescriptor = psd; } Cleanup: if (psi != NULL) { NetApiBufferFree(psi); } return( Result ); } //+--------------------------------------------------------------------------- // // Member: CLMShareContext::SetLMShareRights, public // // Synopsis: set the window security descriptor // //---------------------------------------------------------------------------- DWORD CLMShareContext::SetLMShareRights ( SECURITY_INFORMATION SecurityInfo, PSECURITY_DESCRIPTOR pSecurityDescriptor ) { DWORD Result; SHARE_INFO_1501 si; si.shi1501_reserved = 0; si.shi1501_security_descriptor = pSecurityDescriptor; Result = NetShareSetInfo( m_pwszMachine, m_pwszShare, 1501, (PBYTE)&si, NULL ); return( Result ); } //+--------------------------------------------------------------------------- // // Function: LMShareContextParseLMShareName // // Synopsis: parse the service name and machine // //---------------------------------------------------------------------------- DWORD LMShareContextParseLMShareName ( LPCWSTR pwszName, LPWSTR* ppMachine, LPWSTR* ppLMShare ) { return( StandardContextParseName( pwszName, ppMachine, ppLMShare ) ); } // // Functions from LMShare.h which dispatch unto the CLMShareContext class // DWORD MartaAddRefLMShareContext( IN MARTA_CONTEXT Context ) { return( ( (CLMShareContext *)Context )->AddRef() ); } DWORD MartaCloseLMShareContext( IN MARTA_CONTEXT Context ) { return( ( (CLMShareContext *)Context )->Release() ); } DWORD MartaGetLMShareProperties( IN MARTA_CONTEXT Context, IN OUT PMARTA_OBJECT_PROPERTIES pProperties ) { return( ( (CLMShareContext *)Context )->GetLMShareProperties( pProperties ) ); } DWORD MartaGetLMShareTypeProperties( 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 MartaGetLMShareRights( IN MARTA_CONTEXT Context, IN SECURITY_INFORMATION SecurityInfo, OUT PSECURITY_DESCRIPTOR * ppSecurityDescriptor ) { return( ( (CLMShareContext *)Context )->GetLMShareRights( SecurityInfo, ppSecurityDescriptor ) ); } DWORD MartaOpenLMShareNamedObject( IN LPCWSTR pObjectName, IN ACCESS_MASK AccessMask, OUT PMARTA_CONTEXT pContext ) { DWORD Result; CLMShareContext* pLMShareContext; pLMShareContext = new CLMShareContext; if ( pLMShareContext == NULL ) { return( ERROR_OUTOFMEMORY ); } Result = pLMShareContext->InitializeByName( pObjectName, AccessMask ); if ( Result != ERROR_SUCCESS ) { pLMShareContext->Release(); return( Result ); } *pContext = pLMShareContext; return( ERROR_SUCCESS ); } DWORD MartaSetLMShareRights( IN MARTA_CONTEXT Context, IN SECURITY_INFORMATION SecurityInfo, IN PSECURITY_DESCRIPTOR pSecurityDescriptor ) { return( ( (CLMShareContext *)Context )->SetLMShareRights( SecurityInfo, pSecurityDescriptor ) ); }