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.
 
 
 
 
 
 

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);
}
}