perf.c
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 12k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /*++
  2. Microsoft Confidential
  3. Copyright (c) 1992-1997  Microsoft Corporation
  4. All rights reserved
  5. Module Name:
  6.     perf.c
  7. Abstract:
  8.     Implements the Performance dialog of the System Control Panel Applet
  9. Author:
  10.     Eric Flo (ericflo) 19-Jun-1995
  11. Revision History:
  12.     15-Oct-1997 scotthal
  13.         Complete overhaul
  14. --*/
  15. #include <sysdm.h>
  16. #include <help.h>
  17. #define PROCESS_PRIORITY_SEPARATION_MASK    0x00000003
  18. #define PROCESS_PRIORITY_SEPARATION_MAX     0x00000002
  19. #define PROCESS_PRIORITY_SEPARATION_MIN     0x00000000
  20. #define PROCESS_QUANTUM_VARIABLE_MASK       0x0000000c
  21. #define PROCESS_QUANTUM_VARIABLE_DEF        0x00000000
  22. #define PROCESS_QUANTUM_VARIABLE_VALUE      0x00000004
  23. #define PROCESS_QUANTUM_FIXED_VALUE         0x00000008
  24. #define PROCESS_QUANTUM_LONG_MASK           0x00000030
  25. #define PROCESS_QUANTUM_LONG_DEF            0x00000000
  26. #define PROCESS_QUANTUM_LONG_VALUE          0x00000010
  27. #define PROCESS_QUANTUM_SHORT_VALUE         0x00000020
  28. #define X86PROG_FILENAME TEXT("x86prog.exe")
  29. //
  30. // Globals
  31. //
  32. HKEY  m_hKeyPerf = NULL;
  33. TCHAR m_szRegPriKey[] = TEXT( "SYSTEM\CurrentControlSet\Control\PriorityControl" );
  34. TCHAR m_szRegPriority[] = TEXT( "Win32PrioritySeparation" );
  35. //
  36. // Help ID's
  37. //
  38. DWORD aPerformanceHelpIds[] = {
  39.     IDC_STATIC,                  NO_HELP,
  40.     IDC_PERF_VM_ALLOCD,          (IDH_PERF + 1),
  41.     IDC_PERF_VM_ALLOCD_LABEL,    (IDH_PERF + 1),
  42.     IDC_PERF_GROUP,              NO_HELP,
  43.     IDC_PERF_TEXT,               (IDH_PERF + 3),
  44.     IDC_PERF_WORKSTATION,        (IDH_PERF + 4),
  45.     IDC_PERF_SERVER,             (IDH_PERF + 5),
  46.     IDC_PERF_VM_GROUP,           NO_HELP,
  47.     IDC_PERF_CHANGE,             (IDH_PERF + 7),
  48.     IDC_PERF_X86PROG_GROUP,      NO_HELP,
  49.     IDC_PERF_X86PROG_ICON,       (IDH_PERF + 8),
  50.     IDC_PERF_X86PROG_TEXT,       (IDH_PERF + 8),
  51.     IDC_PERF_X86PROG_BUTTON,     (IDH_PERF + 9),
  52.     0, 0
  53. };
  54. INT_PTR
  55. APIENTRY 
  56. PerformanceDlgProc(
  57.     IN HWND hDlg, 
  58.     IN UINT uMsg, 
  59.     IN WPARAM wParam, 
  60.     IN LPARAM lParam
  61. )
  62. /*++
  63. Routine Description:
  64.     Handles messages sent to Performance dialog
  65. Arguments:
  66.     hDlg -
  67.         Supplies window handle
  68.     uMsg -
  69.         Supplies message being sent
  70.     wParam -
  71.         Supplies message parameter
  72.     lParam -
  73.         Supplies message parameter
  74. Return Value:
  75.     TRUE if message was handled
  76.     FALSE if message was unhandled
  77. --*/
  78. {
  79.     static int    iNewChoice = 0;
  80.     LONG   RegRes;
  81.     DWORD  Type, Value, Length;
  82.     static int InitPos;
  83.     static int InitRegVal;
  84.     static int NewRegVal;
  85.     static BOOL fVMInited = FALSE;
  86.     static BOOL fTempPfWarningShown = FALSE;
  87.     BOOL fTempPf;
  88.     BOOL fWorkstationProduct = IsWorkstationProduct();
  89.     BOOL fAdministrator = IsUserAdmin();
  90.     BOOL fVariableQuanta = FALSE;
  91.     BOOL fShortQuanta = FALSE;
  92.     switch (uMsg)
  93.     {
  94.     case WM_INITDIALOG:
  95.         InitPos = 0;
  96.         InitRegVal = 0;
  97.         //
  98.         // initialize from the registry
  99.         //
  100.         RegRes = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
  101.                                m_szRegPriKey,
  102.                                0,
  103.                                fAdministrator ? KEY_QUERY_VALUE | KEY_SET_VALUE : KEY_QUERY_VALUE,
  104.                                &m_hKeyPerf );
  105.         if( RegRes == ERROR_SUCCESS ) {
  106.             Length = sizeof( Value );
  107.             RegRes = RegQueryValueEx( m_hKeyPerf,
  108.                                       m_szRegPriority,
  109.                                       NULL,
  110.                                       &Type,
  111.                                       (LPBYTE) &Value,
  112.                                       &Length );
  113.             if( RegRes == ERROR_SUCCESS ) {
  114.                 InitRegVal = Value;
  115.                 InitPos = InitRegVal & PROCESS_PRIORITY_SEPARATION_MASK;
  116.                 if ( InitPos > PROCESS_PRIORITY_SEPARATION_MAX ) {
  117.                     InitPos = PROCESS_PRIORITY_SEPARATION_MAX;
  118.                     }
  119.             }
  120.         } 
  121.         
  122.         if ((RegRes != ERROR_SUCCESS) || (!fAdministrator))  {
  123.             EnableWindow(GetDlgItem(hDlg, IDC_PERF_WORKSTATION), FALSE);
  124.             EnableWindow(GetDlgItem(hDlg, IDC_PERF_SERVER), FALSE);
  125.         }
  126.         NewRegVal = InitRegVal;
  127.         //
  128.         // determine if we are using fixed or variable quantums
  129.         //
  130.         switch ( InitRegVal & PROCESS_QUANTUM_VARIABLE_MASK ) {
  131.             case PROCESS_QUANTUM_VARIABLE_VALUE:
  132.                 fVariableQuanta = TRUE;
  133.                 break;
  134.             case PROCESS_QUANTUM_FIXED_VALUE:
  135.                 fVariableQuanta = FALSE;
  136.                 break;
  137.             case PROCESS_QUANTUM_VARIABLE_DEF:
  138.             default:
  139.                 if ( fWorkstationProduct ) {
  140.                     fVariableQuanta = TRUE;
  141.                     }
  142.                 else {
  143.                     fVariableQuanta = FALSE;
  144.                     }
  145.                 break;
  146.             }
  147.         //
  148.         // determine if we are using long or short
  149.         //
  150.         switch ( InitRegVal & PROCESS_QUANTUM_LONG_MASK ) {
  151.             case PROCESS_QUANTUM_LONG_VALUE:
  152.                 fShortQuanta = FALSE;
  153.                 break;
  154.             case PROCESS_QUANTUM_SHORT_VALUE:
  155.                 fShortQuanta = TRUE;
  156.                 break;
  157.             case PROCESS_QUANTUM_LONG_DEF:
  158.             default:
  159.                 if ( fWorkstationProduct ) {
  160.                     fShortQuanta = TRUE;
  161.                     }
  162.                 else {
  163.                     fShortQuanta = FALSE;
  164.                     }
  165.                 break;
  166.             }
  167.         
  168.         //
  169.         // Short, Variable Quanta == Workstation-like interactive response
  170.         // Long, Fixed Quanta == Server-like interactive response
  171.         //
  172.         if (fVariableQuanta && fShortQuanta) {
  173.             iNewChoice = PROCESS_PRIORITY_SEPARATION_MAX;
  174.             CheckRadioButton(
  175.                 hDlg,
  176.                 IDC_PERF_WORKSTATION,
  177.                 IDC_PERF_SERVER,
  178.                 IDC_PERF_WORKSTATION
  179.             );
  180.         } // if
  181.         else {
  182.             iNewChoice = PROCESS_PRIORITY_SEPARATION_MIN;
  183.             CheckRadioButton(
  184.                 hDlg,
  185.                 IDC_PERF_WORKSTATION,
  186.                 IDC_PERF_SERVER,
  187.                 IDC_PERF_SERVER
  188.             );
  189.         } // else
  190.         //
  191.         // Init the virtual memory part
  192.         //
  193.         if (VirtualInitStructures()) {
  194.             fVMInited = TRUE;
  195.             SetDlgItemMB( hDlg, IDC_PERF_VM_ALLOCD, VirtualMemComputeAllocated(hDlg, &fTempPf) );
  196.             //
  197.             // If the system created a temp pagefile, warn the user that
  198.             // the total pagefile size may appear a bit large, but only
  199.             // do so once per System Applet invokation.
  200.             //
  201.             if (fTempPf && !fTempPfWarningShown) {
  202.                 MsgBoxParam(
  203.                     hDlg,
  204.                     IDS_TEMP_PAGEFILE_WARN,
  205.                     INITS + 1,
  206.                     MB_ICONINFORMATION | MB_OK
  207.                 );
  208.                 fTempPfWarningShown = TRUE;
  209.             } // if (fTempPf...
  210.         }
  211.         break;
  212.     case WM_DESTROY:
  213.         //
  214.         // If the dialog box is going away, then close the
  215.         // registry key.
  216.         //
  217.         if (m_hKeyPerf) {
  218.             RegCloseKey( m_hKeyPerf );
  219.             m_hKeyPerf = NULL;
  220.         }
  221.         if (fVMInited) {
  222.             VirtualFreeStructures();
  223.         }
  224.         break;
  225.     case WM_COMMAND: {
  226.         LRESULT lres;
  227.         switch (LOWORD(wParam)) {
  228.             case IDOK:
  229.                 // 
  230.                 // Save new time quantum stuff, if it has changed
  231.                 //
  232.                 NewRegVal &= ~PROCESS_PRIORITY_SEPARATION_MASK;
  233.                 NewRegVal |= iNewChoice;
  234.     
  235.                 if ( NewRegVal != InitRegVal ) {
  236.     
  237.                     Value = NewRegVal;
  238.     
  239.                     if( m_hKeyPerf )
  240.                     {
  241.                         Type = REG_DWORD;
  242.                         Length = sizeof( Value );
  243.                         RegSetValueEx( m_hKeyPerf,
  244.                                        m_szRegPriority,
  245.                                        0,
  246.                                        REG_DWORD,
  247.                                        (LPBYTE) &Value,
  248.                                        Length );
  249.                         InitRegVal = Value;
  250.     
  251.                         //
  252.                         // Kernel monitors this part of the 
  253.                         // registry, so don't tell user he has to reboot
  254.                         //
  255.                     }
  256.                 }
  257.     
  258.                 EndDialog(hDlg, 0);
  259.                 break;
  260.             case IDCANCEL:
  261.                 EndDialog(hDlg, 0);
  262.                 break;
  263.             case IDC_PERF_CHANGE: {
  264.                 lres = DialogBox(
  265.                     hInstance, 
  266.                     MAKEINTRESOURCE(DLG_VIRTUALMEM),
  267.                     hDlg, 
  268.                     VirtualMemDlg
  269.                 );
  270.                 if (fVMInited) {
  271.                     SetDlgItemMB( 
  272.                         hDlg, 
  273.                         IDC_PERF_VM_ALLOCD, 
  274.                         VirtualMemComputeAllocated(hDlg, NULL) 
  275.                     );
  276.                 }
  277.                 if ((lres != RET_NO_CHANGE) && (lres != RET_CHANGE_NO_REBOOT)) {
  278.                     MsgBoxParam(
  279.                         hDlg,
  280.                         SYSTEM + 42,
  281.                         INITS + 1,
  282.                         MB_OK | MB_ICONINFORMATION
  283.                     );
  284.                     g_fRebootRequired = TRUE;
  285.                 }
  286.                 }
  287.                 break;
  288.             
  289.             case IDC_PERF_WORKSTATION:
  290.                 if (BN_CLICKED == HIWORD(wParam)) {
  291.                     //
  292.                     // Workstations have maximum foreground boost
  293.                     //
  294.                     iNewChoice = PROCESS_PRIORITY_SEPARATION_MAX;
  295.                     //
  296.                     // Workstations have variable, short quanta
  297.                     NewRegVal &= ~PROCESS_QUANTUM_VARIABLE_MASK;
  298.                     NewRegVal |= PROCESS_QUANTUM_VARIABLE_VALUE;
  299.                     NewRegVal &= ~PROCESS_QUANTUM_LONG_MASK;
  300.                     NewRegVal |= PROCESS_QUANTUM_SHORT_VALUE;
  301.                 } // if    
  302.                 break;
  303.             case IDC_PERF_SERVER:
  304.                 if (BN_CLICKED == HIWORD(wParam)) {
  305.                     //
  306.                     // Servers have minimum foreground boost
  307.                     //
  308.                     iNewChoice = PROCESS_PRIORITY_SEPARATION_MIN;
  309.                     //
  310.                     // Servers have fixed, long quanta
  311.                     //
  312.                     NewRegVal &= ~PROCESS_QUANTUM_VARIABLE_MASK;
  313.                     NewRegVal |= PROCESS_QUANTUM_FIXED_VALUE;
  314.                     NewRegVal &= ~PROCESS_QUANTUM_LONG_MASK;
  315.                     NewRegVal |= PROCESS_QUANTUM_LONG_VALUE;
  316.                 } // if
  317.                 break;
  318.             case IDC_PERF_X86PROG_BUTTON: 
  319.                 if (BN_CLICKED == HIWORD(wParam)) {
  320.                     SHELLEXECUTEINFO sei;
  321.                     memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
  322.                     sei.cbSize = sizeof(SHELLEXECUTEINFO);
  323.                     sei.hwnd = hDlg;
  324.                     sei.lpVerb = TEXT("Open");
  325.                     sei.lpFile = X86PROG_FILENAME;
  326.                     sei.nShow = SW_SHOW;
  327.                     ShellExecuteEx(&sei);
  328.                 } // if
  329.                 break;
  330.             default: {
  331.                 break;
  332.                 }
  333.             }
  334.         }
  335.         break;
  336.     case WM_HELP:      // F1
  337.         WinHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, HELP_FILE, HELP_WM_HELP,
  338.         (DWORD_PTR) (LPSTR) aPerformanceHelpIds);
  339.         break;
  340.     case WM_CONTEXTMENU:      // right mouse click
  341.         WinHelp((HWND) wParam, HELP_FILE, HELP_CONTEXTMENU,
  342.         (DWORD_PTR) (LPSTR) aPerformanceHelpIds);
  343.         break;
  344.     default:
  345.         return FALSE;
  346.     }
  347.     return TRUE;
  348. }