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.
446 lines
13 KiB
446 lines
13 KiB
// Copyright (c) 1997-1999 Microsoft Corporation
|
|
#include "precomp.h"
|
|
|
|
#ifdef EXT_DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include "PerfPage.h"
|
|
|
|
// avoid some warnings.
|
|
#undef HDS_HORZ
|
|
#undef HDS_BUTTONS
|
|
#undef HDS_HIDDEN
|
|
#include "resource.h"
|
|
#include <stdlib.h>
|
|
#include <TCHAR.h>
|
|
#include "..\Common\util.h"
|
|
#include <windowsx.h>
|
|
#include "helpid.h"
|
|
|
|
DWORD aPerformanceHelpIds[] = {
|
|
IDOK, IDH_NO_HELP,
|
|
IDCANCEL, IDH_NO_HELP,
|
|
IDC_PERF_VM_ALLOCD, (IDH_PERF + 1),
|
|
IDC_PERF_VM_ALLOCD_LABEL, (IDH_PERF + 1),
|
|
IDC_PERF_GROUP, -1,
|
|
IDC_PERF_TEXT, (IDH_PERF + 3),
|
|
IDC_PERF_TEXT2, -1,
|
|
IDC_PERF_VM_ALLOCD_TEXT, -1,
|
|
IDC_PERF_WORKSTATION, (IDH_PERF + 4),
|
|
IDC_PERF_SERVER, (IDH_PERF + 5),
|
|
IDC_PERF_VM_GROUP, -1,
|
|
IDC_PERF_VM_ALLOCD_TEXT, -1,
|
|
IDC_PERF_CHANGE, (IDH_PERF + 7),
|
|
IDC_PERF_CACHE_GROUP, -1,
|
|
IDC_PERF_CACHE_TEXT, -1,
|
|
IDC_PERF_CACHE_TEXT2, -1,
|
|
IDC_PERF_APPS, (IDH_PERF + 14),
|
|
IDC_PERF_SYSCACHE, (IDH_PERF + 15),
|
|
0, 0
|
|
};
|
|
|
|
|
|
#define PROCESS_PRIORITY_SEPARATION_MIN 0
|
|
#define PROCESS_PRIORITY_SEPARATION_MAX 2
|
|
|
|
#define PERF_TYPEVARIABLE 1
|
|
#define PERF_TYPEFIXED 2
|
|
|
|
#define PERF_LENLONG 1
|
|
#define PERF_LENSHORT 2
|
|
|
|
#define OPTIMIZE_APPS 0
|
|
#define OPTIMIZE_CACHE 1
|
|
|
|
INT_PTR CALLBACK StaticPerfDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// if this is the initDlg msg...
|
|
if(message == WM_INITDIALOG)
|
|
{
|
|
// transfer the 'this' ptr to the extraBytes.
|
|
SetWindowLongPtr(hwndDlg, DWLP_USER, lParam);
|
|
}
|
|
|
|
// DWL_USER is the 'this' ptr.
|
|
PerfPage *me = (PerfPage *)GetWindowLongPtr(hwndDlg, DWLP_USER);
|
|
|
|
if(me != NULL)
|
|
{
|
|
// call into the DlgProc() that has some context.
|
|
return me->DlgProc(hwndDlg, message, wParam, lParam);
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
//--------------------------------------------------------------
|
|
PerfPage::PerfPage(WbemServiceThread *serviceThread)
|
|
: WBEMPageHelper(serviceThread)
|
|
{
|
|
m_dwPrevCacheOption = m_dwCurCacheOption = 0;
|
|
m_nowWorkstation = m_wasWorkstation = false;
|
|
IWbemClassObject *pInst = NULL;
|
|
|
|
// NOTE: This one's a little different. I create it right away so
|
|
// I can use it as a helper even before I put up its' dlg.
|
|
m_VDlg = new VirtualMemDlg(m_serviceThread);
|
|
|
|
// its all in one class.
|
|
if((pInst = FirstInstanceOf("Win32_OperatingSystem")) != NULL)
|
|
{
|
|
m_os = pInst;
|
|
}
|
|
}
|
|
//--------------------------------------------------------------
|
|
INT_PTR PerfPage::DoModal(HWND hDlg)
|
|
{
|
|
return DialogBoxParam(HINST_THISDLL,
|
|
(LPTSTR) MAKEINTRESOURCE(IDD_PERFORMANCE),
|
|
hDlg, StaticPerfDlgProc, (LPARAM)this);
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
PerfPage::~PerfPage()
|
|
{
|
|
delete m_VDlg;
|
|
}
|
|
//--------------------------------------------------------------
|
|
INT_PTR CALLBACK PerfPage::DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
static BOOL fVMInited = FALSE;
|
|
DWORD dw;
|
|
HRESULT hr = 0;
|
|
BOOL bDirty = FALSE;
|
|
|
|
m_hDlg = hwndDlg;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
Init();
|
|
return TRUE;
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
// If the dialog box is going away, then close the
|
|
// registry key.
|
|
if (fVMInited)
|
|
{
|
|
// VirtualFreeStructures();
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_PERF_CHANGE:
|
|
|
|
dw = m_VDlg->DoModal(m_hDlg);
|
|
|
|
if (fVMInited)
|
|
{
|
|
unsigned long val = 0;
|
|
m_VDlg->ComputeAllocated(&val);
|
|
SetDlgItemMB(m_hDlg, IDC_PERF_VM_ALLOCD, val);
|
|
}
|
|
/*****************
|
|
if((dw != RET_NO_CHANGE) &&
|
|
(dw != RET_CHANGE_NO_REBOOT))
|
|
{
|
|
MsgBoxParam(m_hDlg, SYSTEM + 39, IDS_TITLE,
|
|
MB_OK | MB_ICONINFORMATION);
|
|
|
|
g_fRebootRequired = TRUE;
|
|
}
|
|
********************/
|
|
|
|
break;
|
|
case IDC_PERF_WORKSTATION:
|
|
if(BN_CLICKED == HIWORD(wParam))
|
|
{
|
|
m_nowWorkstation = true;
|
|
|
|
// Workstations have maximum foreground boost
|
|
m_appBoost = PROCESS_PRIORITY_SEPARATION_MAX;
|
|
|
|
// Workstations have variable, short quanta
|
|
m_quantLength = PERF_LENSHORT;
|
|
m_quantType = PERF_TYPEVARIABLE;
|
|
}
|
|
break;
|
|
|
|
case IDC_PERF_SERVER:
|
|
if(BN_CLICKED == HIWORD(wParam))
|
|
{
|
|
m_nowWorkstation = false;
|
|
|
|
// Servers have minimum foreground boost
|
|
m_appBoost = PROCESS_PRIORITY_SEPARATION_MIN;
|
|
|
|
// Servers have fixed, long quanta
|
|
m_quantLength = PERF_LENLONG;
|
|
m_quantType = PERF_TYPEFIXED;
|
|
}
|
|
break;
|
|
|
|
case IDC_PERF_APPS:
|
|
if(BN_CLICKED == HIWORD(wParam))
|
|
{
|
|
m_dwCurCacheOption = OPTIMIZE_APPS;
|
|
g_fRebootRequired = (m_dwCurCacheOption != m_dwPrevCacheOption);
|
|
}
|
|
break;
|
|
|
|
case IDC_PERF_SYSCACHE:
|
|
if(BN_CLICKED == HIWORD(wParam))
|
|
{
|
|
m_dwCurCacheOption = OPTIMIZE_CACHE;
|
|
g_fRebootRequired = (m_dwCurCacheOption != m_dwPrevCacheOption);
|
|
}
|
|
break;
|
|
|
|
case IDOK:
|
|
if (m_wasWorkstation != m_nowWorkstation) // Change?
|
|
{
|
|
if((bool)m_os)
|
|
{
|
|
hr = m_os.Put(_T("ForegroundApplicationBoost"),
|
|
variant_t((BYTE)m_appBoost));
|
|
hr = m_os.Put(_T("QuantumType"),
|
|
variant_t((BYTE)m_quantType));
|
|
hr = m_os.Put(_T("QuantumLength"),
|
|
variant_t((BYTE)m_quantLength));
|
|
bDirty = TRUE;
|
|
}
|
|
else
|
|
{
|
|
MsgBoxParam(m_hDlg, IDS_LOST_CONNECTION, IDS_TITLE,
|
|
MB_OK | MB_ICONINFORMATION);
|
|
EndDialog(m_hDlg, 0);
|
|
}
|
|
}
|
|
|
|
if (m_dwPrevCacheOption != m_dwCurCacheOption) // Change?
|
|
{
|
|
if((bool)m_os)
|
|
{
|
|
hr = m_os.Put(_T("LargeSystemCache"),
|
|
(long)m_dwCurCacheOption);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
bDirty = TRUE;
|
|
MsgBoxParam(m_hDlg, IDS_MUST_REBOOT, IDS_SYS_CHANGE_CAPTION, MB_OK | MB_ICONINFORMATION, NULL, NULL);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MsgBoxParam(m_hDlg, IDS_LOST_CONNECTION, IDS_TITLE,
|
|
MB_OK | MB_ICONINFORMATION);
|
|
EndDialog(m_hDlg, 0);
|
|
}
|
|
}
|
|
|
|
if (bDirty)
|
|
{
|
|
hr = m_WbemServices.PutInstance(m_os,
|
|
WBEM_FLAG_CREATE_OR_UPDATE);
|
|
}
|
|
EndDialog(m_hDlg, 0);
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(m_hDlg, 0);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
} //endswitch LOWORD
|
|
|
|
break;
|
|
|
|
case WM_HELP: // F1
|
|
::WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle,
|
|
L"sysdm.hlp",
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR)(LPSTR)aPerformanceHelpIds);
|
|
|
|
break;
|
|
|
|
case WM_CONTEXTMENU: // right mouse click
|
|
WinHelp((HWND)wParam, HELP_FILE, HELP_CONTEXTMENU,
|
|
(ULONG_PTR)(LPSTR)aPerformanceHelpIds);
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//--------------------------------------------------------------------
|
|
// TCHAR szPriKey[] = TEXT("System\\CurrentControlSet\\Control\\PriorityControl");
|
|
TCHAR szPriMemoryKey[] = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Memory Management");
|
|
|
|
void PerfPage::Init(void)
|
|
{
|
|
HRESULT h1 = 0, h2 = 0, h3 = 0;
|
|
HRESULT hr;
|
|
|
|
// if anything goes wrong, act like a server.
|
|
m_appBoost = PROCESS_PRIORITY_SEPARATION_MIN;
|
|
m_quantType = PERF_TYPEVARIABLE;
|
|
m_quantLength = PERF_LENLONG;
|
|
|
|
// if the class was found...
|
|
if((bool)m_os)
|
|
{
|
|
// NOTE: I want the return codes. Dont use GetLong() is the case.
|
|
h1 = m_os.Get(_T("QuantumType"), m_quantType);
|
|
h2 = m_os.Get(_T("QuantumLength"), m_quantLength);
|
|
h3 = m_os.Get(_T("ForegroundApplicationBoost"), m_appBoost);
|
|
|
|
// did it all work?
|
|
if((h1 == 0) && (h2 == 0) && (h3 == 0))
|
|
{
|
|
bool bWorkstation;
|
|
|
|
// if it's never been set, quantLength & quantType are zero.
|
|
// - determine whether we're on wks or srv
|
|
if ((m_quantLength == 0) && (m_quantType == 0))
|
|
{
|
|
bWorkstation = true;
|
|
m_quantLength = PERF_LENSHORT;
|
|
m_quantType = PERF_TYPEVARIABLE;
|
|
|
|
IWbemClassObject *pInst = NULL;
|
|
|
|
if (pInst = FirstInstanceOf("Win32_ComputerSystem"))
|
|
{
|
|
CWbemClassObject obj = pInst;
|
|
|
|
long role;
|
|
obj.Get((bstr_t)"DomainRole", role);
|
|
|
|
if (role > 1)
|
|
{
|
|
bWorkstation = false;
|
|
m_quantLength = PERF_LENLONG;
|
|
m_quantType = PERF_TYPEFIXED;
|
|
}
|
|
|
|
pInst->Release();
|
|
}
|
|
// else - we just use defaults from above
|
|
|
|
}
|
|
else if ((m_quantLength == PERF_LENSHORT) &&
|
|
(m_quantType == PERF_TYPEVARIABLE))
|
|
bWorkstation = true;
|
|
else
|
|
bWorkstation = false;
|
|
|
|
//-----------------------------------------
|
|
// Short, Variable Quanta (or 2 zeros) == Workstation-like interactive response.
|
|
// Long, Fixed Quanta == Server-like interactive response.
|
|
if(bWorkstation)
|
|
{
|
|
m_appBoost = PROCESS_PRIORITY_SEPARATION_MAX;
|
|
|
|
// to optimize Puts later.
|
|
m_nowWorkstation = m_wasWorkstation = true;
|
|
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_WORKSTATION),
|
|
BST_CHECKED);
|
|
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_SERVER),
|
|
BST_UNCHECKED);
|
|
|
|
}
|
|
else // its a server.
|
|
{
|
|
m_appBoost = PROCESS_PRIORITY_SEPARATION_MIN;
|
|
m_nowWorkstation = m_wasWorkstation = false;
|
|
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_WORKSTATION),
|
|
BST_UNCHECKED);
|
|
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_SERVER),
|
|
BST_CHECKED);
|
|
|
|
}
|
|
|
|
BOOL writable = TRUE;
|
|
// NOTE: for backwards compability with wmi builds that didn't have this
|
|
// method (in RemoteRegWriteable()), assume 'true' unless a newer build says you cant do this.
|
|
|
|
RemoteRegWriteable(szPriMemoryKey, writable);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_APPS), writable);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_SYSCACHE), writable);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_WORKSTATION), writable);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_SERVER), writable);
|
|
|
|
} // endif it worked
|
|
|
|
}
|
|
else
|
|
{
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_WORKSTATION), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_SERVER), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_APPS), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_SYSCACHE), FALSE);
|
|
} //endif class was found.
|
|
|
|
//
|
|
// Get LargeSystemCache property and set controls correspondingly.
|
|
//
|
|
hr = m_os.Get(_T("LargeSystemCache"), (long&)m_dwPrevCacheOption);
|
|
m_dwCurCacheOption = m_dwPrevCacheOption;
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (m_dwPrevCacheOption == OPTIMIZE_APPS)
|
|
{
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_APPS),
|
|
BST_CHECKED);
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_SYSCACHE),
|
|
BST_UNCHECKED);
|
|
}
|
|
else if (m_dwPrevCacheOption == OPTIMIZE_CACHE)
|
|
{
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_APPS),
|
|
BST_UNCHECKED);
|
|
Button_SetCheck(GetDlgItem(m_hDlg, IDC_PERF_SYSCACHE),
|
|
BST_CHECKED);
|
|
}
|
|
else // Unsupported/unknown value - disable the controls.
|
|
{
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_APPS), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_SYSCACHE), FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_APPS), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_SYSCACHE), FALSE);
|
|
}
|
|
|
|
// Init the virtual memory part.
|
|
unsigned long vAlloc = 0;
|
|
bool enable = m_VDlg->ComputeAllocated(&vAlloc);
|
|
if(enable)
|
|
{
|
|
SetDlgItemMB( m_hDlg, IDC_PERF_VM_ALLOCD, vAlloc );
|
|
}
|
|
else
|
|
{
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_VM_ALLOCD_LABEL), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_VM_ALLOCD), FALSE);
|
|
::EnableWindow(GetDlgItem(m_hDlg, IDC_PERF_CHANGE), FALSE);
|
|
MsgBoxParam(m_hDlg, IDS_NO_VM, IDS_TITLE, MB_OK|MB_ICONWARNING);
|
|
}
|
|
}
|