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.
 
 
 
 
 
 

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