|
|
/*++
Microsoft Confidential Copyright (c) 1992-1997 Microsoft Corporation All rights reserved
Module Name:
perf.c
Abstract:
Implements the Performance dialog of the System Control Panel Applet
Author:
Eric Flo (ericflo) 19-Jun-1995
Revision History:
15-Oct-1997 scotthal Complete overhaul 10-Jul-2000 SilviuC Added the LargeSystemCache setting.
--*/ #include <sysdm.h>
#include <help.h>
#define PROCESS_PRIORITY_SEPARATION_MASK 0x00000003
#define PROCESS_PRIORITY_SEPARATION_MAX 0x00000002
#define PROCESS_PRIORITY_SEPARATION_MIN 0x00000000
#define PROCESS_QUANTUM_VARIABLE_MASK 0x0000000c
#define PROCESS_QUANTUM_VARIABLE_DEF 0x00000000
#define PROCESS_QUANTUM_VARIABLE_VALUE 0x00000004
#define PROCESS_QUANTUM_FIXED_VALUE 0x00000008
#define PROCESS_QUANTUM_LONG_MASK 0x00000030
#define PROCESS_QUANTUM_LONG_DEF 0x00000000
#define PROCESS_QUANTUM_LONG_VALUE 0x00000010
#define PROCESS_QUANTUM_SHORT_VALUE 0x00000020
//
// Globals
//
HKEY m_hKeyPerf = NULL; TCHAR m_szRegPriKey[] = TEXT( "SYSTEM\\CurrentControlSet\\Control\\PriorityControl" ); TCHAR m_szRegPriority[] = TEXT( "Win32PrioritySeparation" );
HKEY m_hKeyMemoryManagement = NULL; TCHAR m_szRegMemoryManagementKey[] = TEXT( "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management" ); TCHAR m_szRegLargeSystemCache[] = TEXT( "LargeSystemCache" );
//
// Help ID's
//
// ISSUE: SilviuC: 07/11/2000: IDC_PERF_CACHE_XXX should get help IDs when help is written
DWORD aPerformanceHelpIds[] = { IDC_STATIC, NO_HELP, IDC_PERF_VM_ALLOCD, (IDH_PERF + 1), IDC_PERF_VM_ALLOCD_LABEL, (IDH_PERF + 1), IDC_PERF_GROUP, NO_HELP, IDC_PERF_TEXT, (IDH_PERF + 3), IDC_PERF_TEXT2, NO_HELP, IDC_PERF_WORKSTATION, (IDH_PERF + 4), IDC_PERF_SERVER, (IDH_PERF + 5), IDC_PERF_VM_GROUP, NO_HELP, IDC_PERF_VM_ALLOCD_TEXT, NO_HELP, IDC_PERF_CHANGE, (IDH_PERF + 7), IDC_PERF_CACHE_GROUP, NO_HELP, IDC_PERF_CACHE_TEXT, NO_HELP, IDC_PERF_CACHE_TEXT2, NO_HELP, IDC_PERF_CACHE_APPLICATION, (IDH_PERF + 14), IDC_PERF_CACHE_SYSTEM, (IDH_PERF + 15), 0, 0 };
INT_PTR APIENTRY PerformanceDlgProc( IN HWND hDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) /*++
Routine Description:
Handles messages sent to Performance dialog
Arguments:
hDlg - Supplies window handle
uMsg - Supplies message being sent
wParam - Supplies message parameter
lParam - Supplies message parameter
Return Value:
TRUE if message was handled FALSE if message was unhandled
--*/ { static int iNewChoice = 0; LONG RegRes; DWORD Type, Value, Length; DWORD CacheType; DWORD CacheValue = 0; DWORD CacheLength; static int InitPos; static int InitRegVal, InitCacheRegVal; static int NewRegVal, NewCacheRegVal; static BOOL fVMInited = FALSE; static BOOL fTempPfWarningShown = FALSE; BOOL fTempPf; BOOL fWorkstationProduct = !IsOS(OS_ANYSERVER); BOOL fAdministrator = IsUserAnAdmin(); BOOL fVariableQuanta = FALSE; BOOL fShortQuanta = FALSE; BOOL fFailedToOpenMmKey = FALSE;
switch (uMsg) { case WM_INITDIALOG:
InitPos = 0; InitRegVal = 0; InitCacheRegVal = 0;
//
// initialize from the registry
//
RegRes = RegOpenKeyEx( HKEY_LOCAL_MACHINE, m_szRegPriKey, 0, fAdministrator ? KEY_QUERY_VALUE | KEY_SET_VALUE : KEY_QUERY_VALUE, &m_hKeyPerf );
if (RegRes == ERROR_SUCCESS) { Length = sizeof( Value ); RegRes = SHRegGetValue(m_hKeyPerf, NULL, m_szRegPriority, SRRF_RT_DWORD, &Type, (LPBYTE) &Value, &Length );
if (RegRes == ERROR_SUCCESS) { InitRegVal = Value; InitPos = InitRegVal & PROCESS_PRIORITY_SEPARATION_MASK; if (InitPos > PROCESS_PRIORITY_SEPARATION_MAX) { InitPos = PROCESS_PRIORITY_SEPARATION_MAX; }
} }
if ((RegRes != ERROR_SUCCESS) || (!fAdministrator)) { EnableWindow(GetDlgItem(hDlg, IDC_PERF_WORKSTATION), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_PERF_SERVER), FALSE); }
NewRegVal = InitRegVal;
//
// determine if we are using fixed or variable quantums
//
switch (InitRegVal & PROCESS_QUANTUM_VARIABLE_MASK) { case PROCESS_QUANTUM_VARIABLE_VALUE: fVariableQuanta = TRUE; break;
case PROCESS_QUANTUM_FIXED_VALUE: fVariableQuanta = FALSE; break;
case PROCESS_QUANTUM_VARIABLE_DEF: default: if (fWorkstationProduct) { fVariableQuanta = TRUE; } else { fVariableQuanta = FALSE; } break; }
//
// determine if we are using long or short
//
switch (InitRegVal & PROCESS_QUANTUM_LONG_MASK) { case PROCESS_QUANTUM_LONG_VALUE: fShortQuanta = FALSE; break;
case PROCESS_QUANTUM_SHORT_VALUE: fShortQuanta = TRUE; break;
case PROCESS_QUANTUM_LONG_DEF: default: if (fWorkstationProduct) { fShortQuanta = TRUE; } else { fShortQuanta = FALSE; } break; }
//
// Short, Variable Quanta == Workstation-like interactive response
// Long, Fixed Quanta == Server-like interactive response
//
if (fVariableQuanta && fShortQuanta) { iNewChoice = PROCESS_PRIORITY_SEPARATION_MAX;
CheckRadioButton( hDlg, IDC_PERF_WORKSTATION, IDC_PERF_SERVER, IDC_PERF_WORKSTATION ); } // if
else { iNewChoice = PROCESS_PRIORITY_SEPARATION_MIN;
CheckRadioButton( hDlg, IDC_PERF_WORKSTATION, IDC_PERF_SERVER, IDC_PERF_SERVER ); } // else
//
// Initialize the `memory usage' part.
//
fFailedToOpenMmKey = FALSE;
RegRes = RegOpenKeyEx( HKEY_LOCAL_MACHINE, m_szRegMemoryManagementKey, 0, fAdministrator ? KEY_QUERY_VALUE | KEY_SET_VALUE : KEY_QUERY_VALUE, &m_hKeyMemoryManagement );
if (RegRes == ERROR_SUCCESS) { CacheValue = 0; CacheLength = sizeof( CacheValue );
RegRes = SHRegGetValue( m_hKeyMemoryManagement, NULL, m_szRegLargeSystemCache, SRRF_RT_DWORD, &CacheType, (LPBYTE) &CacheValue, &CacheLength );
if (RegRes == ERROR_SUCCESS && CacheValue != 0) { CheckRadioButton(hDlg, IDC_PERF_CACHE_APPLICATION, IDC_PERF_CACHE_SYSTEM, IDC_PERF_CACHE_SYSTEM); } else { CheckRadioButton(hDlg, IDC_PERF_CACHE_APPLICATION, IDC_PERF_CACHE_SYSTEM, IDC_PERF_CACHE_APPLICATION); } } else { fFailedToOpenMmKey = TRUE; }
if (fFailedToOpenMmKey || (!fAdministrator)) { CheckRadioButton(hDlg, IDC_PERF_CACHE_APPLICATION, IDC_PERF_CACHE_SYSTEM, IDC_PERF_CACHE_APPLICATION);
EnableWindow(GetDlgItem(hDlg, IDC_PERF_CACHE_APPLICATION), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_PERF_CACHE_SYSTEM), FALSE); }
InitCacheRegVal = CacheValue; NewCacheRegVal = CacheValue;
//
// Init the virtual memory part
//
if (VirtualInitStructures()) { fVMInited = TRUE; SetDlgItemMB( hDlg, IDC_PERF_VM_ALLOCD, VirtualMemComputeAllocated(hDlg, &fTempPf) ); //
// If the system created a temp pagefile, warn the user that
// the total pagefile size may appear a bit large, but only
// do so once per System Applet invokation.
//
if (fTempPf && !fTempPfWarningShown) { MsgBoxParam( hDlg, IDS_TEMP_PAGEFILE_WARN, IDS_SYSDM_TITLE, MB_ICONINFORMATION | MB_OK ); fTempPfWarningShown = TRUE; } // if (fTempPf...
} break;
case WM_DESTROY: //
// If the dialog box is going away, then close the
// registry key.
//
if (m_hKeyPerf) { RegCloseKey( m_hKeyPerf ); m_hKeyPerf = NULL; }
if (m_hKeyMemoryManagement) { RegCloseKey( m_hKeyMemoryManagement ); m_hKeyMemoryManagement = NULL; }
if (fVMInited) { VirtualFreeStructures(); } break;
case WM_NOTIFY: switch (((NMHDR *)lParam)->code) { case PSN_APPLY: //
// Save new time quantum stuff, if it has changed
//
NewRegVal &= ~PROCESS_PRIORITY_SEPARATION_MASK; NewRegVal |= iNewChoice;
if (NewRegVal != InitRegVal) { Value = NewRegVal;
if (m_hKeyPerf) { Type = REG_DWORD; Length = sizeof( Value ); RegSetValueEx( m_hKeyPerf, m_szRegPriority, 0, REG_DWORD, (LPBYTE) &Value, Length ); InitRegVal = Value;
//
// Kernel monitors this part of the
// registry, so don't tell user he has to reboot
//
} }
//
// Save `LargeSystemCache' if value changed
//
if (InitCacheRegVal != NewCacheRegVal) {
CacheValue = NewCacheRegVal;
if (m_hKeyMemoryManagement) { CacheType = REG_DWORD; CacheLength = sizeof( CacheValue ); RegSetValueEx( m_hKeyMemoryManagement, m_szRegLargeSystemCache, 0, REG_DWORD, (LPBYTE) &CacheValue, CacheLength );
InitCacheRegVal = CacheValue;
//
// Request a reboot if things changed
//
MsgBoxParam( hDlg, IDS_SYSDM_RESTART, IDS_SYSDM_TITLE, MB_OK | MB_ICONINFORMATION );
g_fRebootRequired = TRUE; } } break; } break;
case WM_COMMAND: { BOOL fEnableApply = (LOWORD(wParam) != IDC_PERF_CHANGE);
LRESULT lres;
switch (LOWORD(wParam)) { case IDC_PERF_CHANGE: { lres = DialogBox( hInstance, MAKEINTRESOURCE(DLG_VIRTUALMEM), hDlg, VirtualMemDlg );
if (fVMInited) { SetDlgItemMB( hDlg, IDC_PERF_VM_ALLOCD, VirtualMemComputeAllocated(hDlg, NULL) ); } if (lres != RET_NO_CHANGE) { fEnableApply = TRUE;
if (lres != RET_CHANGE_NO_REBOOT) { MsgBoxParam( hDlg, IDS_SYSDM_RESTART, IDS_SYSDM_TITLE, MB_OK | MB_ICONINFORMATION );
g_fRebootRequired = TRUE; } } } break;
case IDC_PERF_WORKSTATION: if (BN_CLICKED == HIWORD(wParam)) { //
// Workstations have maximum foreground boost
//
iNewChoice = PROCESS_PRIORITY_SEPARATION_MAX;
//
// Workstations have variable, short quanta
NewRegVal &= ~PROCESS_QUANTUM_VARIABLE_MASK; NewRegVal |= PROCESS_QUANTUM_VARIABLE_VALUE; NewRegVal &= ~PROCESS_QUANTUM_LONG_MASK; NewRegVal |= PROCESS_QUANTUM_SHORT_VALUE; } // if
break;
case IDC_PERF_SERVER: if (BN_CLICKED == HIWORD(wParam)) { //
// Servers have minimum foreground boost
//
iNewChoice = PROCESS_PRIORITY_SEPARATION_MIN;
//
// Servers have fixed, long quanta
//
NewRegVal &= ~PROCESS_QUANTUM_VARIABLE_MASK; NewRegVal |= PROCESS_QUANTUM_FIXED_VALUE; NewRegVal &= ~PROCESS_QUANTUM_LONG_MASK; NewRegVal |= PROCESS_QUANTUM_LONG_VALUE; } // if
break;
case IDC_PERF_CACHE_APPLICATION: if (BN_CLICKED == HIWORD(wParam)) { NewCacheRegVal = 0; } // if
break;
case IDC_PERF_CACHE_SYSTEM: if (BN_CLICKED == HIWORD(wParam)) { NewCacheRegVal = 1; } // if
break; }
if (fEnableApply) { // Enable the "Apply" button because changes have happened.
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L); } } break;
case WM_HELP: // F1
WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP, (DWORD_PTR) (LPSTR) aPerformanceHelpIds); break;
case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU, (DWORD_PTR) (LPSTR) aPerformanceHelpIds); break;
default: return FALSE; }
return TRUE; }
|