Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

575 lines
13 KiB

/******************************************************************
ConnectionToShare.CPP -- C provider class implementation
Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
Description: Association between Connection and Share class
******************************************************************/
#include "precomp.h"
#include "ConnectionToShare.h"
CConnectionToShare MyCConnectionToShare (
PROVIDER_NAME_CONNECTIONTOSHARE ,
Namespace
) ;
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::CConnectionToShare
*
* DESCRIPTION : Constructor
*
*****************************************************************************/
CConnectionToShare :: CConnectionToShare (
LPCWSTR lpwszName,
LPCWSTR lpwszNameSpace
) : Provider ( lpwszName , lpwszNameSpace )
{
}
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::~CConnectionToShare
*
* DESCRIPTION : Destructor
*
*****************************************************************************/
CConnectionToShare :: ~CConnectionToShare ()
{
}
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::EnumerateInstances
*
* DESCRIPTION : Returns all the instances of this class.
*
*****************************************************************************/
HRESULT CConnectionToShare :: EnumerateInstances (
MethodContext *pMethodContext,
long lFlags
)
{
HRESULT hRes = WBEM_S_NO_ERROR ;
DWORD dwPropertiesReq = CONNECTIONSTOSHARE_ALL_PROPS;
CHString t_ComputerName;
CHString t_ShareName;
hRes = EnumConnectionInfo (
t_ComputerName,
t_ShareName,
pMethodContext,
dwPropertiesReq
) ;
return hRes ;
}
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::GetObject
*
* DESCRIPTION : Find a single instance based on the key properties for the
* class.
*
*****************************************************************************/
HRESULT CConnectionToShare :: GetObject (
CInstance *pInstance,
long lFlags ,
CFrameworkQuery &Query
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
CHString t_Key1 ;
CHString t_Key2;
if ( pInstance->GetCHString ( IDS_Connection , t_Key1 ) == FALSE )
{
hRes = WBEM_E_INVALID_PARAMETER ;
}
if ( SUCCEEDED ( hRes ) )
{
if ( pInstance->GetCHString ( IDS_Resource , t_Key2 ) == FALSE )
{
hRes = WBEM_E_INVALID_PARAMETER ;
}
}
// here we will need to unparse the keys and check if the instance exist
// We can take the resource (share) key and enumerate all the shares,
// check if the share exists, if the share exists only for that share enumerate connections
// and if the connection user and computer enumerate the connections, if it is found set the keys
// otherwise return not found
CHString t_Share;
hRes = GetShareKeyVal ( t_Key2, t_Share );
if ( SUCCEEDED ( hRes ) )
{
CHString t_ComputerName;
CHString t_ShareName;
CHString t_UserName;
hRes = GetConnectionsKeyVal ( t_Key1, t_ComputerName, t_ShareName, t_UserName );
if ( SUCCEEDED ( hRes ) )
{
// now check the shares in t_key1 and t_key should match
if ( _wcsicmp ( t_Key2, t_ShareName ) == 0 )
{
#ifdef NTONLY
hRes = FindAndSetNTConnection ( t_ShareName, t_ComputerName, t_UserName,
0, pInstance, NoOp );
#endif
#if 0
#ifdef WIN9XONLY
hRes = FindAndSet9XConnection ( t_ShareName, t_ComputerName, t_UserName,
0, pInstance, NoOp );
#endif
#endif
}
}
}
return hRes ;
}
#ifdef NTONLY
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::EnumNTConnectionsFromComputerToShare
*
* DESCRIPTION : Enumerates all Connections from a computer to share
*
*****************************************************************************/
HRESULT CConnectionToShare :: EnumNTConnectionsFromComputerToShare (
CHString a_ComputerName,
CHString a_ShareName,
MethodContext *pMethodContext,
DWORD dwPropertiesReq
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
NET_API_STATUS t_Status = NERR_Success;
DWORD dwNoOfEntriesRead = 0;
DWORD dwTotalConnections = 0;
DWORD dwResumeHandle = 0;
CONNECTION_INFO *pBuf = NULL;
CONNECTION_INFO *pTmpBuf = NULL;
LPWSTR t_ComputerName = NULL;
if ( a_ComputerName && a_ComputerName[0] != L'\0' )
{
//let's skip the \\ chars
t_ComputerName = a_ComputerName + 2;
}
// ShareName and COmputer Name both cannot be null at the same time
while ( TRUE )
{
if ( ! a_ShareName.IsEmpty())
{
t_Status = NetConnectionEnum(
NULL,
a_ShareName.GetBuffer ( a_ShareName.GetLength() + 1),
1,
(LPBYTE *) &pBuf,
-1,
&dwNoOfEntriesRead,
&dwTotalConnections,
&dwResumeHandle
);
}
else
if ( ! a_ComputerName.IsEmpty() )
{
t_Status = NetConnectionEnum(
NULL,
a_ComputerName.GetBuffer ( a_ShareName.GetLength() + 1 ),
1,
(LPBYTE *) &pBuf,
-1,
&dwNoOfEntriesRead,
&dwTotalConnections,
&dwResumeHandle
);
}
if ( t_Status == NERR_Success )
{
if ( dwNoOfEntriesRead == 0 )
{
break;
}
else if ( dwNoOfEntriesRead > 0 )
{
try
{
pTmpBuf = pBuf;
for ( int i = 0; i < dwNoOfEntriesRead; i++, pTmpBuf++ )
{
CInstancePtr pInstance ( CreateNewInstance ( pMethodContext ), FALSE );
hRes = LoadInstance ( pInstance, a_ShareName, t_ComputerName ? t_ComputerName : a_ComputerName, pTmpBuf, dwPropertiesReq );
if ( SUCCEEDED ( hRes ) )
{
hRes = pInstance->Commit();
if ( FAILED ( hRes ) )
{
break;
}
}
else
{
break;
}
}
}
catch ( ... )
{
NetApiBufferFree ( pBuf );
pBuf = NULL;
throw;
}
NetApiBufferFree ( pBuf );
pBuf = NULL;
}
}
else
{
if ( t_Status != ERROR_MORE_DATA )
{
if ( t_Status == ERROR_ACCESS_DENIED )
{
hRes = WBEM_E_ACCESS_DENIED;
}
else
{
if ( t_Status == ERROR_NOT_ENOUGH_MEMORY )
{
hRes = WBEM_E_OUT_OF_MEMORY;
}
else
{
hRes = WBEM_E_FAILED;
}
}
break;
}
}
}
return hRes;
}
#endif
#if 0
#ifdef WIN9XONLY
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::Enum9XConnectionsFromComputerToShare
*
* DESCRIPTION : Enumerating all the connections made from a computer to
* a given share
*
*****************************************************************************/
HRESULT CConnectionToShare :: Enum9XConnectionsFromComputerToShare (
CHString a_ComputerName,
CHString a_ShareName,
MethodContext *pMethodContext,
DWORD dwPropertiesReq
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
NET_API_STATUS t_Status = NERR_Success;
DWORD dwNoOfEntriesRead = 0;
DWORD dwTotalConnections = 0;
BOOL bFound = FALSE;
CONNECTION_INFO * pBuf = NULL;
CONNECTION_INFO * pTmpBuf = NULL;
DWORD dwBufferSize = MAX_ENTRIES * sizeof( CONNECTION_INFO );
pBuf = ( CONNECTION_INFO *) malloc(dwBufferSize);
if ( pBuf != NULL )
{
try
{
t_Status = NetConnectionEnum(
NULL,
(char FAR *) ( a_ShareName.GetBuffer ( a_ShareName.GetLength () + 1 )), // ShareName
1,
(char *) pBuf,
( unsigned short )dwBufferSize,
( unsigned short *) &dwNoOfEntriesRead,
( unsigned short *) &dwTotalConnections
);
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
// otherwise we are not to frr the buffer, we have use it and then free the buffer.
if ( ( dwNoOfEntriesRead < dwTotalConnections ) && ( t_Status == ERROR_MORE_DATA ) )
{
free ( pBuf );
pBuf = NULL;
pBuf = ( CONNECTION_INFO *) malloc( dwTotalConnections );
if ( pBuf != NULL )
{
try
{
t_Status = NetConnectionEnum(
NULL,
(char FAR *) ( a_ShareName.GetBuffer ( a_ShareName.GetLength () + 1 )), // ShareName
1,
(char *) pBuf,
( unsigned short )dwBufferSize,
( unsigned short *) &dwNoOfEntriesRead,
( unsigned short *) &dwTotalConnections
);
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
// We need to use the buffer before we free it
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
}
// The buffer is yet to be used
if ( ( t_Status == NERR_Success ) && ( dwNoOfEntriesRead == dwTotalConnections ) )
{
// use the buffer first and then free
if ( pBuf != NULL )
{
try
{
pTmpBuf = pBuf;
for ( int i = 0; i < dwNoOfEntriesRead; i++, pTmpBuf ++)
{
CInstancePtr pInstance ( CreateNewInstance ( pMethodContext ), FALSE );
hRes = LoadInstance ( pInstance, a_ShareName, a_ComputerName, pTmpBuf, dwPropertiesReq );
if ( SUCCEEDED ( hRes ) )
{
hRes = pInstance->Commit();
}
}
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
// finally free the buffer
free (pBuf );
pBuf = NULL;
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
}
else
{
hRes = WBEM_E_FAILED;
}
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
return hRes;
}
#endif
#endif
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::LoadInstance
*
* DESCRIPTION : Loads the Given Instance
*
*****************************************************************************/
HRESULT CConnectionToShare :: LoadInstance (
CInstance *pInstance,
CHString a_Share,
CHString a_Computer,
CONNECTION_INFO *pBuf,
DWORD dwPropertiesReq
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
LPWSTR ObjPath;
LPWSTR ResObjPath;
CHString t_NetName ( pBuf->coni1_netname );
if ( ! a_Share.IsEmpty() )
{
hRes = MakeObjectPath ( ObjPath, PROVIDER_NAME_CONNECTION, IDS_ComputerName, t_NetName.GetBuffer ( t_NetName.GetLength () + 1) );
if ( SUCCEEDED ( hRes ) )
{
hRes = AddToObjectPath ( ObjPath, IDS_ShareName, a_Share.GetBuffer (a_Share.GetLength () + 1) );
}
if ( SUCCEEDED ( hRes ) )
{
hRes = MakeObjectPath ( ResObjPath, PROVIDER_SHARE, IDS_ShareKeyName, a_Share.GetBuffer (a_Share.GetLength () + 1) );
}
}
else
{
hRes = MakeObjectPath ( ObjPath, PROVIDER_NAME_CONNECTION, IDS_ComputerName, a_Computer.GetBuffer ( a_Computer.GetLength () +1));
if ( SUCCEEDED ( hRes ) )
{
hRes = AddToObjectPath ( ObjPath, IDS_ShareName, t_NetName.GetBuffer ( t_NetName.GetLength () + 1) );
}
if ( SUCCEEDED ( hRes ) )
{
MakeObjectPath ( ResObjPath, PROVIDER_SHARE, IDS_ShareKeyName, t_NetName.GetBuffer ( t_NetName.GetLength () + 1) );
}
}
CHString t_UserName ( pBuf->coni1_username );
if ( SUCCEEDED ( hRes ) )
{
hRes = AddToObjectPath ( ObjPath, IDS_UserName, t_UserName.GetBuffer ( t_UserName.GetLength () + 1 ) );
}
if ( SUCCEEDED ( hRes ) )
{
if ( pInstance->SetCHString ( IDS_Connection, ObjPath ) == FALSE )
{
hRes = WBEM_E_PROVIDER_FAILURE;
}
}
if ( SUCCEEDED ( hRes ) )
{
if ( pInstance->SetCHString ( IDS_Resource, ResObjPath ) == FALSE )
{
hRes = WBEM_E_PROVIDER_FAILURE;
}
}
return hRes;
}
/*****************************************************************************
*
* FUNCTION : CConnectionToShare::GetShareKeyVal
*
* DESCRIPTION : Parsing the key to get the share key value
*
*****************************************************************************/
HRESULT CConnectionToShare::GetShareKeyVal ( CHString a_Key, CHString &a_Share )
{
HRESULT hRes = WBEM_S_NO_ERROR;
ParsedObjectPath *t_ShareObjPath;
CObjectPathParser t_PathParser;
if ( t_PathParser.Parse( a_Key.GetBuffer ( a_Key.GetLength () + 1 ), &t_ShareObjPath ) == t_PathParser.NoError )
{
try
{
if ( t_ShareObjPath->m_dwNumKeys == 1 )
{
a_Share = t_ShareObjPath->GetKeyString();
if ( ! a_Share.IsEmpty() )
{
CHStringArray t_aShares;
#ifdef NTONLY
hRes = GetNTShares ( t_aShares );
#endif
#if 0
#ifdef WIN9XONLY
hRes = Get9XShares ( t_aShares );
#endif
#endif
if ( SUCCEEDED ( hRes ) )
{
int i = 0;
for ( i = 0; i < t_aShares.GetSize(); i++ )
{
if ( _wcsicmp ( a_Share, t_aShares.GetAt(i) ) == 0 )
{
break;
}
}
if ( i >= t_aShares.GetSize() )
{
hRes = WBEM_E_NOT_FOUND;
}
}
}
}
else
{
hRes = WBEM_E_INVALID_PARAMETER;
}
}
catch ( ... )
{
delete t_ShareObjPath;
throw;
}
delete t_ShareObjPath;
}
else
{
hRes = WBEM_E_INVALID_PARAMETER;
}
return hRes;
}