395 lines
10 KiB
C++
395 lines
10 KiB
C++
|
// dphcidlg.cpp : implementation file
|
|||
|
//
|
|||
|
#include <tchar.h>
|
|||
|
#include "stdafx.h"
|
|||
|
#include "DPH_TEST.h"
|
|||
|
#include "dphcidlg.h"
|
|||
|
|
|||
|
#ifdef _DEBUG
|
|||
|
#undef THIS_FILE
|
|||
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|||
|
#endif
|
|||
|
|
|||
|
#define LODWORD(x) ((DWORD)((x) & 0x00000000FFFFFFFF))
|
|||
|
#define HIDWORD(x) ((DWORD)(((x)>>32) & 0x00000000FFFFFFFF))
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// CDphCounterInfoDlg dialog
|
|||
|
|
|||
|
|
|||
|
CDphCounterInfoDlg::CDphCounterInfoDlg(CWnd* pParent /*=NULL*/,
|
|||
|
HCOUNTER hCounterArg /*=NULL*/,
|
|||
|
HQUERY hQueryArg /*=NULL*/)
|
|||
|
: CDialog(CDphCounterInfoDlg::IDD, pParent)
|
|||
|
{
|
|||
|
//{{AFX_DATA_INIT(CDphCounterInfoDlg)
|
|||
|
// NOTE: the ClassWizard will add member initialization here
|
|||
|
//}}AFX_DATA_INIT
|
|||
|
|
|||
|
// save this counter's handle for updates
|
|||
|
hCounter = hCounterArg;
|
|||
|
hQuery = hQueryArg;
|
|||
|
|
|||
|
// init the timer variables
|
|||
|
nTimerId = 0;
|
|||
|
bTimerRunning = FALSE;
|
|||
|
bGetDefinitions = TRUE;
|
|||
|
|
|||
|
// clear the statistical data buffer
|
|||
|
memset (RawDataArray, 0, sizeof(RawDataArray));
|
|||
|
dwFirstIndex = 0;
|
|||
|
dwNextIndex = 0;
|
|||
|
dwItemsUsed = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void CDphCounterInfoDlg::DoDataExchange(CDataExchange* pDX)
|
|||
|
{
|
|||
|
CDialog::DoDataExchange(pDX);
|
|||
|
//{{AFX_DATA_MAP(CDphCounterInfoDlg)
|
|||
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
|||
|
//}}AFX_DATA_MAP
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BEGIN_MESSAGE_MAP(CDphCounterInfoDlg, CDialog)
|
|||
|
//{{AFX_MSG_MAP(CDphCounterInfoDlg)
|
|||
|
ON_BN_CLICKED(IDC_GET_NEW_DATA, OnGetNewData)
|
|||
|
ON_BN_CLICKED(IDC_1SEC_BTN, On1secBtn)
|
|||
|
ON_WM_TIMER()
|
|||
|
ON_WM_DESTROY()
|
|||
|
//}}AFX_MSG_MAP
|
|||
|
END_MESSAGE_MAP()
|
|||
|
|
|||
|
|
|||
|
/////////////////////////////////////////////////////////////////////////////
|
|||
|
// CDphCounterInfoDlg message handlers
|
|||
|
|
|||
|
BOOL CDphCounterInfoDlg::OnInitDialog()
|
|||
|
{
|
|||
|
CDialog::OnInitDialog();
|
|||
|
|
|||
|
OnGetNewData();
|
|||
|
|
|||
|
SetDefID (IDC_GET_NEW_DATA);
|
|||
|
|
|||
|
// set button text to reflect current state
|
|||
|
SetDlgItemText (IDC_1SEC_BTN, TEXT("&Start Timer"));
|
|||
|
// clear statistics display
|
|||
|
SetDlgItemText (IDC_CI_DATA_POINTS, TEXT(""));
|
|||
|
SetDlgItemText (IDC_CI_AVERAGE_VALUE, TEXT(""));
|
|||
|
SetDlgItemText (IDC_CI_MIN_VALUE, TEXT(""));
|
|||
|
SetDlgItemText (IDC_CI_MAX_VALUE, TEXT(""));
|
|||
|
|
|||
|
return FALSE; // return TRUE unless you set the focus to a control
|
|||
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|||
|
}
|
|||
|
|
|||
|
void CDphCounterInfoDlg::OnGetNewData()
|
|||
|
{
|
|||
|
PPDH_COUNTER_INFO pciData;
|
|||
|
PDH_RAW_COUNTER RawData;
|
|||
|
PDH_STATUS Status;
|
|||
|
DWORD dwCounterType;
|
|||
|
DWORD dwBufLen = 4096;
|
|||
|
LPTSTR szTextBuffer;
|
|||
|
PDH_FMT_COUNTERVALUE dfValue;
|
|||
|
double dValue;
|
|||
|
LONGLONG llValue;
|
|||
|
LONG lValue;
|
|||
|
SYSTEMTIME stTimeStamp;
|
|||
|
|
|||
|
pciData = (PPDH_COUNTER_INFO)new char[dwBufLen];
|
|||
|
szTextBuffer = new TCHAR[dwBufLen];
|
|||
|
|
|||
|
if ((pciData == NULL) || (szTextBuffer == NULL)) {
|
|||
|
Status = ERROR_OUTOFMEMORY;
|
|||
|
} else {
|
|||
|
Status = ERROR_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
|
|||
|
Status = PdhCollectQueryData (hQuery);
|
|||
|
|
|||
|
if (Status == PDH_NO_MORE_DATA) {
|
|||
|
if (bTimerRunning) {
|
|||
|
// stop the timer to prevent updating the display
|
|||
|
KillTimer (nTimerId);
|
|||
|
nTimerId = 0;
|
|||
|
bTimerRunning = FALSE;
|
|||
|
SetDlgItemText (IDC_1SEC_BTN, TEXT("&Start Timer"));
|
|||
|
}
|
|||
|
// disable the data buttons
|
|||
|
GetDlgItem(IDC_1SEC_BTN)->EnableWindow(FALSE);
|
|||
|
GetDlgItem(IDC_GET_NEW_DATA)->EnableWindow(FALSE);
|
|||
|
} else {
|
|||
|
// update the display values
|
|||
|
Status = PdhGetRawCounterValue (
|
|||
|
hCounter,
|
|||
|
&dwCounterType,
|
|||
|
&RawData);
|
|||
|
|
|||
|
if ((Status == ERROR_SUCCESS) && bGetDefinitions) {
|
|||
|
|
|||
|
Status = PdhGetCounterInfo (
|
|||
|
hCounter,
|
|||
|
TRUE,
|
|||
|
&dwBufLen,
|
|||
|
pciData);
|
|||
|
}
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
// get formatted values
|
|||
|
Status = PdhGetFormattedCounterValue (
|
|||
|
hCounter,
|
|||
|
PDH_FMT_LONG,
|
|||
|
NULL,
|
|||
|
&dfValue);
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
lValue = dfValue.longValue;
|
|||
|
} else {
|
|||
|
lValue = (LONG)-1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
// get formatted values
|
|||
|
Status = PdhGetFormattedCounterValue (
|
|||
|
hCounter,
|
|||
|
PDH_FMT_DOUBLE,
|
|||
|
NULL,
|
|||
|
&dfValue);
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
dValue = dfValue.doubleValue;
|
|||
|
} else {
|
|||
|
dValue = (double)-1.0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
// get formatted values
|
|||
|
Status = PdhGetFormattedCounterValue (
|
|||
|
hCounter,
|
|||
|
PDH_FMT_LARGE,
|
|||
|
NULL,
|
|||
|
&dfValue);
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
llValue = dfValue.largeValue;
|
|||
|
} else {
|
|||
|
llValue = (LONGLONG)-1;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
if (bGetDefinitions) {
|
|||
|
bGetDefinitions = FALSE; // only do once
|
|||
|
// load dialog box
|
|||
|
_stprintf (szTextBuffer, TEXT("%d"), pciData->dwLength);
|
|||
|
SetDlgItemText (IDC_CI_LENGTH, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->dwType);
|
|||
|
SetDlgItemText (IDC_CI_TYPE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->CVersion);
|
|||
|
SetDlgItemText (IDC_CI_VERSION, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->CStatus);
|
|||
|
SetDlgItemText (IDC_CI_STATUS, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("%d"), pciData->lScale);
|
|||
|
SetDlgItemText (IDC_CI_SCALE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("%d"), pciData->lDefaultScale);
|
|||
|
SetDlgItemText (IDC_CI_DEFAULT_SCALE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x"), pciData->dwUserData);
|
|||
|
SetDlgItemText (IDC_CI_USER_DATA, szTextBuffer);
|
|||
|
|
|||
|
SetDlgItemText (IDC_CI_MACHINE_NAME, pciData->szMachineName);
|
|||
|
SetDlgItemText (IDC_CI_OBJECT_NAME, pciData->szObjectName);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("%s:%d"),
|
|||
|
pciData->szInstanceName,
|
|||
|
pciData->dwInstanceIndex);
|
|||
|
SetDlgItemText (IDC_CI_INSTANCE_NAME, szTextBuffer);
|
|||
|
|
|||
|
SetDlgItemText (IDC_CI_PARENT_NAME, pciData->szParentInstance);
|
|||
|
SetDlgItemText (IDC_CI_COUNTER_NAME, pciData->szCounterName);
|
|||
|
SetDlgItemText (IDC_CI_EXPLAIN_TEXT, pciData->szExplainText);
|
|||
|
|
|||
|
SetDlgItemText (IDC_CI_FULL_NAME, pciData->szFullPath);
|
|||
|
}
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x"), RawData.CStatus);
|
|||
|
SetDlgItemText (IDC_RV_STATUS, szTextBuffer);
|
|||
|
|
|||
|
FileTimeToSystemTime ((LPFILETIME)&RawData.TimeStamp, &stTimeStamp);
|
|||
|
_stprintf (szTextBuffer, TEXT("%2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d.%3.3d"),
|
|||
|
stTimeStamp.wMonth,
|
|||
|
stTimeStamp.wDay,
|
|||
|
stTimeStamp.wYear,
|
|||
|
stTimeStamp.wHour,
|
|||
|
stTimeStamp.wMinute,
|
|||
|
stTimeStamp.wSecond,
|
|||
|
stTimeStamp.wMilliseconds);
|
|||
|
SetDlgItemText (IDC_TIME_STAMP, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x%8.8x"),
|
|||
|
HIDWORD(RawData.FirstValue),
|
|||
|
LODWORD(RawData.FirstValue));
|
|||
|
SetDlgItemText (IDC_RV_FIRST, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x%8.8x"),
|
|||
|
HIDWORD(RawData.SecondValue),
|
|||
|
LODWORD(RawData.SecondValue));
|
|||
|
SetDlgItemText (IDC_RV_SECOND, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x"), dwCounterType);
|
|||
|
SetDlgItemText (IDC_RV_TYPE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("%d"), lValue);
|
|||
|
SetDlgItemText (IDC_FMT_LONG_VALUE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("%f"), dValue);
|
|||
|
SetDlgItemText (IDC_FMT_DBL_VALUE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("0x%8.8x%8.8x"),
|
|||
|
HIDWORD(llValue), LODWORD(llValue));
|
|||
|
SetDlgItemText (IDC_FMT_LARGE_VALUE, szTextBuffer);
|
|||
|
} else if (Status != PDH_NO_MORE_DATA) {
|
|||
|
// clear fields and display error message
|
|||
|
// in explain text
|
|||
|
// if any error but the end of the log file
|
|||
|
szTextBuffer[0] = 0;
|
|||
|
SetDlgItemText (IDC_CI_LENGTH, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_TYPE, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_VERSION, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_STATUS, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_SCALE, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_USER_DATA, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_FULL_NAME, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_CI_COUNTER_NAME, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_RV_STATUS, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_RV_FIRST, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_RV_SECOND, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_RV_TYPE, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_FMT_LONG_VALUE, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_FMT_DBL_VALUE, szTextBuffer);
|
|||
|
SetDlgItemText (IDC_FMT_LARGE_VALUE, szTextBuffer);
|
|||
|
|
|||
|
_stprintf (szTextBuffer, TEXT("Unable to query counter data, Error 0x%8.8x"),
|
|||
|
Status);
|
|||
|
SetDlgItemText (IDC_CI_EXPLAIN_TEXT, szTextBuffer);
|
|||
|
} else {
|
|||
|
_stprintf (szTextBuffer, TEXT("End of Log File Reached."),
|
|||
|
Status);
|
|||
|
SetDlgItemText (IDC_CI_EXPLAIN_TEXT, szTextBuffer);
|
|||
|
}
|
|||
|
|
|||
|
if (pciData != NULL) delete pciData;
|
|||
|
if (szTextBuffer != NULL) delete szTextBuffer;
|
|||
|
}
|
|||
|
|
|||
|
void CDphCounterInfoDlg::On1secBtn()
|
|||
|
{
|
|||
|
if (bTimerRunning) {
|
|||
|
KillTimer (nTimerId);
|
|||
|
nTimerId = 0;
|
|||
|
bTimerRunning = FALSE;
|
|||
|
SetDlgItemText (IDC_1SEC_BTN, TEXT("&Start Timer"));
|
|||
|
// clear display
|
|||
|
SetDlgItemText (IDC_CI_DATA_POINTS, TEXT(""));
|
|||
|
SetDlgItemText (IDC_CI_AVERAGE_VALUE, TEXT(""));
|
|||
|
SetDlgItemText (IDC_CI_MIN_VALUE, TEXT(""));
|
|||
|
SetDlgItemText (IDC_CI_MAX_VALUE, TEXT(""));
|
|||
|
} else {
|
|||
|
nTimerId = SetTimer (ID_TIMER, 1000, NULL);
|
|||
|
if (nTimerId != 0) {
|
|||
|
bTimerRunning = TRUE;
|
|||
|
SetDlgItemText (IDC_1SEC_BTN, TEXT("&Stop Timer"));
|
|||
|
} else {
|
|||
|
MessageBeep (0xFFFFFFFF); //standard beep
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CDphCounterInfoDlg::OnTimer(UINT nIDEvent)
|
|||
|
{
|
|||
|
PDH_RAW_COUNTER RawDataItem;
|
|||
|
PDH_STATUS Status;
|
|||
|
DWORD dwCounterType;
|
|||
|
PDH_STATISTICS CtrStats;
|
|||
|
TCHAR szValue[MAX_PATH];
|
|||
|
|
|||
|
// get data
|
|||
|
OnGetNewData();
|
|||
|
|
|||
|
Status = PdhGetRawCounterValue (
|
|||
|
hCounter,
|
|||
|
&dwCounterType,
|
|||
|
&RawDataItem);
|
|||
|
|
|||
|
// add raw value to array
|
|||
|
|
|||
|
RawDataArray[dwNextIndex] = RawDataItem;
|
|||
|
|
|||
|
// get statistics on raw data
|
|||
|
Status = PdhComputeCounterStatistics (
|
|||
|
hCounter,
|
|||
|
PDH_FMT_DOUBLE,
|
|||
|
dwFirstIndex,
|
|||
|
++dwItemsUsed,
|
|||
|
RawDataArray,
|
|||
|
&CtrStats);
|
|||
|
|
|||
|
// display in window
|
|||
|
|
|||
|
if (Status == ERROR_SUCCESS) {
|
|||
|
_stprintf (szValue, TEXT("%d/%d"), CtrStats.count, dwItemsUsed);
|
|||
|
SetDlgItemText (IDC_CI_DATA_POINTS, szValue);
|
|||
|
|
|||
|
_stprintf (szValue, TEXT("%f"), CtrStats.mean.doubleValue);
|
|||
|
SetDlgItemText (IDC_CI_AVERAGE_VALUE, szValue);
|
|||
|
|
|||
|
_stprintf (szValue, TEXT("%f"), CtrStats.min.doubleValue);
|
|||
|
SetDlgItemText (IDC_CI_MIN_VALUE, szValue);
|
|||
|
|
|||
|
_stprintf (szValue, TEXT("%f"), CtrStats.max.doubleValue);
|
|||
|
SetDlgItemText (IDC_CI_MAX_VALUE, szValue);
|
|||
|
} else {
|
|||
|
_stprintf (szValue, TEXT("%d"), dwItemsUsed);
|
|||
|
SetDlgItemText (IDC_CI_DATA_POINTS, szValue);
|
|||
|
// unable to compute statistics
|
|||
|
lstrcpy (szValue, TEXT("Error"));
|
|||
|
SetDlgItemText (IDC_CI_AVERAGE_VALUE, szValue);
|
|||
|
SetDlgItemText (IDC_CI_MIN_VALUE, szValue);
|
|||
|
SetDlgItemText (IDC_CI_MAX_VALUE, szValue);
|
|||
|
}
|
|||
|
|
|||
|
// update pointers & indeces
|
|||
|
if (dwItemsUsed < RAW_DATA_ITEMS) {
|
|||
|
dwNextIndex = ++dwNextIndex % RAW_DATA_ITEMS;
|
|||
|
} else {
|
|||
|
--dwItemsUsed;
|
|||
|
dwNextIndex = dwFirstIndex;
|
|||
|
dwFirstIndex = ++dwFirstIndex % RAW_DATA_ITEMS;
|
|||
|
}
|
|||
|
|
|||
|
CDialog::OnTimer(nIDEvent);
|
|||
|
}
|
|||
|
|
|||
|
void CDphCounterInfoDlg::OnDestroy()
|
|||
|
{
|
|||
|
CDialog::OnDestroy();
|
|||
|
|
|||
|
if (bTimerRunning) {
|
|||
|
KillTimer (nTimerId);
|
|||
|
nTimerId = 0;
|
|||
|
bTimerRunning = FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|