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.
1798 lines
44 KiB
1798 lines
44 KiB
// Copyright (c) 1999 Microsoft Corporation
|
|
#include "precomp.h"
|
|
#include "DataSrc.h"
|
|
#include "..\common\util.h"
|
|
#include "resource.h"
|
|
#include <stdio.h>
|
|
#include "si.h"
|
|
#include <cominit.h>
|
|
#include "ShlWapi.h"
|
|
#include "AsyncObjectSink.h"
|
|
#include "UIHelpers.h"
|
|
|
|
#define FULLACCTSIZE 100
|
|
//---------------------------------------------------------
|
|
DataSource::DataSource():m_cRef(1)
|
|
{
|
|
CoInitialize(NULL);
|
|
m_OSType = 0; //UNKNOWN;
|
|
m_user.authIdent = NULL;
|
|
m_user.currUser = true;
|
|
memset(m_user.fullAcct, 0, FULLACCTSIZE * sizeof(TCHAR));
|
|
m_hImageList = 0;
|
|
m_folderIcon = 0;
|
|
m_earthIcon = 0;
|
|
m_classIcon = 0;
|
|
m_instanceIcon = 0;
|
|
m_scopeInstanceIcon = 0;
|
|
m_scopeClassIcon = 0;
|
|
m_sessionID = 0;
|
|
|
|
m_NSCache.display = 0;
|
|
m_NSCache.fullPath = 0;
|
|
m_NSCache.ns = 0;
|
|
|
|
m_hwndPropSheet = NULL;
|
|
|
|
//Initialize return codes to failed state and namespaces to disconnected state
|
|
m_securityHr = E_FAIL;
|
|
m_osHr = E_FAIL;
|
|
m_cpuHr = E_FAIL;
|
|
m_settingHr = E_FAIL;
|
|
|
|
m_rootSecNS.DisconnectServer();
|
|
m_cimv2NS.DisconnectServer();
|
|
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
DataSource::~DataSource()
|
|
{
|
|
CancelAllAsyncCalls();
|
|
Disconnect();
|
|
CoUninitialize();
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// connecting.
|
|
void DataSource::SetMachineName(CHString1 &machine)
|
|
{
|
|
TCHAR curComp[256] = {0};
|
|
DWORD size = ARRAYSIZE(curComp);
|
|
|
|
// check the whacks
|
|
if (GetComputerName(curComp, &size))
|
|
{
|
|
// if local...
|
|
if((machine.GetLength() == 0) ||
|
|
(machine == curComp))
|
|
{
|
|
m_whackedMachineName = "";
|
|
}
|
|
else if(machine[0] == _T('\\')) // its whacked.
|
|
{
|
|
m_whackedMachineName = machine;
|
|
}
|
|
else //its not whacked.
|
|
{
|
|
m_whackedMachineName = _T("\\\\");
|
|
m_whackedMachineName += machine;
|
|
}
|
|
}
|
|
else //failed to get local computer name
|
|
m_whackedMachineName = "";
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// connecting.
|
|
HRESULT DataSource::Connect(LOGIN_CREDENTIALS *credentials, HWND notify)
|
|
{
|
|
// start the connection thread.
|
|
if(m_rootThread.Connect((bstr_t)m_whackedMachineName, "root", true, credentials, notify))
|
|
{
|
|
}
|
|
|
|
m_sessionID++;
|
|
return m_rootThread.m_hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
// closes property sheet if displated
|
|
void DataSource::ClosePropSheet()
|
|
{
|
|
if (m_hwndPropSheet)
|
|
{
|
|
SendMessage(m_hwndPropSheet, WM_CLOSE, 0, 0 );
|
|
m_hwndPropSheet = NULL;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
bool DataSource::IsNewConnection(long *sessionID)
|
|
{
|
|
bool retval = false;
|
|
if(m_sessionID != *sessionID)
|
|
{
|
|
*sessionID = m_sessionID;
|
|
retval = true;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::Reconnect(void)
|
|
{
|
|
Disconnect();
|
|
Connect(GetCredentials());
|
|
return m_rootThread.m_hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::Initialize(IWbemServices *pServices)
|
|
{
|
|
IWbemClassObject *pInst = NULL;
|
|
HRESULT retval = S_OK;
|
|
|
|
m_securityHr = S_OK;
|
|
m_osHr = S_OK;
|
|
m_cpuHr = S_OK;
|
|
m_settingHr = S_OK;
|
|
|
|
if(pServices == 0) return E_FAIL;
|
|
|
|
try
|
|
{
|
|
m_rootThread.m_WbemServices.DisconnectServer();
|
|
m_rootThread.m_WbemServices = pServices;
|
|
m_rootThread.m_WbemServices.m_authIdent = m_user.authIdent;
|
|
|
|
if(m_rootThread.m_status == WbemServiceThread::ready)
|
|
{
|
|
|
|
m_cimv2NS.DisconnectServer();
|
|
// we'll use some general info from root\cimv2
|
|
m_cimv2NS = m_rootThread.m_WbemServices.OpenNamespace("cimv2");
|
|
m_cimv2NS.m_authIdent = m_user.authIdent;
|
|
|
|
if((bool)m_cimv2NS)
|
|
{
|
|
if((pInst = m_cimv2NS.FirstInstanceOf("Win32_OperatingSystem")) != NULL)
|
|
{
|
|
m_OS = pInst;
|
|
m_OSType = (short)m_OS.GetLong("OSType");
|
|
}
|
|
m_osHr = m_cimv2NS.m_hr;
|
|
|
|
if((pInst = m_cimv2NS.FirstInstanceOf("Win32_Processor")) != NULL)
|
|
{
|
|
m_cpu = pInst;
|
|
}
|
|
m_cpuHr = m_cimv2NS.m_hr;
|
|
|
|
m_winMgmt = m_cimv2NS.GetObject("Win32_WMISetting=@");
|
|
|
|
// if the wmisetting class doesn't even exist....
|
|
if(!(bool)m_winMgmt)
|
|
{
|
|
// create what we can on the fly.
|
|
UpdateOldBuild();
|
|
|
|
// try again.
|
|
m_winMgmt = m_cimv2NS.GetObject("Win32_WMISetting=@");
|
|
}
|
|
m_settingHr = m_cimv2NS.m_hr;
|
|
}
|
|
else
|
|
{
|
|
m_osHr = m_rootThread.m_WbemServices.m_hr;
|
|
m_cpuHr = m_rootThread.m_WbemServices.m_hr;
|
|
m_settingHr = m_rootThread.m_WbemServices.m_hr;
|
|
}
|
|
|
|
// find security...
|
|
CWbemClassObject sysSec = m_rootThread.m_WbemServices.GetObject("__SystemSecurity=@");
|
|
if((bool)sysSec)
|
|
{
|
|
// its the new SD security
|
|
m_NSSecurity = true;
|
|
}
|
|
else
|
|
{
|
|
// its old fashioned namespace security.
|
|
m_rootSecNS = m_rootThread.m_WbemServices.OpenNamespace("security");
|
|
m_NSSecurity = false;
|
|
}
|
|
m_securityHr = m_rootThread.m_WbemServices.m_hr;
|
|
|
|
}
|
|
}
|
|
catch ( ... )
|
|
{
|
|
retval = WBEM_E_INITIALIZATION_FAILURE;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
#include "mofstr.inc"
|
|
#include "mofsec.inc"
|
|
|
|
HRESULT DataSource::UpdateOldBuild(void)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
UINT mofSize = strlen(CLASSMOF);
|
|
mofSize += strlen(INSTMOF);
|
|
|
|
char *mofStr = new char[mofSize + 2];
|
|
memset(mofStr, 0, mofSize + 2);
|
|
strcpy(mofStr, CLASSMOF);
|
|
strcat(mofStr, INSTMOF);
|
|
|
|
wchar_t svrNS[100] = {0};
|
|
|
|
wcscpy(svrNS,(LPCWSTR)m_rootThread.m_nameSpace); // this will point to \root.
|
|
wcscat(svrNS, L"\\cimv2");
|
|
|
|
IMofCompiler *pCompiler = NULL;
|
|
hr = CoCreateInstance(CLSID_MofCompiler, 0, CLSCTX_INPROC_SERVER,
|
|
IID_IMofCompiler, (LPVOID *) &pCompiler);
|
|
|
|
hr = pCompiler->CompileBuffer(strlen(mofStr), (LPBYTE)mofStr,
|
|
svrNS, //ServerAndNamespace,
|
|
NULL, //User,
|
|
NULL, //Authority,
|
|
NULL, //Password,
|
|
0, 0, 0, NULL); //lOptionFlags,lClassFlags, lInstanceFlags
|
|
|
|
delete[] mofStr;
|
|
|
|
// now for the security trick.
|
|
mofSize = strlen(SECMOF);
|
|
mofStr = new char[mofSize + 2];
|
|
strcpy(mofStr, SECMOF);
|
|
wcscpy(svrNS,(LPCWSTR)m_rootThread.m_nameSpace); // this will point to \root.
|
|
wcscat(svrNS, L"\\security");
|
|
|
|
hr = pCompiler->CompileBuffer(strlen(mofStr), (LPBYTE)mofStr,
|
|
svrNS, //ServerAndNamespace,
|
|
NULL, //User,
|
|
NULL, //Authority,
|
|
NULL, //Password,
|
|
0, 0, 0, NULL); //lOptionFlags,lClassFlags, lInstanceFlags
|
|
|
|
delete[] mofStr;
|
|
|
|
pCompiler->Release();
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::Disconnect(bool clearCredentials)
|
|
{
|
|
if(m_user.authIdent && clearCredentials)
|
|
{
|
|
m_rootThread.m_WbemServices.m_authIdent = 0;
|
|
m_cimv2NS.m_authIdent = 0;
|
|
m_rootSecNS.m_authIdent = 0;
|
|
|
|
WbemFreeAuthIdentity(m_user.authIdent);
|
|
m_user.authIdent = 0;
|
|
m_user.currUser = true;
|
|
memset(m_user.fullAcct, 0, FULLACCTSIZE * sizeof(TCHAR));
|
|
|
|
}
|
|
|
|
if(IsConnected())
|
|
{
|
|
m_rootSecNS.DisconnectServer();
|
|
m_cimv2NS.DisconnectServer();
|
|
|
|
// this is the root NS.
|
|
m_rootThread.DisconnectServer();
|
|
m_sessionID++;
|
|
}
|
|
|
|
if ((bool)m_winMgmt)
|
|
m_winMgmt = (IWbemClassObject *)NULL;
|
|
if ((bool)m_OS)
|
|
m_OS = (IWbemClassObject *)NULL;
|
|
if ((bool)m_cpu)
|
|
m_cpu = (IWbemClassObject *)NULL;
|
|
|
|
m_securityHr = E_FAIL;
|
|
m_osHr = E_FAIL;
|
|
m_cpuHr = E_FAIL;
|
|
m_settingHr = E_FAIL;
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
bool DataSource::IsConnected(void) const
|
|
{
|
|
return (m_rootThread.m_status == WbemServiceThread::ready);
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
bool DataSource::IsLocal(void) const
|
|
{
|
|
return (m_whackedMachineName.GetLength() == 0);
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
bool DataSource::IsAncient(void) const
|
|
{
|
|
return (!m_NSSecurity);
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
LOGIN_CREDENTIALS *DataSource::GetCredentials(void)
|
|
{
|
|
return &m_user;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
bstr_t DataSource::GetRootNS(void)
|
|
{
|
|
return m_rootSecNS.m_path;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
ISecurityInformation *DataSource::GetSI(struct NSNODE *nsNode)
|
|
{
|
|
ISecurityInformation *si = NULL;
|
|
|
|
// hacky fix for when we have a broken WMI for some reason.
|
|
// we can edit locally if we're on NT.
|
|
if(m_NSSecurity &&
|
|
((m_OSType == OSTYPE_WINNT) || (IsNT() && IsLocal())))
|
|
{
|
|
// access the acl methods.
|
|
//Check whether the namespace is already opened
|
|
if(nsNode->nsLoaded == false)
|
|
{
|
|
if(nsNode->sType == TYPE_SCOPE_INSTANCE)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
//Connect to the namespace now...
|
|
*(nsNode->ns) = nsNode->ns->OpenNamespace(nsNode->display);
|
|
if(nsNode->sType == TYPE_STATIC_INSTANCE)
|
|
{
|
|
//Now open the WbemClassObject with flags to read the __SD
|
|
if(nsNode->pclsObj != NULL)
|
|
{
|
|
delete nsNode->pclsObj;
|
|
}
|
|
nsNode->pclsObj = new CWbemClassObject();
|
|
*(nsNode->pclsObj) = nsNode->ns->GetObject(nsNode->relPath/*,Flag*/);
|
|
}
|
|
}
|
|
nsNode->nsLoaded = true;
|
|
}
|
|
|
|
bstr_t server = m_cpu.GetString("__SERVER");
|
|
si = new CSDSecurity(nsNode,server,IsLocal());
|
|
/* ns, m_user.authIdent,
|
|
path, display,
|
|
server, IsLocal());
|
|
*/
|
|
}
|
|
return si;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
// general tab.
|
|
HRESULT DataSource::GetCPU(CHString1 &cpu)
|
|
{
|
|
HRESULT hr = m_cpuHr;
|
|
|
|
if((bool)m_cpu)
|
|
{
|
|
cpu = (LPCTSTR)m_cpu.GetString("Name");
|
|
if(cpu.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetOS(CHString1 &os)
|
|
{
|
|
HRESULT hr = m_osHr;
|
|
|
|
if((bool)m_OS)
|
|
{
|
|
os = (LPCTSTR)m_OS.GetString("Caption");
|
|
if(os.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
HRESULT DataSource::GetOSVersion(CHString1 &ver)
|
|
{
|
|
HRESULT hr = m_osHr;
|
|
|
|
if((bool)m_OS)
|
|
{
|
|
TCHAR _scr1[100] = {0};
|
|
TCHAR _scr2[100] = {0};
|
|
|
|
// Build and set the serial number string
|
|
if (m_OS.GetBool("Debug"))
|
|
{
|
|
_scr1[0] = TEXT(' ');
|
|
LoadString(HINST_THISDLL, IDS_DEBUG, &(_scr1[1]), ARRAYSIZE(_scr1)-1);
|
|
}
|
|
else
|
|
{
|
|
_scr1[0] = TEXT('\0');
|
|
}
|
|
|
|
// Version.buildNumber (DEBUG).
|
|
_tcscpy(_scr2, (LPCTSTR)m_OS.GetString("Version"));
|
|
_sntprintf(_scr2, ARRAYSIZE(_scr2)-1, TEXT("%s%s"), _scr2, _scr1);
|
|
_scr2[ARRAYSIZE(_scr2)-1] = 0;
|
|
|
|
ver = (LPCTSTR)_scr2;
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
HRESULT DataSource::GetServicePackNumber(CHString1 &ServPack)
|
|
{
|
|
HRESULT hr = m_osHr;
|
|
|
|
if((bool)m_OS)
|
|
{
|
|
TCHAR _scr1[100] = {0};
|
|
_sntprintf(_scr1, ARRAYSIZE(_scr1)-1, TEXT("%ld.%ld"), m_OS.GetLong("ServicePackMajorVersion"), m_OS.GetLong("ServicePackMinorVersion"));
|
|
|
|
_scr1[ARRAYSIZE(_scr1)-1] = 0;
|
|
|
|
ServPack = (LPCTSTR)_scr1;
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetBldNbr(CHString1 &bldNbr)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
bldNbr = (LPCTSTR)m_winMgmt.GetString("BuildVersion");
|
|
if(bldNbr.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetInstallDir(CHString1 &dir)
|
|
{
|
|
bstr_t value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
dir = (LPCTSTR)m_winMgmt.GetString("InstallationDirectory");
|
|
if(dir.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetDBDir(CHString1 &dir)
|
|
{
|
|
bstr_t value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
dir = (LPCTSTR)m_winMgmt.GetString("DatabaseDirectory");
|
|
if(dir.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetBackupInterval(UINT &interval)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
interval = m_winMgmt.GetLongEx("BackupInterval");
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetBackupInterval(UINT interval)
|
|
{
|
|
CHString1 value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
hr = m_winMgmt.PutEx("BackupInterval", (long)interval);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetLastBackup(CHString1 &time)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
bstr_t dmtf;
|
|
if((bool)m_winMgmt)
|
|
{
|
|
hr = m_winMgmt.GetDateTimeFormat("BackupLastTime", dmtf);
|
|
if(SUCCEEDED(hr))
|
|
time = (LPCTSTR)dmtf;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
// logging tab.
|
|
HRESULT DataSource::GetLoggingStatus(LOGSTATUS &status)
|
|
{
|
|
bstr_t temp;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
status = (LOGSTATUS)m_winMgmt.GetLongEx("LoggingLevel");
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetLoggingStatus(LOGSTATUS status)
|
|
{
|
|
CHString1 value;
|
|
bstr_t temp;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
hr = m_winMgmt.PutEx("LoggingLevel", (long)status);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetLoggingSize(ULONG &size)
|
|
{
|
|
bstr_t value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
size = m_winMgmt.GetLongEx("MaxLogFileSize");
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetLoggingSize(const ULONG size)
|
|
{
|
|
CHString1 value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
hr = m_winMgmt.PutEx("MaxLogFileSize", (long)size);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetDBLocation(CHString1 &dir)
|
|
{
|
|
bstr_t value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
dir = (LPCTSTR)m_winMgmt.GetString("DatabaseDirectory");
|
|
if(dir.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetLoggingLocation(CHString1 &dir)
|
|
{
|
|
bstr_t value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
CHString1 dir2;
|
|
dir2 = (LPCTSTR)m_winMgmt.GetString("LoggingDirectory");
|
|
TCHAR temp[_MAX_PATH] = {0};
|
|
_tcscpy(temp, (LPCTSTR)dir2);
|
|
PathAddBackslash(temp);
|
|
dir = temp;
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetLoggingLocation(CHString1 dir)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
bstr_t value = dir;
|
|
|
|
if((bool)m_winMgmt && dir.GetLength() != 0)
|
|
{
|
|
hr = m_winMgmt.Put("LoggingDirectory", (bstr_t)(LPCTSTR)dir);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
#define WIN32_DIRECTORY _T("Win32_directory=\"")
|
|
//----------------------------------------------------------
|
|
bool DataSource::IsValidDir(CHString1 &dir)
|
|
{
|
|
bool retval = true;
|
|
|
|
if((bool)m_cimv2NS)
|
|
{
|
|
// double the whacks because wmi has bad syntax.
|
|
TCHAR cooked[_MAX_PATH * 2] = {0};
|
|
TCHAR input[_MAX_PATH] = {0};
|
|
TCHAR path[_MAX_PATH * 2 + ARRAYSIZE(WIN32_DIRECTORY) + 1] = {0};
|
|
|
|
int len = dir.GetLength();
|
|
|
|
_tcscpy(input, (LPCTSTR)dir);
|
|
_tcscpy(path, WIN32_DIRECTORY);
|
|
|
|
for(int x = 0; x < len; x++)
|
|
{
|
|
_tcsncat(cooked, &input[x], 1);
|
|
|
|
// if its a whack...
|
|
if(input[x] == _T('\\'))
|
|
{
|
|
// have another pleeb.
|
|
_tcscat(cooked, _T("\\"));
|
|
}
|
|
} //endfor
|
|
|
|
_tcscat(path, cooked);
|
|
path[_tcslen(path) - 2] = 0;
|
|
_tcscat(path, _T("\""));
|
|
|
|
CWbemClassObject inst = m_cimv2NS.GetObject(path);
|
|
retval = (bool)inst;
|
|
}
|
|
else //can't check, assume it's valid and let it through
|
|
{
|
|
// //warn & maybe.
|
|
// retval = false;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
#define CIM_LOGICALFILE _T("CIM_LogicalFile=\"")
|
|
//----------------------------------------------------------
|
|
bool DataSource::IsValidFile(LPCTSTR szDir)
|
|
{
|
|
TCHAR szBuffer[MAX_PATH * 2 + ARRAYSIZE(CIM_LOGICALFILE) + 1]; //size should accommodate additional escapes
|
|
|
|
bool retval = true;
|
|
if((bool)m_cimv2NS)
|
|
{
|
|
_tcscpy(szBuffer, CIM_LOGICALFILE);
|
|
TCHAR * psz = szBuffer + ARRAYSIZE(CIM_LOGICALFILE) - 1;
|
|
|
|
while (*psz = *szDir)
|
|
{
|
|
if (*szDir == _T('\\'))
|
|
{
|
|
*psz++ = _T('\\');
|
|
*psz = _T('\\');
|
|
}
|
|
psz++;
|
|
szDir++;
|
|
}
|
|
*psz++ = _T('\"');
|
|
*psz = _T('\0');
|
|
|
|
CWbemClassObject inst = m_cimv2NS.GetObject(szBuffer);
|
|
retval = (bool)inst;
|
|
}
|
|
else //can't check, assume it's valid and let it through
|
|
{
|
|
// //warn & maybe.
|
|
// retval = false;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
bool DataSource::CanBrowseFS(void) const
|
|
{
|
|
return IsLocal();
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
// advanced tab.
|
|
HRESULT DataSource::GetScriptASPEnabled(bool &enabled)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
enabled = m_winMgmt.GetBoolEx("ASPScriptEnabled");
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetScriptASPEnabled(bool &enabled)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
m_winMgmt.PutEx("ASPScriptEnabled", enabled);
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetAnonConnections(bool &enabled)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
enabled = m_winMgmt.GetBoolEx("EnableAnonWin9xConnections");
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetAnonConnections(bool &enabled)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
m_winMgmt.PutEx("EnableAnonWin9xConnections", enabled);
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
|
|
HRESULT DataSource::GetScriptDefNS(CHString1 &ns)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
bstr_t value;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
ns = (LPCTSTR)m_winMgmt.GetString("ASPScriptDefaultNamespace");
|
|
if(ns.GetLength() != 0)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetScriptDefNS(LPCTSTR ns)
|
|
{
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
hr = m_winMgmt.Put("ASPScriptDefaultNamespace", (bstr_t)(LPCTSTR)ns);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::GetRestart(RESTART &restart)
|
|
{
|
|
bstr_t value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
restart = (RESTART)m_winMgmt.GetLongEx("AutoStartWin9X");
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::SetRestart(RESTART restart)
|
|
{
|
|
CHString1 value;
|
|
HRESULT hr = m_settingHr;
|
|
|
|
if((bool)m_winMgmt)
|
|
{
|
|
hr = m_winMgmt.PutEx("AutoStartWin9X", (long)restart);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
HRESULT DataSource::PutWMISetting(BOOL refresh)
|
|
{
|
|
HRESULT hr = m_cimv2NS.PutInstance(m_winMgmt);
|
|
|
|
if(refresh)
|
|
m_winMgmt = m_cimv2NS.GetObject("Win32_WMISetting=@");
|
|
|
|
return hr;
|
|
}
|
|
|
|
//----------------------------------------------------------
|
|
//----------------------------------------------------------
|
|
// NAMESPACE CACHE -----------------------------------------
|
|
LPTSTR DataSource::CopyString( LPTSTR pszSrc )
|
|
{
|
|
LPTSTR pszDst = NULL;
|
|
|
|
if (pszSrc != NULL)
|
|
{
|
|
pszDst = new TCHAR[(lstrlen(pszSrc) + 1)];
|
|
if (pszDst)
|
|
{
|
|
lstrcpy( pszDst, pszSrc );
|
|
}
|
|
}
|
|
|
|
return pszDst;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void DataSource::DeleteAllNodes(void)
|
|
{
|
|
DeleteNode(&m_NSCache);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void DataSource::DeleteNode(NSNODE *node)
|
|
{
|
|
if(node)
|
|
{
|
|
delete[] node->display;
|
|
delete[] node->fullPath;
|
|
node->ns = 0;
|
|
|
|
int size = node->children.GetSize();
|
|
// walk the children.
|
|
for(int x = 0; x < size; x++)
|
|
{
|
|
struct NSNODE *child = node->children[x];
|
|
DeleteNode(child);
|
|
}
|
|
|
|
if(node != &m_NSCache)
|
|
{
|
|
delete node;
|
|
}
|
|
else
|
|
{
|
|
m_NSCache.children.RemoveAll();
|
|
}
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
void DataSource::LoadImageList(HWND hTree)
|
|
{
|
|
|
|
if(m_hImageList == 0)
|
|
{
|
|
// create an empty imagelist.
|
|
m_hImageList = ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 3, 0);
|
|
|
|
// add an icon
|
|
m_folderIcon = ImageList_AddIcon(m_hImageList,
|
|
LoadIcon(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDI_CLSD_FOLDER)));
|
|
|
|
m_earthIcon = ImageList_AddIcon(m_hImageList,
|
|
LoadIcon(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDI_EARTH)));
|
|
m_classIcon = ImageList_AddIcon(m_hImageList,
|
|
LoadIcon(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDI_CLSD_CLASS)));
|
|
m_instanceIcon = ImageList_AddIcon(m_hImageList,
|
|
LoadIcon(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDI_CLSD_INSTANCE)));
|
|
m_scopeInstanceIcon = ImageList_AddIcon(m_hImageList,
|
|
LoadIcon(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDI_CLSD_SCOPEINSTANCE)));
|
|
m_scopeClassIcon = ImageList_AddIcon(m_hImageList,
|
|
LoadIcon(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDI_CLSD_SCOPECLASS)));
|
|
}
|
|
|
|
// sent it to the tree.
|
|
TreeView_SetImageList(hTree, m_hImageList, TVSIL_NORMAL);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
HRESULT DataSource::LoadNode(HWND hTree, HTREEITEM hItem /* = TVI_ROOT */,
|
|
int flags)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
// loading the root?
|
|
if(hItem == TVI_ROOT)
|
|
{
|
|
// initialize the node.
|
|
m_NSCache.display = CopyString(_T("Root"));
|
|
m_NSCache.fullPath = CopyString(_T("Root"));
|
|
m_NSCache.ns = &m_rootThread.m_WbemServices;
|
|
m_NSCache.hideMe = false;
|
|
m_NSCache.sType = TYPE_NAMESPACE;
|
|
|
|
ITEMEXTRA *extra = new ITEMEXTRA;
|
|
if(extra == NULL)
|
|
return E_FAIL;
|
|
extra->nsNode = &m_NSCache;
|
|
extra->loaded = false;
|
|
|
|
// initialize the invariant parts.
|
|
TVINSERTSTRUCT tvInsert;
|
|
tvInsert.hParent = TVI_ROOT;
|
|
tvInsert.hInsertAfter = TVI_SORT;
|
|
tvInsert.item.mask = TVIF_TEXT | TVIF_CHILDREN |TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
|
tvInsert.item.hItem = 0;
|
|
tvInsert.item.state = 0;
|
|
tvInsert.item.iImage = FolderIcon();
|
|
tvInsert.item.iSelectedImage = FolderIcon();
|
|
tvInsert.item.stateMask = 0;
|
|
tvInsert.item.cChildren = (flags == ROOT_ONLY? 0: 1);
|
|
tvInsert.item.pszText = CopyString(m_NSCache.display);
|
|
|
|
if (!tvInsert.item.pszText)
|
|
{
|
|
delete extra;
|
|
return E_FAIL;
|
|
}
|
|
|
|
tvInsert.item.cchTextMax = _tcslen(tvInsert.item.pszText);
|
|
tvInsert.item.lParam = (LPARAM)extra;
|
|
|
|
HTREEITEM hItem2;
|
|
hItem2 = TreeView_InsertItem(hTree, &tvInsert);
|
|
hr = (hItem != 0 ? S_OK : E_FAIL);
|
|
}
|
|
else if(flags != ROOT_ONLY) // expanding an existing node.
|
|
{
|
|
TV_ITEM item;
|
|
struct NSNODE *node = NULL;
|
|
// find the cached node.
|
|
item.mask = TVIF_PARAM | TVIF_CHILDREN;
|
|
item.hItem = hItem;
|
|
BOOL x = TreeView_GetItem(hTree, &item);
|
|
|
|
ITEMEXTRA *extra = (ITEMEXTRA *)item.lParam;
|
|
node = extra->nsNode;
|
|
|
|
// are the kids in the cache??
|
|
/* int size = node->children.GetSize();
|
|
ATLTRACE(_T("NODE STATE: %d, %d\n"), size, extra->loaded);
|
|
if((size == 0) &&
|
|
(extra->loaded == false))
|
|
*/
|
|
if(extra->loaded == false)
|
|
{
|
|
//Now delete all the children in the cache as they might be due to a previously cancelled enumeration
|
|
node->children.RemoveAll();
|
|
// nope!!! Enum that 'node' to the cache.
|
|
// ShowControls(true);
|
|
hr = PopulateCacheNode(hTree,hItem,extra);
|
|
// NOTE: empties will be WBEM_E_NOT_FOUND here.
|
|
}
|
|
|
|
/* // got kids now?
|
|
size = node->children.GetSize();
|
|
if(size == 0)
|
|
{
|
|
// get rid of the plus sign.
|
|
item.mask = TVIF_CHILDREN;
|
|
item.cChildren = 0;
|
|
TreeView_SetItem(hTree, &item);
|
|
}
|
|
else if(extra->loaded == false) // && size != 0
|
|
{
|
|
// load the tree now.
|
|
hr = PopulateTreeNode(hTree, hItem, node, flags);
|
|
extra->loaded = true;
|
|
}
|
|
*/
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
bool DataSource::MFLNamepace(LPTSTR name)
|
|
{
|
|
bool t1 = (_tcslen(name) == 6); // just the right length...
|
|
bool t2 = (_tcsnicmp(name, _T("MS_"), 3) == 0); // starts right...
|
|
int scan = _tcsspn(&name[3], _T("0123456789"));
|
|
bool t3 = (scan == 3);
|
|
|
|
return t1 && t2 && t3;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
HRESULT DataSource::PopulateCacheNode(HWND hTreeWnd,HTREEITEM hItem,struct ITEMEXTRA *extra)
|
|
{
|
|
// load up the principals.
|
|
IWbemClassObject *inst = NULL;
|
|
IEnumWbemClassObject *nsEnum = NULL;
|
|
|
|
ULONG uReturned = 0;
|
|
HRESULT hr = E_FAIL;
|
|
HRESULT hr1 = E_FAIL;
|
|
|
|
struct NSNODE *parent= extra->nsNode;
|
|
|
|
CWbemServices *ns = NULL;
|
|
extra->loaded = true;
|
|
|
|
switch(parent->sType)
|
|
{
|
|
case TYPE_NAMESPACE:
|
|
{
|
|
//Check whether the namespace is already opened
|
|
if(parent->nsLoaded == false)
|
|
{
|
|
//Connect to the namespace now...
|
|
*(parent->ns) = parent->ns->OpenNamespace(parent->display);
|
|
parent->nsLoaded = true;
|
|
}
|
|
ns = parent->ns;
|
|
|
|
//Create the Namespace Enum
|
|
CAsyncObjectSink *objSinkNS;
|
|
objSinkNS = new CAsyncObjectSink(hTreeWnd,hItem,parent,this,ENUM_NAMESPACE);
|
|
if (objSinkNS != NULL)
|
|
{
|
|
IWbemObjectSink *pSyncStubNS = NULL;
|
|
hr = GetAsyncSinkStub(objSinkNS,&pSyncStubNS);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
objSinkNS->SetSinkStub(pSyncStubNS);
|
|
hr = ns->CreateInstanceEnumAsync(L"__namespace",pSyncStubNS);
|
|
pSyncStubNS->Release();
|
|
|
|
if (parent->objSink != NULL)
|
|
{
|
|
((CAsyncObjectSink *)parent->objSink)->SetSinkStub(NULL);
|
|
parent->objSink->Release();
|
|
}
|
|
|
|
parent->objSink = NULL;
|
|
|
|
if (parent->objSinkNS != NULL)
|
|
{
|
|
((CAsyncObjectSink *)parent->objSinkNS)->SetSinkStub(NULL);
|
|
parent->objSinkNS->Release();
|
|
}
|
|
parent->objSinkNS = objSinkNS;
|
|
parent->objSinkNS->AddRef();
|
|
}
|
|
else
|
|
delete objSinkNS;
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
asyncList.push_back(extra);
|
|
}
|
|
else
|
|
{
|
|
//Some problem with the enumerations. So remove the Plus sign as no nodes will be populated
|
|
RemovePlus(hTreeWnd,hItem);
|
|
}
|
|
break;
|
|
}
|
|
case TYPE_SCOPE_CLASS:
|
|
case TYPE_STATIC_CLASS:
|
|
{
|
|
//Check whether the namespace is already opened
|
|
if(parent->nsLoaded == false)
|
|
{
|
|
//Connect to the namespace now...
|
|
*(parent->ns) = parent->ns->OpenNamespace(parent->display);
|
|
parent->nsLoaded = true;
|
|
}
|
|
ns = parent->ns;
|
|
//Since we can set the secutiry for the static Instances Enumerate the Instances of this static class now
|
|
CAsyncObjectSink *objSink;
|
|
objSink = new CAsyncObjectSink(hTreeWnd,hItem,parent,this,ENUM_INSTANCE);
|
|
if (objSink != NULL)
|
|
{
|
|
IWbemObjectSink *pSyncStub = NULL;
|
|
hr = GetAsyncSinkStub(objSink,&pSyncStub);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
objSink->SetSinkStub(pSyncStub);
|
|
hr = ns->CreateInstanceEnumAsync(parent->display,pSyncStub);
|
|
pSyncStub->Release();
|
|
|
|
if (parent->objSink != NULL)
|
|
{
|
|
((CAsyncObjectSink *)parent->objSink)->SetSinkStub(NULL);
|
|
parent->objSink->Release();
|
|
}
|
|
|
|
parent->objSink = objSink;
|
|
parent->objSink->AddRef();
|
|
}
|
|
else
|
|
delete objSink;
|
|
}
|
|
else
|
|
hr = E_OUTOFMEMORY;
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
//Some problem with the enumeration. So remove the Plus sign as no nodes will be populated
|
|
RemovePlus(hTreeWnd,hItem);
|
|
}
|
|
else
|
|
{
|
|
asyncList.push_back(extra);
|
|
}
|
|
break;
|
|
}
|
|
case TYPE_SCOPE_INSTANCE:
|
|
{
|
|
//Check whether the namespace is already opened
|
|
/* if(parent->nsLoaded == false)
|
|
{
|
|
IWbemServices *pServ = NULL;
|
|
// IWbemServicesEx *pServEx = NULL,*pServEx1 = NULL;
|
|
//Connect to the scope now.
|
|
pServ = m_rootThread.m_WbemServices.m_pService;
|
|
// hr = pServ->QueryInterface(IID_IWbemServicesEx,(void **)&pServEx);
|
|
// if(SUCCEEDED(hr))
|
|
{
|
|
// parent->pServicesEx = NULL;
|
|
TCHAR strTemp[1024];
|
|
_tcscpy(strTemp,_T("ScopeClass.Name=\"ScopeInst1\""));
|
|
//Now open the scope
|
|
hr = pServEx->Open(strTemp,0,0,NULL,&pServEx1,NULL);
|
|
// hr = pServEx->Open(parent->fullPath,NULL,0,NULL,&pServEx1,NULL);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
//Now we have opened the scope
|
|
parent->nsLoaded = true;
|
|
|
|
//Enumerate the Instances in the scope now
|
|
CAsyncObjectSink *objSink;
|
|
parent->objSink = new CAsyncObjectSink(hTreeWnd,hItem,parent,this,ENUM_SCOPE_INSTANCE);
|
|
IWbemObjectSink *pSyncStub = NULL;
|
|
GetAsyncSinkStub(parent->objSink,&pSyncStub);
|
|
objSink = (CAsyncObjectSink *)parent->objSink;
|
|
objSink->SetSinkStub(pSyncStub);
|
|
hr = parent->pServicesEx->CreateInstanceEnumAsync(L"",0,NULL,pSyncStub);
|
|
pSyncStub->Release();
|
|
if(FAILED(hr))
|
|
{
|
|
//Some problem with the enumeration. So remove the Plus sign as no nodes will be populated
|
|
RemovePlus(hTreeWnd,hItem);
|
|
}
|
|
else
|
|
{
|
|
asyncList.push_back(extra);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if(parent->nsLoaded == false)
|
|
{
|
|
//Do we have to display an error message here???
|
|
MessageBox(NULL,_T("Unable to open scope"),_T("NULL"),MB_OK);
|
|
}
|
|
*/
|
|
break;
|
|
}
|
|
case TYPE_DYNAMIC_CLASS:
|
|
{
|
|
//The control should not come here. Even if it comes we won't do anything
|
|
break;
|
|
}
|
|
case TYPE_STATIC_INSTANCE:
|
|
{
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
HRESULT DataSource::PopulateTreeNode(HWND hTree, HTREEITEM hParentItem,
|
|
struct NSNODE *parent,
|
|
int flags)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if(parent)
|
|
{
|
|
// initialize the invariant parts.
|
|
TVINSERTSTRUCT tvInsert;
|
|
tvInsert.hParent = hParentItem;
|
|
tvInsert.hInsertAfter = TVI_SORT;
|
|
tvInsert.item.hItem = 0;
|
|
tvInsert.item.state = 0;
|
|
tvInsert.item.iImage = 1;
|
|
tvInsert.item.stateMask = 0;
|
|
|
|
int size = parent->children.GetSize();
|
|
|
|
if(size == 0)
|
|
return WBEM_E_NOT_FOUND;
|
|
|
|
hr = E_FAIL; // in case we bounce right over the for(...).
|
|
|
|
// walk the children.
|
|
for(int x = 0; x < size; x++)
|
|
{
|
|
struct NSNODE *child = parent->children[x];
|
|
|
|
if(!((flags == HIDE_SOME) && child->hideMe) )
|
|
{
|
|
|
|
ATLTRACE(_T("NStree: %s %s\n"), parent->display, child->display);
|
|
|
|
tvInsert.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
|
tvInsert.item.pszText = CopyString(child->display);
|
|
if (!tvInsert.item.pszText)
|
|
return E_FAIL;
|
|
|
|
tvInsert.item.cchTextMax = _tcslen(tvInsert.item.pszText);
|
|
|
|
ITEMEXTRA *extra = new ITEMEXTRA;
|
|
if(extra == NULL)
|
|
return E_FAIL;
|
|
extra->nsNode = child;
|
|
extra->loaded = false;
|
|
|
|
tvInsert.item.lParam = (LPARAM)extra;
|
|
tvInsert.item.cChildren = 1;
|
|
if(MFLNamepace(child->display))
|
|
{
|
|
tvInsert.item.iImage = EarthIcon();
|
|
tvInsert.item.iSelectedImage = EarthIcon();
|
|
}
|
|
else
|
|
{
|
|
if((child->sType == TYPE_DYNAMIC_CLASS) || (child->sType == TYPE_STATIC_CLASS))
|
|
{
|
|
tvInsert.item.iImage = ClassIcon();
|
|
tvInsert.item.iSelectedImage = ClassIcon();
|
|
}
|
|
else
|
|
{ //Defaulted to Namespace
|
|
tvInsert.item.iImage = FolderIcon();
|
|
tvInsert.item.iSelectedImage = FolderIcon();
|
|
}
|
|
}
|
|
|
|
// Insert principal into list.
|
|
HTREEITEM hItem2;
|
|
hItem2 = TreeView_InsertItem(hTree, &tvInsert);
|
|
}
|
|
|
|
} //endwhile
|
|
|
|
hr = S_OK;
|
|
} //endif (bool)ns
|
|
|
|
return hr;
|
|
}
|
|
|
|
void DataSource::InsertNamespaceNode(HWND hTreeWnd,HTREEITEM hItem,struct NSNODE *parent, IWbemClassObject *pclsObj)
|
|
{
|
|
|
|
std::auto_ptr<NSNODE> AutoNode(new struct NSNODE);
|
|
NSNODE *node = AutoNode.get();
|
|
|
|
if (NULL == node ) return;
|
|
|
|
CWbemClassObject easy(pclsObj);
|
|
bstr_t name = easy.GetString("Name");
|
|
bstr_t path = easy.GetString("__NAMESPACE");
|
|
bstr_t full = path + _T("\\");
|
|
full += name;
|
|
bstr_t relPath = easy.GetString("__RELPATH");
|
|
|
|
node->fullPath = CopyString(full);
|
|
node->relPath = CopyString(relPath);
|
|
node->display = CopyString(name);
|
|
node->hideMe = false; //HideableNode(node->display);
|
|
node->nsLoaded = false;
|
|
node->sType = TYPE_NAMESPACE;
|
|
parent->children.Add(node);
|
|
AutoNode.release();
|
|
node->ns = new CWbemServices(*(parent->ns));
|
|
|
|
//Now add the node to the tree
|
|
TVINSERTSTRUCT tvInsert;
|
|
tvInsert.hParent = hItem;
|
|
tvInsert.hInsertAfter = TVI_SORT;
|
|
tvInsert.item.hItem = 0;
|
|
tvInsert.item.state = 0;
|
|
tvInsert.item.iImage = 1;
|
|
tvInsert.item.stateMask = 0;
|
|
|
|
ITEMEXTRA *extra = new ITEMEXTRA;
|
|
if(extra == NULL)
|
|
return;
|
|
extra->nsNode = node;
|
|
extra->loaded = false;
|
|
|
|
tvInsert.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
|
tvInsert.item.pszText = CopyString(node->display);
|
|
tvInsert.item.cchTextMax = _tcslen(tvInsert.item.pszText);
|
|
tvInsert.item.lParam = (LPARAM)extra;
|
|
tvInsert.item.cChildren = 1;
|
|
if(MFLNamepace(node->display))
|
|
{
|
|
tvInsert.item.iImage = EarthIcon();
|
|
tvInsert.item.iSelectedImage = EarthIcon();
|
|
}
|
|
else
|
|
{
|
|
tvInsert.item.iImage = FolderIcon();
|
|
tvInsert.item.iSelectedImage = FolderIcon();
|
|
}
|
|
|
|
// Insert principal into list.
|
|
HTREEITEM hItem2;
|
|
hItem2 = TreeView_InsertItem(hTreeWnd, &tvInsert);
|
|
}
|
|
|
|
void DataSource::InsertClassNode(HWND hTreeWnd,HTREEITEM hItem,struct NSNODE *parent, IWbemClassObject *pclsObj)
|
|
{
|
|
IWbemQualifierSet *qSet;
|
|
pclsObj->GetQualifierSet(&qSet);
|
|
VARIANT vt;
|
|
VariantInit(&vt);
|
|
HRESULT hr = qSet->Get(L"Abstract",0,&vt,NULL);
|
|
|
|
if(hr != WBEM_E_NOT_FOUND)
|
|
{
|
|
if(vt.boolVal == VARIANT_TRUE)
|
|
{
|
|
qSet->Release();
|
|
return;
|
|
}
|
|
}
|
|
|
|
std::auto_ptr<NSNODE> AutoNode(new struct NSNODE);
|
|
|
|
NSNODE *node = AutoNode.get();
|
|
|
|
if( NULL == node ) return;
|
|
|
|
CWbemClassObject easy(pclsObj);
|
|
bstr_t name = easy.GetString("__CLASS");
|
|
bstr_t path = easy.GetString("__PATH");
|
|
bstr_t relPath = easy.GetString("__RELPATH");
|
|
|
|
node->fullPath = CopyString(path);
|
|
node->relPath = CopyString(relPath);
|
|
node->display = CopyString(name);
|
|
node->hideMe = false;
|
|
node->nsLoaded = true;
|
|
|
|
VariantClear(&vt);
|
|
hr = qSet->Get(L"Dynamic",0,&vt,NULL);
|
|
if((hr != WBEM_E_NOT_FOUND) && (vt.boolVal == VARIANT_TRUE))
|
|
{
|
|
node->sType = TYPE_DYNAMIC_CLASS;
|
|
node->ns = NULL;
|
|
}
|
|
else
|
|
{
|
|
//Now check whether it is a scope class
|
|
hr = qSet->Get(L"Scope",0,&vt,NULL);
|
|
if((hr != WBEM_E_NOT_FOUND) && (vt.boolVal == VARIANT_TRUE))
|
|
{
|
|
//This class is marked as scope. So all instances of this class can be scopes
|
|
node->sType = TYPE_SCOPE_CLASS;
|
|
}
|
|
else
|
|
{
|
|
//It is a static class
|
|
node->sType = TYPE_STATIC_CLASS;
|
|
}
|
|
node->ns = new CWbemServices(*(parent->ns));
|
|
node->pclsObj = new CWbemClassObject(pclsObj);
|
|
}
|
|
|
|
parent->children.Add(node);
|
|
AutoNode.release();
|
|
|
|
//Now Add the node to the Tree
|
|
TVINSERTSTRUCT tvInsert;
|
|
tvInsert.hParent = hItem;
|
|
tvInsert.hInsertAfter = TVI_SORT;
|
|
tvInsert.item.hItem = 0;
|
|
tvInsert.item.state = 0;
|
|
tvInsert.item.iImage = 1;
|
|
tvInsert.item.stateMask = 0;
|
|
|
|
ITEMEXTRA *extra = new ITEMEXTRA;
|
|
if(extra == NULL)
|
|
return;
|
|
extra->nsNode = node;
|
|
extra->loaded = false;
|
|
|
|
tvInsert.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
|
tvInsert.item.pszText = CopyString(node->display);
|
|
tvInsert.item.cchTextMax = _tcslen(tvInsert.item.pszText);
|
|
tvInsert.item.lParam = (LPARAM)extra;
|
|
if(node->sType == TYPE_DYNAMIC_CLASS)
|
|
{
|
|
//Remove the plus sign for the Dynamic Classes
|
|
tvInsert.item.cChildren = 0;
|
|
}
|
|
else
|
|
{
|
|
tvInsert.item.cChildren = 1;
|
|
}
|
|
|
|
if(node->sType == TYPE_SCOPE_CLASS)
|
|
{
|
|
tvInsert.item.iImage = ScopeClassIcon();
|
|
tvInsert.item.iSelectedImage = ScopeClassIcon();
|
|
}
|
|
else
|
|
{
|
|
tvInsert.item.iImage = ClassIcon();
|
|
tvInsert.item.iSelectedImage = ClassIcon();
|
|
}
|
|
|
|
// Insert principal into list.
|
|
HTREEITEM hItem2;
|
|
hItem2 = TreeView_InsertItem(hTreeWnd, &tvInsert);
|
|
|
|
}
|
|
|
|
void DataSource::InsertInstanceNode(HWND hTreeWnd,HTREEITEM hItem,struct NSNODE *parent, IWbemClassObject *pclsObj)
|
|
{
|
|
TCHAR strKey[10240];
|
|
struct NSNODE *node = new struct NSNODE;
|
|
|
|
CWbemClassObject easy(pclsObj);
|
|
HRESULT hr = E_FAIL;
|
|
_bstr_t strName;
|
|
_variant_t vtValue;
|
|
VARIANT Value;
|
|
_tcscpy(strKey,_T(""));
|
|
VariantInit(&Value);
|
|
bool bfirstTime = true;
|
|
//Now Enumerate the Keys and for a name like "key1,key2,key3,..."
|
|
if(SUCCEEDED(hr = pclsObj->BeginEnumeration(WBEM_FLAG_KEYS_ONLY)))
|
|
{
|
|
while(pclsObj->Next(0,NULL,&Value,NULL,NULL) != WBEM_S_NO_MORE_DATA)
|
|
{
|
|
vtValue = Value;
|
|
if(bfirstTime)
|
|
{
|
|
bfirstTime = false;
|
|
}
|
|
else
|
|
{
|
|
_tcscat(strKey,_T(","));
|
|
}
|
|
vtValue.ChangeType(VT_BSTR,NULL);
|
|
_bstr_t temp = _bstr_t(vtValue); //for PREFIX
|
|
if (!temp)
|
|
return;
|
|
_tcscat(strKey,temp);
|
|
VariantClear(&Value);
|
|
}
|
|
}
|
|
if(_tcscmp(strKey,_T("")) == 0)
|
|
{
|
|
//Some Problem or it is the instance of a singleton class
|
|
_tcscpy(strKey,_T("@"));
|
|
}
|
|
|
|
bstr_t name = strKey;
|
|
bstr_t path = easy.GetString("__PATH");
|
|
bstr_t relPath = easy.GetString("__RELPATH");
|
|
|
|
node->fullPath = CopyString(path);
|
|
node->relPath = CopyString(relPath);
|
|
node->display = CopyString(name);
|
|
node->hideMe = false;
|
|
node->nsLoaded = false;
|
|
node->ns = new CWbemServices(*(parent->ns));
|
|
if(parent->sType == TYPE_SCOPE_CLASS)
|
|
{
|
|
node->sType = TYPE_SCOPE_INSTANCE;
|
|
}
|
|
else
|
|
{
|
|
node->sType = TYPE_STATIC_INSTANCE;
|
|
}
|
|
node->pclsObj = new CWbemClassObject(pclsObj);
|
|
|
|
parent->children.Add(node);
|
|
|
|
TVITEM item;
|
|
item.mask = TVIF_CHILDREN | TVIF_HANDLE;
|
|
item.hItem = hItem;
|
|
item.cChildren = 1;
|
|
TreeView_SetItem(hTreeWnd, &item);
|
|
|
|
//Now Add the node to the Tree
|
|
TVINSERTSTRUCT tvInsert;
|
|
tvInsert.hParent = hItem;
|
|
tvInsert.hInsertAfter = TVI_SORT;
|
|
tvInsert.item.hItem = 0;
|
|
tvInsert.item.state = 0;
|
|
tvInsert.item.iImage = 1;
|
|
tvInsert.item.stateMask = 0;
|
|
|
|
ITEMEXTRA *extra = new ITEMEXTRA;
|
|
if(extra == NULL)
|
|
return;
|
|
extra->nsNode = node;
|
|
extra->loaded = false;
|
|
|
|
tvInsert.item.mask = TVIF_TEXT | TVIF_CHILDREN | TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
|
|
tvInsert.item.pszText = CopyString(node->display);
|
|
tvInsert.item.cchTextMax = _tcslen(tvInsert.item.pszText);
|
|
tvInsert.item.lParam = (LPARAM)extra;
|
|
if(node->sType == TYPE_SCOPE_INSTANCE)
|
|
{
|
|
tvInsert.item.iImage = ScopeInstanceIcon();
|
|
tvInsert.item.iSelectedImage = ScopeInstanceIcon();
|
|
tvInsert.item.cChildren = 1;
|
|
}
|
|
else
|
|
{
|
|
tvInsert.item.iImage = InstanceIcon();
|
|
tvInsert.item.iSelectedImage = InstanceIcon();
|
|
tvInsert.item.cChildren = 0; //Since these are regular static instances, remove the plus sign
|
|
}
|
|
|
|
// Insert principal into list.
|
|
HTREEITEM hItem2;
|
|
hItem2 = TreeView_InsertItem(hTreeWnd, &tvInsert);
|
|
}
|
|
|
|
void DataSource::InsertScopeInstanceNode(HWND hTreeWnd,HTREEITEM hItem,struct NSNODE *parent, IWbemClassObject *pclsObj)
|
|
{
|
|
}
|
|
|
|
void DataSource::RemovePlus(HWND hTreeWnd,HTREEITEM hItem)
|
|
{
|
|
// get rid of the plus sign.
|
|
TVITEM item;
|
|
item.mask = TVIF_CHILDREN | TVIF_HANDLE;
|
|
item.hItem = hItem;
|
|
item.cChildren = 0;
|
|
TreeView_SetItem(hTreeWnd, &item);
|
|
}
|
|
|
|
void DataSource::CancelAllAsyncCalls()
|
|
{
|
|
struct NSNODE *pNode;
|
|
ASYNCLIST::iterator iter = asyncList.begin();
|
|
TV_ITEM item;
|
|
ITEMEXTRA *extra;
|
|
CAsyncObjectSink *objSink;
|
|
|
|
for(;iter != asyncList.end();iter++)
|
|
{
|
|
extra = *iter;
|
|
pNode = extra->nsNode;
|
|
|
|
if(pNode->objSinkNS != NULL)
|
|
{
|
|
objSink = (CAsyncObjectSink *)pNode->objSinkNS;
|
|
|
|
if (objSink->GetSinkStub() != NULL)
|
|
{
|
|
HRESULT hr = pNode->ns->CancelAsyncCall(objSink->GetSinkStub());
|
|
|
|
if((hr == WBEM_E_FAILED) || (hr == WBEM_E_INVALID_PARAMETER) || (hr == WBEM_E_OUT_OF_MEMORY) || (hr == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
objSink->SetSinkStub(NULL);
|
|
extra->loaded = false;
|
|
}
|
|
}
|
|
}
|
|
if(pNode->objSink != NULL)
|
|
{
|
|
objSink = (CAsyncObjectSink *)pNode->objSink;
|
|
|
|
if (objSink->GetSinkStub() != NULL)
|
|
{
|
|
HRESULT hr = pNode->ns->CancelAsyncCall(objSink->GetSinkStub());
|
|
|
|
if((hr == WBEM_E_FAILED) || (hr == WBEM_E_INVALID_PARAMETER) || (hr == WBEM_E_OUT_OF_MEMORY) || (hr == WBEM_E_TRANSPORT_FAILURE))
|
|
{
|
|
hr = E_FAIL;
|
|
}
|
|
else
|
|
{
|
|
objSink->SetSinkStub(NULL);
|
|
extra->loaded = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
asyncList.clear();
|
|
}
|
|
|
|
void DataSource::ProcessEndEnumAsync(IWbemObjectSink *pSink)
|
|
{
|
|
//First delete the node for this enum
|
|
// OutputDebugString(_T("End Enum Received!!!\n"));
|
|
|
|
struct ITEMEXTRA *extra;
|
|
struct NSNODE *pNode;
|
|
|
|
if(asyncList.empty() == true)
|
|
return;
|
|
|
|
ASYNCLIST::iterator iter = asyncList.begin();
|
|
CAsyncObjectSink *objSink;
|
|
|
|
for(;iter != asyncList.end();iter++)
|
|
{
|
|
extra = *iter;
|
|
pNode = extra->nsNode;
|
|
if(pNode->objSinkNS == pSink)
|
|
{
|
|
objSink = (CAsyncObjectSink *)pNode->objSinkNS;
|
|
objSink->SetSinkStub(NULL);
|
|
pNode->objSinkNS->Release();
|
|
pNode->objSinkNS = NULL;
|
|
break;
|
|
}
|
|
if(pNode->objSink == pSink)
|
|
{
|
|
objSink = (CAsyncObjectSink *)pNode->objSink;
|
|
objSink->SetSinkStub(NULL);
|
|
pNode->objSink->Release();
|
|
pNode->objSink = NULL;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if((pNode->objSinkNS == NULL) && (pNode->objSink == NULL))
|
|
{
|
|
asyncList.remove(*iter);
|
|
extra->loaded = true;
|
|
}
|
|
|
|
if(asyncList.empty())
|
|
{
|
|
//Now Hide the Windows
|
|
// ShowControls(false);
|
|
}
|
|
}
|
|
|
|
void DataSource::SetControlHandles(HWND hwndStatic, HWND hwndButton)
|
|
{
|
|
m_hWndStatic = hwndStatic;
|
|
m_hWndButton = hwndButton;
|
|
}
|
|
|
|
void DataSource::ShowControls(bool bShow)
|
|
{
|
|
if(bShow == true)
|
|
{
|
|
ShowWindow(m_hWndStatic,SW_SHOW);
|
|
ShowWindow(m_hWndButton,SW_SHOW);
|
|
}
|
|
else
|
|
{
|
|
ShowWindow(m_hWndStatic,SW_HIDE);
|
|
ShowWindow(m_hWndButton,SW_HIDE);
|
|
}
|
|
}
|
|
|
|
HRESULT DataSource::GetAsyncSinkStub(IWbemObjectSink *pSink, IWbemObjectSink **pStubSink)
|
|
{
|
|
HRESULT hr;
|
|
IUnsecuredApartment* pUnsecApp = NULL;
|
|
|
|
if (pSink != NULL)
|
|
{
|
|
hr = CoCreateInstance(CLSID_UnsecuredApartment,
|
|
NULL,
|
|
CLSCTX_LOCAL_SERVER,
|
|
IID_IUnsecuredApartment,
|
|
(void**)&pUnsecApp);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
IUnknown* pStubUnk = NULL;
|
|
hr = pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
*pStubSink = NULL;
|
|
hr = pStubUnk->QueryInterface(IID_IWbemObjectSink,
|
|
(void **)pStubSink);
|
|
pStubUnk->Release();
|
|
}
|
|
|
|
pUnsecApp->Release();
|
|
}
|
|
}
|
|
else
|
|
hr = E_UNEXPECTED;
|
|
|
|
return hr;
|
|
}
|