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.
 
 
 
 
 
 

824 lines
18 KiB

/******************************************************************
ConnShare.cpp-- Implementation of base class from which ConnectionToShare
ConnectionToSession and Connection classes are derived
// Copyright (c) 2000-2001 Microsoft Corporation, All Rights Reserved
*******************************************************************/
#include "precomp.h"
#include "connshare.h"
/*****************************************************************************
*
* FUNCTION : CConnShare::CConnShare
*
* DESCRIPTION : Constructor
*
*****************************************************************************/
CConnShare :: CConnShare ( )
{
}
/*****************************************************************************
*
* FUNCTION : CConnShare::~CConnShare
*
* DESCRIPTION : Destructor
*
*****************************************************************************/
CConnShare :: ~ CConnShare ( )
{
}
#ifdef NTONLY
/*****************************************************************************
*
* FUNCTION : CConnShare::GetNTShares
*
* DESCRIPTION : Enumerates all the Shares on NT
*
*****************************************************************************/
HRESULT CConnShare :: GetNTShares ( CHStringArray &t_Shares )
{
HRESULT hRes = WBEM_S_NO_ERROR;
NET_API_STATUS t_Status = NERR_Success;
DWORD dwNoOfEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwResumeHandle = 0;
PSHARE_INFO_0 pBuf, pTempBuf;
while ( true )
{
t_Status = NetShareEnum (
NULL, //Server
0, //level
(LPBYTE *) &pBuf,
-1, // Preferred Max Length
&dwNoOfEntriesRead,
&dwTotalEntries,
&dwResumeHandle
);
if (( t_Status == NERR_Success ) || (t_Status == ERROR_MORE_DATA))
{
try
{
pTempBuf = pBuf;
for( DWORD i = 0; i < dwNoOfEntriesRead; i++, pTempBuf++ )
{
t_Shares.Add ( pTempBuf->shi0_netname );
}
}
catch ( ... )
{
NetApiBufferFree( pBuf );
pBuf = NULL;
throw;
}
NetApiBufferFree( pBuf );
pBuf = NULL;
}
if ( t_Status != ERROR_MORE_DATA )
{
if ( t_Status == NERR_Success )
{
hRes = WBEM_S_NO_ERROR;
}
else
{
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;
}
/*****************************************************************************
*
* FUNCTION : CConnShare::FindAndSetNTConnection
*
* DESCRIPTION : Finds the instance and if presnt does an appropriate operation.
*
*****************************************************************************/
HRESULT CConnShare :: FindAndSetNTConnection (
LPWSTR t_ShareName,
LPCWSTR t_NetName,
LPCWSTR t_UserName,
DWORD dwPropertiesReq,
CInstance *pInstance,
DWORD eOperation
)
{
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 *pTempBuf = NULL;
while ( true )
{
t_Status = NetConnectionEnum(
NULL,
t_ShareName, // ShareName
1,
(LPBYTE *) &pBuf,
-1,
&dwNoOfEntriesRead,
&dwTotalConnections,
&dwResumeHandle
);
if ( ( ( t_Status == NERR_Success ) && ( dwNoOfEntriesRead == 0 ) ) ||
( ( t_Status != NERR_Success ) && ( t_Status != ERROR_MORE_DATA ) ) )
{
hRes = WBEM_E_NOT_FOUND;
break;
}
try
{
pTempBuf = pBuf;
BOOL bFound = FALSE;
for ( DWORD dwConnIndex = 0 ; dwConnIndex < dwNoOfEntriesRead ; dwConnIndex ++, pTempBuf++ )
{
if ( pTempBuf->coni1_netname &&
pTempBuf->coni1_username &&
( _wcsicmp ( t_NetName, pTempBuf->coni1_netname ) == 0 ) &&
( _wcsicmp (t_UserName, pTempBuf->coni1_username ) == 0 ) )
{
bFound = TRUE;
break ;
}
}
if ( bFound )
{
// We are not to free the buff in this loop, but free it after using this buffer
break;
}
if ( t_Status != ERROR_MORE_DATA )
{
hRes = WBEM_E_NOT_FOUND;
NetApiBufferFree ( pBuf );
pBuf = NULL;
break;
}
}
catch ( ... )
{
NetApiBufferFree ( pBuf );
pBuf = NULL;
throw;
}
NetApiBufferFree ( pBuf );
pBuf = NULL;
}
if ( SUCCEEDED ( hRes ) )
{
try
{
switch ( eOperation )
{
case Get: hRes = LoadInstance (
pInstance,
t_ShareName,
t_NetName,
pTempBuf,
dwPropertiesReq
);
case NoOp: break; //do nothing
default: hRes = WBEM_E_INVALID_PARAMETER; break;
}
}
catch ( ... )
{
NetApiBufferFree( pBuf );
pBuf = NULL;
throw;
}
NetApiBufferFree( pBuf );
pBuf = NULL;
}
return hRes;
}
#endif
#if 0
#ifdef WIN9XONLY
/*****************************************************************************
*
* FUNCTION : CConnShare::Get9XShares
*
* DESCRIPTION : Enumerates all the Shares on WIN9X
*
*****************************************************************************/
HRESULT CConnShare :: Get9XShares ( CHStringArray &t_Shares )
{
HRESULT hRes = WBEM_S_NO_ERROR;
DWORD t_Status = NERR_Success;
DWORD dwNoOfEntriesRead = 0;
DWORD dwTotalEntries = 0;
struct share_info_1* pBuf = NULL;
struct share_info_1* pTmpBuf = NULL;
DWORD dwBufferSize = MAX_ENTRIES * sizeof( struct share_info_0 );
pBuf = ( struct share_info_1 *) malloc ( dwBufferSize );
if ( pBuf != NULL )
{
try
{
t_Status = NetShareEnum (
NULL,
1,
(char FAR *)pBuf,
( unsigned short ) dwBufferSize,
( unsigned short *) &dwNoOfEntriesRead,
( unsigned short *) &dwTotalEntries
);
if ( dwNoOfEntriesRead > 0 )
{
pTmpBuf = pBuf;
CHString t_NetName;
for( DWORD i = 0; i < dwNoOfEntriesRead; i++, pTmpBuf++ )
{
t_NetName = pTmpBuf->shi1_netname;
t_Shares.Add ( t_NetName );
}
}
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
free ( pBuf );
pBuf = NULL;
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
if ( ( dwNoOfEntriesRead < dwTotalEntries ) || ( t_Status == ERROR_MORE_DATA ) )
{
DWORD oldENtriesRead = dwNoOfEntriesRead;
pBuf = ( struct share_info_1 *) malloc ( dwTotalEntries );
if ( pBuf != NULL )
{
try
{
t_Status = NetShareEnum (
NULL,
1,
(char FAR *)pBuf,
( unsigned short ) dwBufferSize,
( unsigned short *) &dwNoOfEntriesRead,
( unsigned short *) &dwTotalEntries
);
if ( t_Status == NERR_Success )
{
pTmpBuf = pBuf;
CHString t_NetName;
for( DWORD i = oldENtriesRead; i < dwNoOfEntriesRead; i++, pTmpBuf )
{
t_NetName = pTmpBuf->shi1_netname;
t_Shares.Add ( t_NetName );
}
}
else
{
hRes = WBEM_E_FAILED;
}
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
free ( pBuf );
pBuf = NULL;
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
}
return hRes;
}
/*****************************************************************************
*
* FUNCTION : CConnShare::FindAndSet9XConnection
*
* DESCRIPTION : Finds the instance and if presnt does an appropriate operation.
*
*****************************************************************************/
HRESULT CConnShare :: FindAndSet9XConnection (
LPWSTR t_ShareName,
LPCWSTR t_NetName,
LPCWSTR t_UserName,
DWORD dwPropertiesReq,
CInstance *pInstance,
DWORD eOperation
)
{
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 *) ( t_ShareName ), // ShareName
1,
(char *) pBuf,
( unsigned short )dwBufferSize,
( unsigned short *) &dwNoOfEntriesRead,
( unsigned short *) &dwTotalConnections
);
if ( dwNoOfEntriesRead > 0 )
{
pTmpBuf = pBuf;
CHString t_TempNetNameStr, t_UserName ;
for ( DWORD dwConnIndex = 0 ; dwConnIndex < dwNoOfEntriesRead ; dwConnIndex ++, pTmpBuf++ )
{
t_TempNetNameStr = pTmpBuf->coni1_netname;
t_UserName = pTmpBuf->coni1_username;
if ( ( _wcsicmp ( t_NetName, t_TempNetNameStr ) == 0 ) &&
( t_UserName.CompareNoCase ( t_UserName ) == 0 ) )
{
bFound = TRUE;
break ;
}
}
}
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
if ( bFound == FALSE )
{
// if found is TRUE pBuf is not to be freed since the found entry is yet to be used
free ( pBuf );
pBuf = NULL;
}
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
if ( ! bFound && ( dwNoOfEntriesRead < dwTotalConnections ) && ( t_Status == ERROR_MORE_DATA ) )
{
DWORD dwOldNoOfEntries = dwNoOfEntriesRead;
dwBufferSize = dwTotalConnections * sizeof( CONNECTION_INFO );
pBuf = ( CONNECTION_INFO *) malloc(dwBufferSize);
if ( pBuf != NULL )
{
try
{
t_Status = NetConnectionEnum(
NULL,
(char FAR *) ( t_ShareName ), // ShareName
1,
(char *) pBuf,
( unsigned short )dwBufferSize,
( unsigned short *) &dwNoOfEntriesRead,
( unsigned short *) &dwTotalConnections
);
if ( dwNoOfEntriesRead > 0 )
{
pTmpBuf = pBuf;
CHString t_TempNetNameStr, t_UserName;
for ( DWORD dwConnIndex = dwOldNoOfEntries ; dwConnIndex < dwNoOfEntriesRead ; dwConnIndex ++, pTmpBuf++ )
{
t_TempNetNameStr = pTmpBuf->coni1_netname;
t_UserName = pTmpBuf->coni1_username;
if ( ( _wcsicmp ( t_NetName, t_TempNetNameStr ) == 0 ) &&
( _wcsicmp (t_UserName, t_UserName ) == 0 ) )
{
bFound = TRUE;
break ;
}
}
}
}
catch ( ... )
{
free ( pBuf );
pBuf = NULL;
throw;
}
if ( ! bFound )
{
// Free the buffer only if not found, otherwise it needs to be freed after using this found entry
free ( pBuf );
pBuf = NULL;
}
}
else
{
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
}
}
if ( bFound == FALSE )
{
hRes = WBEM_E_NOT_FOUND;
}
if ( SUCCEEDED ( hRes ) )
{
try
{
switch ( eOperation )
{
case Get: hRes = LoadInstance (
pInstance,
t_ShareName,
t_NetName,
pTmpBuf,
dwPropertiesReq
);
case NoOp: break; //do nothing
default: hRes = WBEM_E_INVALID_PARAMETER; break;
}
}
catch ( ... )
{
free( pBuf );
pBuf = NULL;
throw;
}
free( pBuf );
pBuf = NULL;
}
return hRes;
}
#endif
#endif // #if 0
/*****************************************************************************
*
* FUNCTION : CConnShare::EnumConnectionInfo
*
* DESCRIPTION : Enumerates all the NT connections information
*
*****************************************************************************/
HRESULT CConnShare :: EnumConnectionInfo (
LPWSTR a_ComputerName,
LPWSTR a_ShareName,
MethodContext *pMethodContext,
DWORD dwPropertiesReq
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
if ( ( a_ComputerName[0] != L'\0' ) || ( a_ShareName[0] != L'\0' ) )
{
#ifdef NTONLY
hRes = EnumNTConnectionsFromComputerToShare (
a_ComputerName,
a_ShareName,
pMethodContext,
dwPropertiesReq
);
#endif
#if 0
#ifdef WIN9XONLY
hRes = Enum9XConnectionsFromComputerToShare (
a_ComputerName,
a_ShareName,
pMethodContext,
dwPropertiesReq
);
#endif
#endif // #if 0
}
else
if ( ( a_ComputerName[0] == L'\0' ) && ( a_ShareName[0] == L'\0' ) )
{
CHStringArray t_Shares;
#ifdef NTONLY
hRes = GetNTShares ( t_Shares );
#endif
#if 0
#ifdef WIN9XONLY
hRes = Get9XShares ( t_Shares );
#endif
#endif // #if 0
if ( SUCCEEDED ( hRes ) )
{
for ( int i = 0; i < t_Shares.GetSize() ; i++ )
{
#ifdef NTONLY
hRes = EnumNTConnectionsFromComputerToShare (
a_ComputerName,
t_Shares.GetAt ( i ).GetBuffer(0),
pMethodContext,
dwPropertiesReq
);
#endif
#if 0
#ifdef WIN9XONLY
hRes = Enum9XConnectionsFromComputerToShare (
a_ComputerName,
t_Shares.GetAt ( i ),
pMethodContext,
dwPropertiesReq
);
#endif
#endif // #if 0
}
}
}
return hRes;;
}
/*****************************************************************************
*
* FUNCTION : CConnShare::GetConnectionsKeyVal
*
* DESCRIPTION : Parsing the key to get Connection Key Value
*
*****************************************************************************/
HRESULT CConnShare::GetConnectionsKeyVal (
LPCWSTR a_Key,
CHString &a_ComputerName,
CHString &a_ShareName,
CHString &a_UserName
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
ParsedObjectPath *t_ObjPath;
CObjectPathParser t_PathParser;
DWORD dwAllKeys = 0;
if ( t_PathParser.Parse( a_Key, &t_ObjPath ) == t_PathParser.NoError )
{
try
{
hRes = t_ObjPath->m_dwNumKeys != 3 ? WBEM_E_INVALID_PARAMETER : hRes;
if ( SUCCEEDED ( hRes ) )
{
hRes = (t_ObjPath->m_pClass) && _wcsicmp ( t_ObjPath->m_pClass, PROVIDER_NAME_CONNECTION ) == 0 ? WBEM_S_NO_ERROR: WBEM_E_INVALID_PARAMETER;
if ( SUCCEEDED ( hRes ) )
{
for ( int i = 0; i < 3; i++ )
{
if (V_VT(&t_ObjPath->m_paKeys[i]->m_vValue) == VT_BSTR)
{
if ( _wcsicmp ( t_ObjPath->m_paKeys[i]->m_pName, IDS_ComputerName ) == 0 )
{
a_ComputerName = t_ObjPath->m_paKeys[i]->m_vValue.bstrVal;
dwAllKeys |= 1;
}
else
if ( _wcsicmp ( t_ObjPath->m_paKeys[i]->m_pName, IDS_ShareName ) == 0 )
{
a_ShareName = t_ObjPath->m_paKeys[i]->m_vValue.bstrVal;
dwAllKeys |= 2;
}
if ( _wcsicmp ( t_ObjPath->m_paKeys[i]->m_pName, IDS_UserName ) == 0 )
{
a_UserName = t_ObjPath->m_paKeys[i]->m_vValue.bstrVal;
dwAllKeys |= 4;
}
}
else
{
break;
}
}
if ( dwAllKeys != 7 )
{
hRes = WBEM_E_INVALID_PARAMETER;
}
}
else
{
hRes = WBEM_E_INVALID_PARAMETER;
}
}
}
catch ( ... )
{
delete t_ObjPath;
throw;
}
delete t_ObjPath;
}
else
{
hRes = WBEM_E_INVALID_PARAMETER;
}
return hRes;
}
/*****************************************************************************
*
* FUNCTION : CConnShare::MakeObjectPath
*
* DESCRIPTION : Makes the Object Path Given given a class name, a key Name
* and a key value
*
*****************************************************************************/
HRESULT CConnShare::MakeObjectPath (
LPWSTR &a_ObjPathString,
LPCWSTR a_ClassName,
LPCWSTR a_AttributeName,
LPCWSTR a_AttributeVal
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
ParsedObjectPath t_ObjPath;
variant_t t_Path;
t_Path = a_AttributeVal;
hRes = t_ObjPath.SetClassName ( a_ClassName ) ? hRes : WBEM_E_INVALID_PARAMETER;
if ( SUCCEEDED ( hRes ) )
{
hRes = t_ObjPath.AddKeyRef ( a_AttributeName, &t_Path ) ? hRes : WBEM_E_INVALID_PARAMETER;
}
if ( SUCCEEDED ( hRes ) )
{
CObjectPathParser t_PathParser;
hRes = t_PathParser.Unparse( &t_ObjPath, &a_ObjPathString ) == t_PathParser.NoError ? hRes : WBEM_E_INVALID_PARAMETER;
}
return hRes;
}
/*****************************************************************************
*
* FUNCTION : CConnShare::AddToObjectPath
*
* DESCRIPTION : Adds a key name and a value to the existing Object path
*
*****************************************************************************/
HRESULT CConnShare::AddToObjectPath (
LPWSTR &a_ObjPathString,
LPCWSTR a_AttributeName,
LPCWSTR a_AttributeVal
)
{
HRESULT hRes = WBEM_S_NO_ERROR;
ParsedObjectPath *t_ObjPath;
variant_t t_Path;
CObjectPathParser t_PathParser;
if ( t_PathParser.Parse( a_ObjPathString, &t_ObjPath ) == t_PathParser.NoError )
{
try
{
t_Path = a_AttributeVal;
if ( t_ObjPath->AddKeyRef ( a_AttributeName, &t_Path ) )
{
// delete the oldpath string
if ( a_ObjPathString != NULL )
{
delete [] a_ObjPathString;
a_ObjPathString = NULL;
}
}
else
{
hRes = WBEM_E_INVALID_PARAMETER;
}
hRes = t_PathParser.Unparse( t_ObjPath, &a_ObjPathString ) == t_PathParser.NoError ? hRes : WBEM_E_INVALID_PARAMETER;
}
catch ( ... )
{
delete t_ObjPath;
throw;
}
delete t_ObjPath;
}
else
{
hRes = WBEM_E_INVALID_PARAMETER;
}
return hRes;
}