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.
343 lines
7.5 KiB
343 lines
7.5 KiB
// WmiCtrsDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "precomp.h"
|
|
#include "WmiCtrsDlg.h"
|
|
#include "resource.h"
|
|
#include <process.h>
|
|
#include <util.h>
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
WCHAR g_szCounters[][40] = { L"Connections",
|
|
L"DeliveryBackupBytes",
|
|
L"InternalObjects",
|
|
L"InternalSinks",
|
|
L"TasksInProgress",
|
|
L"TasksWaiting",
|
|
L"TotalAPIcalls",
|
|
L"Users"
|
|
};
|
|
|
|
UINT g_uCtrIds[] = { IDC_CONNECTIONS,
|
|
IDC_DELBACKUP,
|
|
IDC_INTERNALOBJS,
|
|
IDC_INTERNALSINKS,
|
|
IDC_TASKSINPROG,
|
|
IDC_TASKSWAITING,
|
|
IDC_TOTALAPICALLS,
|
|
IDC_USERS
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// WmiCtrsDlg dialog
|
|
|
|
CWmiCtrsDlg::CWmiCtrsDlg()
|
|
{
|
|
m_pCredentials = NULL;
|
|
_tcscpy(m_szMachineName,_T(""));
|
|
m_pDlg = NULL;
|
|
m_hWndBusy = NULL;
|
|
}
|
|
|
|
CWmiCtrsDlg::CWmiCtrsDlg(LPCTSTR szMachineName, LOGIN_CREDENTIALS *pCredentials)
|
|
{
|
|
m_pCredentials = pCredentials;
|
|
_tcsncpy(m_szMachineName,szMachineName,ARRAYSIZE(m_szMachineName));
|
|
m_pDlg = NULL;
|
|
m_hWndBusy = NULL;
|
|
}
|
|
|
|
CWmiCtrsDlg::~CWmiCtrsDlg()
|
|
{
|
|
if(m_pDlg != NULL)
|
|
delete m_pDlg;
|
|
|
|
if(m_hWndBusy != NULL)
|
|
{
|
|
//Now close the busy Dialog
|
|
SendMessage(*(m_hWndBusy),WM_CLOSE_BUSY_DLG,0,0);
|
|
delete m_hWndBusy;
|
|
}
|
|
}
|
|
|
|
INT_PTR CWmiCtrsDlg::DoModal(HWND hWnd)
|
|
{
|
|
m_bRun = true;
|
|
INT_PTR retVal = DialogBoxParam(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDD_WMICTR),
|
|
hWnd, CtrDlgProc,
|
|
(LPARAM)this);
|
|
|
|
m_bRun = false;
|
|
return retVal;
|
|
}
|
|
|
|
INT_PTR CALLBACK CtrDlgProc(HWND hwndDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
INT_PTR retVal = TRUE;
|
|
CWmiCtrsDlg *pDlg = (CWmiCtrsDlg *)lParam;
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
pDlg->InitDlg(hwndDlg);
|
|
break;
|
|
}
|
|
case WM_COMMAND :
|
|
{
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
{
|
|
EndDialog(hwndDlg, IDOK);
|
|
break;
|
|
}
|
|
case IDCANCEL:
|
|
{
|
|
EndDialog(hwndDlg, IDCANCEL);
|
|
break;
|
|
}
|
|
default:
|
|
retVal = FALSE;
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
retVal = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
return retVal;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CWmiCtrsDlg message handlers
|
|
|
|
DWORD WINAPI CountersThread(LPVOID lpParameter)
|
|
{
|
|
CoInitialize(NULL);
|
|
|
|
CWmiCtrsDlg *pDlg = (CWmiCtrsDlg *)lpParameter;
|
|
|
|
CWbemServices Services;
|
|
|
|
TCHAR nameSpace[1024];
|
|
|
|
// if machine is whacked already...
|
|
if(_tcsncmp(pDlg->m_szMachineName, _T("\\"), 1) == 0)
|
|
{
|
|
// use it.
|
|
_tcscpy(nameSpace,pDlg->m_szMachineName);
|
|
_tcscat(nameSpace,_T("\\root\\CimV2"));
|
|
}
|
|
else if(_tcslen(pDlg->m_szMachineName) > 0)
|
|
{
|
|
// whack it myself.
|
|
_tcscpy(nameSpace,_T("\\\\"));
|
|
_tcscat(nameSpace,pDlg->m_szMachineName);
|
|
_tcscat(nameSpace,_T("\\root\\CimV2"));
|
|
}
|
|
else
|
|
{
|
|
_tcscpy(nameSpace,_T("root\\CimV2"));
|
|
}
|
|
|
|
HRESULT hr = Services.ConnectServer(nameSpace,pDlg->m_pCredentials);
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
//Display a MessageBox to the user that the connection has been failed
|
|
pDlg->DisplayErrorMessage(IDC_ERROR_CONNECT);
|
|
return 0;
|
|
}
|
|
|
|
//Now try to Get the instances of the class Win32_PerfRawData_WinMgmt_WINMGMTCounters
|
|
IEnumWbemClassObject *Enum = NULL;
|
|
ULONG uReturned;
|
|
|
|
IWbemClassObject *pInst = NULL;
|
|
hr = Services.CreateInstanceEnum(L"Win32_PerfRawData_WinMgmt_WINMGMTCounters",
|
|
WBEM_FLAG_SHALLOW,
|
|
&Enum);
|
|
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
// get the first and only instance.
|
|
Enum->Next(-1, 1, &pInst, &uReturned);
|
|
Enum->Release();
|
|
}
|
|
else
|
|
{
|
|
pDlg->DisplayErrorMessage(IDC_ERROR_ENUM);
|
|
return 0;
|
|
}
|
|
|
|
if(pDlg->m_hWndBusy != NULL)
|
|
{
|
|
//Now close the nusy Dialog
|
|
SendMessage(*(pDlg->m_hWndBusy),WM_CLOSE_BUSY_DLG,0,0);
|
|
}
|
|
|
|
int i;
|
|
VARIANT vt;
|
|
TCHAR strVal[1024];
|
|
VariantInit(&vt);
|
|
|
|
while(pDlg->m_bRun == true)
|
|
{
|
|
for(i=0; i < NUM_COUNTERS; i++)
|
|
{
|
|
VariantClear(&vt);
|
|
hr = pInst->Get(g_szCounters[i],0,&vt,NULL,NULL);
|
|
/* if(FAILED(hr))
|
|
{
|
|
::MessageBox(NULL,_T("error"),_T("Unable to get"),MB_OK);
|
|
}
|
|
*/ _itot(vt.lVal,strVal,10);
|
|
SetWindowText(pDlg->m_hWndCounters[i],strVal);
|
|
}
|
|
|
|
Sleep(900);
|
|
}
|
|
|
|
Services.DisconnectServer();
|
|
|
|
return 1;
|
|
}
|
|
|
|
void CWmiCtrsDlg::InitDlg(HWND hDlg)
|
|
{
|
|
DWORD dwThreadId;
|
|
|
|
//Do the member Initializations
|
|
m_pDlg = new HWND;
|
|
if (!m_pDlg)
|
|
return;
|
|
*m_pDlg = hDlg;
|
|
m_hWndBusy = new HWND;
|
|
::LoadString(_Module.GetModuleInstance(), IDC_ERROR_CAPTION, m_szError, 100);
|
|
|
|
for(int i=0;i < NUM_COUNTERS; i++)
|
|
{
|
|
m_hWndCounters[i] = GetDlgItem(hDlg,g_uCtrIds[i]);
|
|
}
|
|
|
|
m_hThread = CreateThread(NULL,0,CountersThread,(LPVOID)this,0,&dwThreadId);
|
|
|
|
//Now Display the "Connecting to WMI" Dialog
|
|
DisplayBusyDialog(hDlg);
|
|
}
|
|
|
|
void CWmiCtrsDlg::DisplayErrorMessage(UINT ErrorId)
|
|
{
|
|
|
|
TCHAR szErrorText[1024];
|
|
if(m_hWndBusy != NULL)
|
|
{
|
|
//Now close the busy Dialog
|
|
SendMessage(*(m_hWndBusy),WM_CLOSE_BUSY_DLG,0,0);
|
|
}
|
|
::LoadString(_Module.GetModuleInstance(), ErrorId, szErrorText, 1024);
|
|
EndDialog(*m_pDlg,IDCANCEL);
|
|
::MessageBox(NULL,szErrorText,m_szError,MB_OK);
|
|
}
|
|
|
|
INT_PTR CALLBACK BusyDlgProc(HWND hwndDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam)
|
|
{
|
|
BOOL retval = FALSE;
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{//BEGIN
|
|
//lParam = ANIMCONFIG *
|
|
CWmiCtrsDlg *pDlg = (CWmiCtrsDlg *)lParam;
|
|
SetWindowLongPtr(hwndDlg, DWLP_USER, (LPARAM)pDlg);
|
|
*(pDlg->m_hWndBusy) = hwndDlg;
|
|
|
|
HWND hAnim = GetDlgItem(hwndDlg, IDC_ANIMATE);
|
|
HWND hMsg = GetDlgItem(hwndDlg, IDC_MSG);
|
|
|
|
Animate_Open(hAnim, MAKEINTRESOURCE(IDR_AVIWAIT));
|
|
|
|
TCHAR caption[100] = {0}, msg[256] = {0};
|
|
|
|
::LoadString(_Module.GetModuleInstance(), IDS_DISPLAY_NAME, caption, 100);
|
|
|
|
::LoadString(_Module.GetModuleInstance(), IDS_CONNECTING, msg, 256);
|
|
|
|
SetWindowText(hwndDlg, caption);
|
|
SetWindowText(hMsg, msg);
|
|
|
|
retval = TRUE;
|
|
break;
|
|
}
|
|
case WM_CLOSE_BUSY_DLG:
|
|
{
|
|
HWND *me = (HWND *)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
|
*me = 0;
|
|
EndDialog(hwndDlg, IDCANCEL);
|
|
break;
|
|
}
|
|
case WM_COMMAND:
|
|
{
|
|
// they're only one button.
|
|
if(HIWORD(wParam) == BN_CLICKED)
|
|
{
|
|
// I'm going away now so anybody that has a ptr to my
|
|
// hwnd (which I gave out in my WM_INITDIALOG) shouldn't
|
|
// use it anymore.
|
|
HWND *me = (HWND *)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
|
*me = 0;
|
|
EndDialog(hwndDlg, IDCANCEL);
|
|
}
|
|
retval = TRUE; // I processed it.
|
|
break;
|
|
}
|
|
case WM_DESTROY:
|
|
{// BEGIN
|
|
// I'm going away now so anybody that has a ptr to my
|
|
// hwnd (which I gave out in my WM_INITDIALOG) shouldn't
|
|
// use it anymore.
|
|
HWND *me = (HWND *)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
|
*me = 0;
|
|
retval = TRUE; // I processed it.
|
|
break;
|
|
} //END
|
|
default:
|
|
{
|
|
retval = FALSE; // I did NOT process this msg.
|
|
break;
|
|
}
|
|
} //endswitch uMsg
|
|
|
|
return retval;
|
|
}
|
|
|
|
INT_PTR CWmiCtrsDlg::DisplayBusyDialog(HWND hWnd)
|
|
{
|
|
return DialogBoxParam(_Module.GetModuleInstance(),
|
|
MAKEINTRESOURCE(IDD_ANIMATE),
|
|
NULL, BusyDlgProc,
|
|
(LPARAM)this);
|
|
}
|
|
|
|
void CWmiCtrsDlg::CloseBusyDialog()
|
|
{
|
|
if(m_hWndBusy != NULL)
|
|
{
|
|
//Now close the nusy Dialog
|
|
SendMessage(*(m_hWndBusy),WM_CLOSE_BUSY_DLG,0,0);
|
|
}
|
|
}
|