WindowsXP-SP1/termsrv/admtools/tscc/snapin/compdata.cpp
2020-09-30 16:53:49 +02:00

1670 lines
44 KiB
C++

//Copyright (c) 1998 - 1999 Microsoft Corporation
// Compdata.cpp : Implementation of CCompdata
#include "stdafx.h"
#include <ntverp.h>
#include "tscc.h"
#include "dataobj.h"
#include "Compdata.h"
#include "comp.h"
#include <regapi.h>
#include "cfgbkend_i.c"
void ErrMessage( HWND hwndOwner , INT_PTR iResourceID );
extern void xxxErrMessage( HWND hwnd , INT_PTR nResMessageId , INT_PTR nResTitleId , UINT nFlags );
extern void TscAccessDeniedMsg( HWND hwnd );
extern void TscGeneralErrMsg( HWND hwnd );
void InitWarningThread( PVOID pvParam );
extern "C" BOOL
IsWhistlerAdvanceServer();
BOOL g_bAppSrvMode = FALSE;
#ifdef DBG
bool g_fDebug = false;
#endif
//extern "C" BOOL RegisterCheckListWndClass( void );
/////////////////////////////////////////////////////////////////////////////
// CCompdata
//----------------------------------------------------------------------------------------------------------
CCompdata::CCompdata( )
{
m_pConsole = NULL;
m_pConsoleNameSpace = NULL;
m_pCfgcomp = NULL;
m_pMainRoot[ 0 ] = NULL;
m_pMainRoot[ 1 ] = NULL;
}
//----------------------------------------------------------------------------------------------------------
// NDMGR is asking for us to return a view of our doc ( MFC talk )
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::CreateComponent( LPCOMPONENT * ppComponent)
{
*ppComponent = ( LPCOMPONENT )new CComp( this );
if( *ppComponent == NULL )
{
return E_OUTOFMEMORY;
}
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
// Obtain interfaces used by for the scope pane
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Initialize( LPUNKNOWN pUnk )
{
HRESULT hr;
#ifdef DBG
HKEY hKey;
LONG lStatus;
// To control debug spewage add/remove this regkey
lStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
L"Software\\Microsoft\\TSCC\\Debug",
0,
KEY_READ,
&hKey );
if( lStatus == ERROR_SUCCESS )
{
g_fDebug = true;
RegCloseKey( hKey );
}
#endif
hr = pUnk->QueryInterface( IID_IConsole , ( LPVOID *)&m_pConsole );
if( FAILED( hr ) )
{
return hr;
}
hr = pUnk->QueryInterface( IID_IConsoleNameSpace , ( LPVOID * )&m_pConsoleNameSpace );
if( FAILED( hr ) )
{
return hr;
}
hr = CoCreateInstance( CLSID_CfgComp , NULL , CLSCTX_INPROC_SERVER , IID_ICfgComp , ( LPVOID *)&m_pCfgcomp );
if( FAILED( hr ) )
{
return hr;
}
hr = m_pCfgcomp->Initialize( );
if( FAILED( hr ) )
{
return hr;
}
// RegisterCheckListWndClass( );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_MAINFOLDERNAME , m_tchMainFolderName , SIZE_OF_BUFFER( m_tchMainFolderName ) ) );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_SETTINGSFOLDER , m_tchSettingsFolderName , SIZE_OF_BUFFER( m_tchSettingsFolderName ) ) );
hr = BuildSettingsNodes( );
if( FAILED( hr ) )
{
return hr;
}
hr = BuildResultNodes( );
return hr;
}
//----------------------------------------------------------------------------------------------------------
// Dispatch to notification handlers
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Notify( LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
{
HRESULT hr = NOERROR;
switch( event )
{
case MMCN_RENAME:
ODS( L"IComponentdata -- MMCN_RENAME\n");
break;
case MMCN_EXPAND:
ODS( L"IComponentdata -- MMCN_EXPAND\n" );
ExpandScopeTree( lpDataObject , ( BOOL ) arg , ( HSCOPEITEM )param );
break;
case MMCN_DELETE:
ODS( L"IComponentdata -- MMCN_DELETE\n" );
break;
case MMCN_PROPERTY_CHANGE:
ODS( L"IComponentdata -- MMCN_PROPERTY_CHANGE\n" );
break;
default:
ODS( L"CCompdata::Notify - - event not defined!\n" );
hr = E_NOTIMPL;
}
return hr;
}
//----------------------------------------------------------------------------------------------------------
// Prepareing for parent entry
BOOL CCompdata::ExpandScopeTree( LPDATAOBJECT pRoot , BOOL bExpand , HSCOPEITEM hConsole )
{
SCOPEDATAITEM sdi;
if( !bExpand )
{
return FALSE;
}
CBaseNode *pNode = dynamic_cast< CBaseNode *>( pRoot );
if( pNode == NULL )
{
return FALSE;
}
if( pNode->GetNodeType( ) != 0 ) // ROOT_NODE add subscope items
{
return FALSE;
}
// make sure we're not re-adding
for( int i = 0 ; i < 2 ; i++ )
{
if( m_pMainRoot[ i ] != NULL )
{
return TRUE;
}
}
for( i = 0 ; i < 2 ; i++ )
{
m_pMainRoot[ i ] = ( CBaseNode * )new CBaseNode;
if( m_pMainRoot[ i ] == NULL )
{
ODS( L"TSCC: Scope node failed allocation\n" );
return FALSE;
}
m_pMainRoot[ i ]->SetNodeType( i + MAIN_NODE );
//m_pMainRoot[ i ]->AddRef( );
ZeroMemory( &sdi , sizeof( SCOPEDATAITEM ) );
sdi.mask = SDI_STR | SDI_PARAM | SDI_PARENT;
sdi.displayname = MMC_CALLBACK;
sdi.relativeID = hConsole;
sdi.lParam = (LPARAM)m_pMainRoot[ i ];
if( FAILED( m_pConsoleNameSpace->InsertItem( &sdi ) ) )
{
//sdi.ID;
return FALSE;
}
}
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::CompareObjects( LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB)
{
if( lpDataObjectA == lpDataObjectB )
{
return S_OK;
}
return E_FAIL;
}
//----------------------------------------------------------------------------------------------------------
// Not yet finished
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetDisplayInfo( LPSCOPEDATAITEM pItem)
{
CBaseNode *pNode = ( CBaseNode * )pItem->lParam;
if( pItem->mask & SDI_STR )
{
if( pNode->GetNodeType( ) == MAIN_NODE )
{
//pItem->displayname = ( LPOLESTR )L"Connections";
pItem->displayname = ( LPOLESTR )m_tchMainFolderName;
}
else if( pNode->GetNodeType( ) == SETTINGS_NODE )
{
// pItem->displayname = ( LPOLESTR )L"Server Settings";
pItem->displayname = ( LPOLESTR )m_tchSettingsFolderName;
}
}
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::QueryDataObject( MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT * ppDataObject)
{
*ppDataObject = NULL;
switch( type )
{
case CCT_SCOPE:
case CCT_SNAPIN_MANAGER:
if( cookie == 0 )
{
*ppDataObject = ( LPDATAOBJECT )new CBaseNode( );
}
else
{
*ppDataObject = ( LPDATAOBJECT )cookie;
// this is the only scopenode keep this one alive
( ( LPDATAOBJECT )*ppDataObject)->AddRef( );
}
break;
case CCT_RESULT:
// here we can cast from cookie for each node
break;
case CCT_UNINITIALIZED:
// ok thanks
break;
}
return ( *ppDataObject == NULL ) ? E_FAIL : S_OK ;
}
//----------------------------------------------------------------------------------------------------------
// Free all used interfaces
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Destroy( )
{
if( m_pConsole != NULL )
{
m_pConsole->Release( );
}
if( m_pConsoleNameSpace != NULL )
{
m_pConsoleNameSpace->Release( );
}
if( m_pMainRoot[ 0 ] != NULL )
{
DWORD dwRef = m_pMainRoot[ 0 ]->Release( );
DBGMSG( TEXT("Ref count for main node ended in %d\n" ) , dwRef );
}
if( m_pMainRoot[ 1 ] != NULL )
{
DWORD dwRef = m_pMainRoot[ 1 ]->Release( );
DBGMSG( TEXT("Ref count for settings node ended in %d\n" ) , dwRef );
}
int items = m_rnNodes.GetSize( );
for( int idx = 0 ; idx < items; ++idx )
{
CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode != NULL )
{
pNode->FreeServer( );
pNode->Release( );
}
}
m_rnNodes.DeleteArray( );
items = m_rgsNodes.GetSize( );
for( idx = 0 ; idx < items; idx++ )
{
CSettingNode *pNode = *m_rgsNodes.GetAt( idx );
if( pNode != NULL )
{
delete pNode;
}
}
m_rgsNodes.DeleteArray( );
if( m_pCfgcomp != NULL )
{
m_pCfgcomp->Release( );
}
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
// Places our menu items as spec'd
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::AddMenuItems( LPDATAOBJECT pNode , LPCONTEXTMENUCALLBACK pCtxMenu , PLONG plInsertion )
{
TCHAR tchBuffer1[ 128 ];
TCHAR tchBuffer2[ 128 ];
ASSERT( pNode != NULL );
ASSERT( pCtxMenu != NULL );
ASSERT( plInsertion != NULL );
if( pNode != m_pMainRoot[ 0 ] )
{
return S_FALSE;
}
CONTEXTMENUITEM ctxmi;
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_CTXM_NAME , tchBuffer1 , SIZE_OF_BUFFER( tchBuffer1 ) ) );
ctxmi.strName = tchBuffer1;
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_CTXM_STATUS , tchBuffer2 , SIZE_OF_BUFFER( tchBuffer2 ) ) );
ctxmi.strStatusBarText = tchBuffer2;
ctxmi.lCommandID = IDM_CREATECON;
ctxmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_TOP ;
ctxmi.fFlags = 0;
ctxmi.fSpecialFlags = 0;
*plInsertion |= CCM_INSERTIONALLOWED_TOP;
//VERIFY_S( S_OK , pCtxMenu->AddItem( &ctxmi ) );
//ctxmi.lInsertionPointID = CCM_INSERTIONPOINTID_PRIMARY_NEW;
return pCtxMenu->AddItem( &ctxmi );
}
//----------------------------------------------------------------------------------------------------------
// This is where the wizard will kick off
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::Command( LONG lCommand , LPDATAOBJECT pNode )
{
HWND hMain;
if( pNode != m_pMainRoot[ 0 ] )
{
return S_FALSE;
}
if( lCommand == IDM_CREATECON )
{
// insure that no other connections are being edited
for( int i = 0 ; i < m_rnNodes.GetSize( ); i++ )
{
CResultNode *pNd = *m_rnNodes.GetAt( i );
if( pNd != NULL )
{
if( pNd->m_bEditMode )
{
if( FAILED( m_pConsole->GetMainWindow( &hMain ) ) )
{
hMain = NULL;
}
xxxErrMessage( hMain , IDS_ERR_INEDITMODE , IDS_WARN_TITLE , MB_OK | MB_ICONWARNING );
return E_FAIL;
}
}
}
// check for admin rights.
BOOL bReadOnly;
m_pCfgcomp->IsSessionReadOnly( &bReadOnly );
if( bReadOnly )
{
if( FAILED( m_pConsole->GetMainWindow( &hMain ) ) )
{
hMain = NULL;
}
// report access denied
TscAccessDeniedMsg( hMain );
return S_FALSE;
}
if( !InitDialogObjects( ) )
{
return E_FAIL;
}
BuildWizardPath( );
FreeDialogObjects( );
}
m_pConsole->UpdateAllViews( ( LPDATAOBJECT )m_rnNodes.GetAt( 0 ) , 0 , 0 );
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
// Try to allocate
BOOL CCompdata::InitDialogObjects( )
{
try
{
m_pDlg[ 0 ] = ( CDialogWizBase * )new CWelcome( );
m_pDlg[ 1 ] = ( CDialogWizBase * )new CConType( this );
m_pDlg[ 2 ] = ( CDialogWizBase * )new CSecurity( this );
// m_pDlg[ 3 ] = ( CDialogWizBase * )new CTimeout( );
// m_pDlg[ 4 ] = ( CDialogWizBase * )new CAutoLogon( );
// m_pDlg[ 5 ] = ( CDialogWizBase * )new CInitProg( );
m_pDlg[ 3 ] = ( CDialogWizBase * )new CRemotectrl( );
// m_pDlg[ 7 ] = ( CDialogWizBase * )new CWallPaper( );
m_pDlg[ 4 ] = ( CDialogWizBase * )new CConProp( this );
m_pDlg[ 5 ] = ( CDialogWizBase * )new CLan( this );
m_pDlg[ 6 ] = ( CDialogWizBase * )new CAsync( this );
m_pDlg[ 7 ] = ( CDialogWizBase * )new CFin( this );
}
catch(...)
{
return FALSE;
}
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::BuildWizardPath( )
{
// build up ms propsheetheader
PROPSHEETPAGE psp;
PROPSHEETHEADER psh;
for( int idx = 0 ; idx < MS_DIALOG_COUNT ; ++idx )
{
if( m_pDlg[ idx ] != NULL )
{
m_pDlg[ idx ]->GetPropertySheetPage( psp );
m_hPages.Insert( CreatePropertySheetPage( &psp ) );
}
}
// obtain clsid of IExtendwizard object
// forward IWizardProvider to object
// add last page CFin
ZeroMemory( &psh , sizeof( PROPSHEETHEADER ) );
psh.dwSize = sizeof( PROPSHEETHEADER );
psh.hInstance = _Module.GetModuleInstance( );
if( m_pConsole != NULL )
{
m_pConsole->GetMainWindow( &psh.hwndParent );
}
//psh.pszCaption = MAKEINTRESOURCE( IDS_WIZARDTITLE ); //NULL
psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER ;
psh.pszbmWatermark = MAKEINTRESOURCE( IDB_TSCC_LOGO );
psh.pszbmHeader = MAKEINTRESOURCE( IDB_TSCC_ICON );
psh.phpage = m_hPages.ExposeArray( );
psh.nStartPage = 0;
psh.nPages = m_hPages.GetSize( );
PropertySheet( &psh );
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::FreeDialogObjects( )
{
for( int idx = 0 ; idx < MS_DIALOG_COUNT ; ++idx )
{
if( m_pDlg[ idx ] != NULL )
{
delete m_pDlg[ idx ];
}
}
m_hPages.DeleteArray( );
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::IsConnectionFolder( LPDATAOBJECT pObject )
{
if( SUCCEEDED( CompareObjects( pObject , m_pMainRoot[ 0 ] ) ) )
{
return TRUE;
}
return FALSE;
}
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::IsSettingsFolder( LPDATAOBJECT pObject )
{
if( SUCCEEDED( CompareObjects( pObject , m_pMainRoot[ 1 ] ) ) )
{
return TRUE;
}
return FALSE;
}
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::UpdateAllResultNodes( )
{
HWND hMain;
if( FAILED( m_pConsole->GetMainWindow( &hMain ) ) )
{
hMain = NULL;
}
int items = m_rnNodes.GetSize( );
for( int idx = 0 ; idx < items; ++idx )
{
CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode != NULL )
{
if( pNode->m_bEditMode )
{
// ErrMessage( NULL , IDS_ERR_INEDITMODE );
xxxErrMessage( hMain , IDS_ERR_INEDITMODE , IDS_WARN_TITLE , MB_OK | MB_ICONWARNING );
return E_FAIL;
}
}
}
HRESULT hr = m_pCfgcomp->Refresh( );
if( FAILED( hr ) )
{
ODS( L"m_pCfgcomp->Refresh - failed\n" );
if( hr == E_ACCESSDENIED )
{
TscAccessDeniedMsg( hMain );
}
else
{
TscGeneralErrMsg( hMain );
}
return hr;
}
for( idx = 0 ; idx < items; ++idx )
{
CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode != NULL )
{
pNode->FreeServer( );
pNode->Release( );
}
}
m_rnNodes.DeleteArray( );
return BuildResultNodes( );
}
//----------------------------------------------------------------------------------------------------------
BOOL IsAppServerMode()
{
OSVERSIONINFOEX osVersionInfo;
DWORDLONG dwlConditionMask = 0;
BOOL fSuiteTerminal = FALSE;
BOOL fSuiteSingleUserTS = FALSE;
ZeroMemory(&osVersionInfo, sizeof(OSVERSIONINFOEX));
osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osVersionInfo.wSuiteMask = VER_SUITE_TERMINAL;
VER_SET_CONDITION( dwlConditionMask, VER_SUITENAME, VER_AND );
fSuiteTerminal = VerifyVersionInfo(&osVersionInfo, VER_SUITENAME,
dwlConditionMask);
osVersionInfo.wSuiteMask = VER_SUITE_SINGLEUSERTS;
fSuiteSingleUserTS = VerifyVersionInfo(&osVersionInfo, VER_SUITENAME,
dwlConditionMask);
if( (FALSE == fSuiteSingleUserTS) && (TRUE == fSuiteTerminal) )
{
return TRUE;
}
else
{
return FALSE;
}
}
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::BuildSettingsNodes( )
{
// Resource ID for item move to snodes.h
//INT rgResid[] = {
// IDS_DELTEMPONEXIT,
// IDS_USETEMPDIR,
/* IDS_DEFCONSEC, */
// IDS_LICENSING,
// IDS_ADS_ATTR,
// IDS_USERPERM,
// IDS_SINGLE_SESSION,
// -1};
DWORD dwNumItems = sizeof( RGRESID ) / sizeof( RGRESID[0] );
BOOL bAdvanceServer = IsWhistlerAdvanceServer();
BOOL bAppSrvMode = FALSE;
TCHAR tchbuffer[ 256 ];
TCHAR tchKey[ ] = L"Software\\Microsoft\\TSCC\\CLSID";
HKEY hKey;
DWORD dwStatus;
TCHAR szSubKeyName[ 256 ];
DWORD dwSubKeyNameLength;
CLSID clsidOther;
INT nObjectId = 0;
ISettingsComp *pSettings = NULL;
IExtendServerSettings *pExtendServerSettings = NULL;
if( m_pCfgcomp == NULL || FAILED( m_pCfgcomp->QueryInterface( IID_ISettingsComp , ( PVOID * )&pSettings ) ) )
{
return E_FAIL;
}
ASSERT( sizeof( RGRESID ) / sizeof( RGRESID[0] ) == sizeof(VALIDOBJECTONSERVER)/sizeof(VALIDOBJECTONSERVER[0]) );
ASSERT( sizeof(VALIDOBJECTONSERVER)/sizeof(VALIDOBJECTONSERVER[0]) == sizeof(VALIDOBJECTONADS)/sizeof(VALIDOBJECTONADS[0]) );
for( DWORD idx = 0; idx < dwNumItems ; idx++ )
{
// error checking, do go over array boundary
if( !bAdvanceServer )
{
if( idx > sizeof(VALIDOBJECTONSERVER)/sizeof(VALIDOBJECTONSERVER[0]) )
{
ASSERT(FALSE);
continue;
}
}
else
{
if( idx > sizeof(VALIDOBJECTONADS)/sizeof(VALIDOBJECTONADS[0]) )
{
ASSERT(FALSE);
continue;
}
}
if( ( bAdvanceServer && VALIDOBJECTONADS[idx] ) || (!bAdvanceServer && VALIDOBJECTONSERVER[idx] ) )
{
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , RGRESID[ idx ] , tchbuffer , SIZE_OF_BUFFER( tchbuffer ) ) );
// ASSERT( idx < MAX_SETTINGS );
CSettingNode *pSet = ( CSettingNode * )new CSettingNode( );
if( pSet != NULL )
{
pSet->SetObjectId( nObjectId );
pSet->SetInterface( ( LPUNKNOWN )pSettings );
if( !pSet->SetAttributeName( tchbuffer ) )
{
ODS( L"TSCC: BuildSettingsNodes -- SetItemName failed\n" );
}
m_rgsNodes.Insert( pSet );
nObjectId++;
}
}
else
{
nObjectId++;
}
}
pSettings->Release( );
// Find out how many extension nodes are out there.
// First we need to get the specific tssd component supplied for session
// directory services, but only on application servers.
bAppSrvMode = IsAppServerMode();
if( bAppSrvMode && ( dwStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
REG_CONTROL_TSERVER ,
0,
KEY_READ,
&hKey ) ) == ERROR_SUCCESS )
{
DBGMSG( L"RegOpenKeyEx tssd ok at %s\n" , REG_CONTROL_TSERVER );
dwSubKeyNameLength = sizeof( szSubKeyName );
dwStatus = RegQueryValueEx( hKey ,
REG_TS_SESSDIRCLSID ,
NULL ,
NULL ,
( LPBYTE )szSubKeyName ,
&dwSubKeyNameLength );
DBGMSG( L"tssd RegQueryValueEx for %s\n" , REG_TS_SESSDIRCLSID );
DBGMSG( L"tssd RegQueryValueEx ret 0x%x\n" , dwStatus );
if( dwStatus == ERROR_SUCCESS )
{
DBGMSG( L"CCompdata!BuildSettingsNode key name %s\n" , szSubKeyName );
if( SUCCEEDED( CLSIDFromString( szSubKeyName , &clsidOther ) ) )
{
if( SUCCEEDED( CoCreateInstance(
clsidOther ,
NULL ,
CLSCTX_INPROC_SERVER ,
IID_IExtendServerSettings ,
( LPVOID *) &pExtendServerSettings ) ) )
{
if( pExtendServerSettings != NULL )
{
CSettingNode *pSet = ( CSettingNode * )new CSettingNode( );
if( pSet != NULL )
{
pSet->SetObjectId( nObjectId );
pSet->SetInterface( ( LPUNKNOWN )pExtendServerSettings );
pExtendServerSettings->GetAttributeName( tchbuffer );
if( !pSet->SetAttributeName( tchbuffer ) )
{
ODS( L"TSCC: BuildSettingsNodes -- SetItemName failed\n" );
}
m_rgsNodes.Insert( pSet );
nObjectId++;
}
}
pExtendServerSettings->Release();
}
}
}
RegCloseKey( hKey );
}
// look for other custom components at HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TSCC\CLSID
idx = 0;
if( ( dwStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
tchKey ,
0,
KEY_READ,
&hKey ) ) == ERROR_SUCCESS )
{
while( dwStatus == ERROR_SUCCESS )
{
dwSubKeyNameLength = SIZE_OF_BUFFER( szSubKeyName );
dwStatus = RegEnumKeyEx(
hKey ,
( DWORD )idx,
szSubKeyName ,
&dwSubKeyNameLength,
NULL ,
NULL ,
NULL ,
NULL
);
if( dwStatus != ERROR_SUCCESS )
{
DBGMSG( L"RegEnumKeyEx failed with 0x%x\n" , dwStatus );
break;
}
DBGMSG( L"CCompdata!BuildSettingsNode key name %s\n" , szSubKeyName );
idx++;
if( FAILED( CLSIDFromString( szSubKeyName , &clsidOther ) ) )
{
continue;
}
if( SUCCEEDED( CoCreateInstance(
clsidOther ,
NULL ,
CLSCTX_INPROC_SERVER ,
IID_IExtendServerSettings ,
( LPVOID *) &pExtendServerSettings ) ) )
{
if( pExtendServerSettings != NULL )
{
CSettingNode *pSet = ( CSettingNode * )new CSettingNode( );
if( pSet != NULL )
{
pSet->SetObjectId( nObjectId );
pSet->SetInterface( ( LPUNKNOWN )pExtendServerSettings );
pExtendServerSettings->GetAttributeName( tchbuffer );
if( !pSet->SetAttributeName( tchbuffer ) )
{
ODS( L"TSCC: BuildSettingsNodes -- SetItemName failed\n" );
}
m_rgsNodes.Insert( pSet );
nObjectId++;
}
}
pExtendServerSettings->Release();
}
} // while
RegCloseKey( hKey );
} // if
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::BuildResultNodes( )
{
CResultNode *pResultNode;
WS *pWs;
ULONG ulitems = 0;
ULONG cbSize = 0;
ULONG cItems = 0;
BOOL bValid = TRUE;
PGUIDTBL pGuidtbl = NULL;
TCHAR szOldPdName[ MAX_PATH ];
HRESULT hr = E_FAIL;
if( SUCCEEDED( m_pCfgcomp->GetWinstationList( &ulitems , &cbSize , &pWs ) ) )
{
// Get valid lanids
for( ULONG i = 0 ; i < ulitems ; ++i )
{
// do not list console
if( lstrcmpi( pWs[ i ].Name , L"console" ) == 0 )
{
continue;
}
pResultNode = new CResultNode( );
if( pResultNode == NULL )
{
return E_OUTOFMEMORY;
}
pResultNode->SetConName( pWs[ i ].Name , lstrlen( pWs[ i ].Name ) );
pResultNode->SetTTName( pWs[ i ].pdName , lstrlen( pWs[ i ].pdName ) );
pResultNode->SetTypeName( pWs[ i ].wdName , lstrlen( pWs[ i ].wdName ) );
pResultNode->SetComment( pWs[ i ].Comment , lstrlen( pWs[ i ].Comment ) );
pResultNode->EnableConnection( pWs[ i ].fEnableWinstation );
pResultNode->SetImageIdx( ( pWs[ i ].fEnableWinstation ? 1 : 2 ) );
pResultNode->SetServer( m_pCfgcomp );
if( lstrcmpi( pWs[i].pdName , szOldPdName ) != 0 )
{
if( pGuidtbl != NULL )
{
CoTaskMemFree( pGuidtbl );
pGuidtbl = NULL;
}
hr = m_pCfgcomp->GetLanAdapterList2( pWs[ i ].pdName , &cItems , &pGuidtbl );
lstrcpy( szOldPdName , pWs[i].pdName );
}
if( pGuidtbl != NULL && SUCCEEDED( hr ) )
{
BOOL bFoundaMatch = FALSE;
for( int k = 0; k < ( int )cItems ; ++k )
{
if( ( pGuidtbl[ k ].dwStatus == ERROR_SUCCESS ) && ( pGuidtbl[ k ].dwLana == pWs[ i ].LanAdapter ) )
{
bFoundaMatch = TRUE;
break;
}
}
if( !bFoundaMatch )
{
DWORD dwStatus;
ODS( L"TSCC:BuildResultNodes we found an invalid lanaid\n" );
pWs[ i ].fEnableWinstation = 0;
m_pCfgcomp->UpDateWS( pWs , UPDATE_ENABLEWINSTATION , &dwStatus, TRUE );
pResultNode->EnableConnection( 0 );
pResultNode->SetImageIdx( 2 );
}
if( bValid ) // once set to false we know we have a winstation that has an invalid lanaid
{
bValid = bFoundaMatch;
}
}
if( m_rnNodes.Insert( pResultNode ) == 0 )
{
return E_OUTOFMEMORY;
}
}
if( pGuidtbl != NULL )
{
CoTaskMemFree( pGuidtbl );
}
CoTaskMemFree( pWs );
if( !bValid )
{
HWND hwnd;
BOOL bReadOnly = FALSE;
m_pCfgcomp->IsSessionReadOnly( &bReadOnly );
if( bReadOnly )
{
return S_OK;
}
if( m_pConsole != NULL )
{
m_pConsole->GetMainWindow( &hwnd );
DWORD dwTid;
HANDLE hThread = CreateThread( NULL , 0 , ( LPTHREAD_START_ROUTINE )InitWarningThread, hwnd , 0 , &dwTid );
CloseHandle( hThread );
}
}
return S_OK;
}
return E_FAIL;
}
//----------------------------------------------------------------------------------------------------------
//BOOL CCompdata::GetResultNode( int idx , CResultNode** pRn )
CResultNode * CCompdata::GetResultNode( int idx )
{
return *m_rnNodes.GetAt( idx );
/*
if( *pRn == NULL )
{
return FALSE;
}
return TRUE;
*/
}
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::InsertSettingItems( LPRESULTDATA pResultData )
{
RESULTDATAITEM rdi;
HRESULT hr;
CSettingNode *pSettingNode = NULL;
ASSERT( pResultData != NULL );
if( pResultData == NULL )
{
return E_INVALIDARG;
}
ZeroMemory( &rdi , sizeof(RESULTDATAITEM) );
rdi.mask = RDI_STR | RDI_PARAM | RDI_IMAGE;
rdi.str = MMC_CALLBACK;
if (NULL != m_pCfgcomp)
{
DWORD nVal, dwStatus;
ISettingsComp* pISettingComp = NULL;
hr = m_pCfgcomp->QueryInterface( IID_ISettingsComp, (void **) &pISettingComp );
if (SUCCEEDED(hr))
{
hr = pISettingComp->GetTermSrvMode( &nVal, &dwStatus );
if (SUCCEEDED(hr))
{
g_bAppSrvMode = nVal;
}
pISettingComp->Release();
}
}
int nMax = m_rgsNodes.GetSize();
for( int idx = 0 ; idx < nMax ; ++idx )
{
// init object -- if it fails skip over it
pSettingNode = *m_rgsNodes.GetAt( idx );
if( pSettingNode != NULL )
{
if( FAILED( pSettingNode->GetNodeStatus( ) ) )
{
continue;
}
/*
if( m_rgsNodes[ idx ].GetObjectId() == USERSECURITY )
{
// check to see if we're remote admin mode
// if so skip over usersecurity
if( !bDisplayUserPerm )
{
continue;
}
}
*/
rdi.itemID = 1; // unique from connection items
rdi.lParam = ( LPARAM )pSettingNode;
rdi.nImage = pSettingNode->GetImageIdx( );
hr = pResultData->InsertItem( &rdi );
if( FAILED( hr ) )
{
return hr;
}
}
}
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
HRESULT CCompdata::InsertFolderItems( LPRESULTDATA pResultData )
{
RESULTDATAITEM rdi;
HRESULT hr;
// TCHAR tchBuffer[80];
ASSERT( pResultData != NULL );
if( pResultData == NULL )
{
return E_INVALIDARG;
}
ZeroMemory( &rdi , sizeof(RESULTDATAITEM) );
rdi.mask = RDI_STR | RDI_PARAM | RDI_IMAGE;
rdi.str = MMC_CALLBACK;
int items = m_rnNodes.GetSize( );
for( int idx = 0 ; idx < items ; ++idx )
{
CResultNode *pNode = *m_rnNodes.GetAt( idx );
if( pNode == NULL )
{
return E_FAIL;
}
rdi.lParam = ( LPARAM )pNode;
rdi.nImage = pNode->GetImageIdx( );
hr = pResultData->InsertItem( &rdi );
if( FAILED( hr ) )
{
return hr;
}
}
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
int CCompdata::GetServer( ICfgComp **ppCfgcomp )
{
if( m_pCfgcomp != NULL )
{
*ppCfgcomp = m_pCfgcomp;
return ( ( ICfgComp * )*ppCfgcomp )->AddRef( );
}
return 0;
}
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::OnDeleteItem( LPDATAOBJECT pDo)
{
ICfgComp *pCfgcomp;
CResultNode *pNode = dynamic_cast< CResultNode *>( pDo );
if( pNode != NULL )
{
HWND hWnd = NULL;
m_pConsole->GetMainWindow( &hWnd );
if( pNode->GetServer( &pCfgcomp ) == 0 )
{
return FALSE;
}
TCHAR tchWarnText[ 512 ];
TCHAR tchmsg[ 256 ];
TCHAR tchDeleteTitle[ 80 ];
LONG lCount;
// check to see if anyone is connected
pCfgcomp->QueryLoggedOnCount( pNode->GetConName( ) , &lCount );
if( lCount > 0 )
{
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DELETELIVECON , tchmsg , SIZE_OF_BUFFER( tchmsg ) ) );
wsprintf( tchWarnText , tchmsg , pNode->GetConName( ) );
}
else
{
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DELETETEXT , tchWarnText , SIZE_OF_BUFFER( tchWarnText ) ) );
}
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DELTITLE , tchDeleteTitle , SIZE_OF_BUFFER( tchDeleteTitle ) ) );
if( MessageBox( hWnd , tchWarnText , tchDeleteTitle , MB_YESNO | MB_ICONEXCLAMATION ) == IDNO )
{
return FALSE;
}
if( FAILED( pCfgcomp->DeleteWS( pNode->GetConName( ) ) ) )
{
// WARN USER
ErrMessage( hWnd , IDS_ERR_DELFAIL );
return FALSE;
}
else
{
VERIFY_S( S_OK , pCfgcomp->ForceUpdate( ) );
}
pCfgcomp->Release( );
}
BOOL bFound;
int idx = m_rnNodes.FindItem( pNode , bFound );
if( bFound )
{
pNode->FreeServer( );
pNode->Release( );
m_rnNodes.DeleteItemAt( idx );
}
m_pConsole->UpdateAllViews( ( LPDATAOBJECT )m_rnNodes.GetAt( 0 ) , 0 , 0 );
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
// MMC Free up ppStr when it's done
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetSnapinDescription( LPOLESTR *ppStr )
{
TCHAR tchDescription[ 1024 ];
int iCharCount = LoadString( _Module.GetResourceInstance( ) , IDS_DESCRIPTION , tchDescription , SIZE_OF_BUFFER( tchDescription ) );
*ppStr = ( LPOLESTR )CoTaskMemAlloc( iCharCount * sizeof( TCHAR ) + sizeof( TCHAR ) );
if( *ppStr != NULL )
{
lstrcpy( *ppStr , tchDescription );
return S_OK;
}
return E_OUTOFMEMORY;
}
//----------------------------------------------------------------------------------------------------------
// MMC Free up ppStr when it's done
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetProvider( LPOLESTR *ppStr )
{
TCHAR tchProvider[ 128 ];
int iCharCount = LoadString( _Module.GetResourceInstance( ) , IDS_PROVIDER , tchProvider , SIZE_OF_BUFFER( tchProvider ) );
*ppStr = ( LPOLESTR )CoTaskMemAlloc( iCharCount * sizeof( TCHAR ) + sizeof( TCHAR ) );
if( *ppStr != NULL )
{
lstrcpy( *ppStr , tchProvider );
return S_OK;
}
return E_OUTOFMEMORY;
}
//----------------------------------------------------------------------------------------------------------
// MMC Free up ppStr when it's done
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetSnapinVersion( LPOLESTR *ppStr )
{
char chVersion[ 32 ] = VER_PRODUCTVERSION_STR;
TCHAR tchVersion[ 32 ];
int iCharCount = MultiByteToWideChar( CP_ACP , 0 , chVersion , sizeof( chVersion ) , tchVersion , SIZE_OF_BUFFER( tchVersion ) );
*ppStr = ( LPOLESTR )CoTaskMemAlloc( ( iCharCount + 1 ) * sizeof( TCHAR ) );
if( *ppStr != NULL && iCharCount != 0 )
{
lstrcpy( *ppStr , tchVersion );
return S_OK;
}
return E_OUTOFMEMORY;
}
//----------------------------------------------------------------------------------------------------------
// Supply an icon here for the main icon in the about box
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetSnapinImage( HICON *phIcon )
{
//*phIcon = ( HICON )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDI_ICON_ABOUT ) , IMAGE_ICON , 37 ,37 , LR_DEFAULTCOLOR );
*phIcon = ( HICON )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDI_ICON_GENERAL2 ) , IMAGE_ICON , 32 ,32 , LR_DEFAULTCOLOR );
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
// Supply an icon here for the main icon in the about box
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetStaticFolderImage( HBITMAP *phSmallImage , HBITMAP *phSmallImageOpen , HBITMAP *phLargeImage, COLORREF *pClr )
{
*phSmallImage = ( HBITMAP )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDB_BITMAP_GENSMALL ) , IMAGE_BITMAP , 16 ,16 , LR_DEFAULTCOLOR );
*phSmallImageOpen = ( HBITMAP )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDB_BITMAP_GENSMALL ) , IMAGE_BITMAP , 16 ,16 , LR_DEFAULTCOLOR );
*phLargeImage = ( HBITMAP )LoadImage( _Module.GetResourceInstance( ) , MAKEINTRESOURCE( IDB_BITMAP_GENLARGE ) , IMAGE_BITMAP , 32 ,32 , LR_DEFAULTCOLOR );
*pClr = RGB( 255 , 0 , 255 );
//return E_NOTIMPL;
return S_OK;
}
//----------------------------------------------------------------------------------------------------------
// MMC will ask for our help file
//----------------------------------------------------------------------------------------------------------
STDMETHODIMP CCompdata::GetHelpTopic( LPOLESTR *ppszHelpFile )
{
ODS( L"CCompdata::GetHelpTopic called\n" );
if( ppszHelpFile == NULL )
{
return E_INVALIDARG;
}
TCHAR tchHelpFile[ MAX_PATH ];
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_TSCCSNAPHELP , tchHelpFile , SIZE_OF_BUFFER( tchHelpFile ) ) );
// mmc will call CoTaskMemFree
*ppszHelpFile = ( LPOLESTR )CoTaskMemAlloc( sizeof( tchHelpFile ) );
if( *ppszHelpFile != NULL )
{
if( GetSystemWindowsDirectory( *ppszHelpFile , MAX_PATH ) != 0 )
{
lstrcat( *ppszHelpFile , tchHelpFile );
}
else
{
lstrcpy( *ppszHelpFile , tchHelpFile );
}
ODS( *ppszHelpFile );
ODS( L"\n" );
return S_OK;
}
return E_OUTOFMEMORY;
}
//----------------------------------------------------------------------------------------------------------
// Helper methods for fixing the column lengths
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::GetMaxTextLengthSetting( LPTSTR pszText , PINT pnMaxLen )
{
INT nIndex = 0;
INT nCurrentMax = 0;
INT nMax;
*pnMaxLen = 0;
nMax = m_rgsNodes.GetSize( );
CSettingNode *pSettingNode;
for( int idx = 0 ; idx < nMax ; ++idx )
{
pSettingNode = *m_rgsNodes.GetAt( idx );
if( pSettingNode != NULL && pSettingNode->GetAttributeName( ) != NULL )
{
nCurrentMax = lstrlen( pSettingNode->GetAttributeName( ) );
if( *pnMaxLen < nCurrentMax )
{
*pnMaxLen = nCurrentMax;
nIndex = idx;
}
}
}
pSettingNode = *m_rgsNodes.GetAt( nIndex );
if (pSettingNode != NULL && pSettingNode->GetAttributeName( ) != NULL)
{
lstrcpy( pszText , pSettingNode->GetAttributeName( ) );
}
return TRUE;
}
//----------------------------------------------------------------------------------------------------------
// Helper methods for fixing the column lengths
//----------------------------------------------------------------------------------------------------------
BOOL CCompdata::GetMaxTextLengthAttribute( LPTSTR pszText , PINT pnMaxLen )
{
INT nIndex = 0;
INT nCurrentMax = 0;
INT nMax;
*pnMaxLen = 0;
nMax = m_rgsNodes.GetSize( );
CSettingNode *pSettingNode = NULL;
for( int idx = 0 ; idx < nMax ; ++idx )
{
pSettingNode = *m_rgsNodes.GetAt( idx );
if (pSettingNode != NULL && pSettingNode->GetAttributeName( ) != NULL )
{
nCurrentMax = lstrlen( pSettingNode->GetAttributeValue( ) );
DBGMSG( L"CCompdata!GetMaxTextLengthAttribute AttributeValue = %s\n", pSettingNode->GetAttributeValue( ) );
if( *pnMaxLen < nCurrentMax )
{
*pnMaxLen = nCurrentMax;
nIndex = idx;
}
}
}
pSettingNode = *m_rgsNodes.GetAt( nIndex );
if (pSettingNode != NULL)
{
LPTSTR pszValue = pSettingNode->GetAttributeValue( );
if(pszValue != NULL)
{
lstrcpy( pszText , pszValue );
}
else
{
return FALSE;
}
}
return TRUE;
}
void InitWarningThread( PVOID pvParam )
{
HWND hwnd = ( HWND )pvParam;
TCHAR tchMessage[ 256 ];
TCHAR tchTitle[ 80 ];
Sleep( 200 );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_DISABNETWORK , tchMessage , SIZE_OF_BUFFER( tchMessage ) ) );
VERIFY_E( 0 , LoadString( _Module.GetResourceInstance( ) , IDS_TSCERRTITLE , tchTitle , SIZE_OF_BUFFER( tchTitle ) ) );
MessageBox( hwnd , tchMessage , tchTitle , MB_ICONINFORMATION | MB_OK );
}