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

383 lines
9.7 KiB
C++

//+---------------------------------------------------------------------------
//
// 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 <aclpch.hxx>
#pragma hdrstop
extern "C" {
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
}
#include <windows.h>
#include <lmshare.h>
#include <lmcons.h>
#include <lmsctx.h>
#include <svcctx.h>
//+---------------------------------------------------------------------------
//
// 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
) );
}