ReactOS  0.4.12-dev-102-g4b7f1e0
affinity.c
Go to the documentation of this file.
1 /*
2  * ReactOS Task Manager
3  *
4  * affinity.c
5  *
6  * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
7  * 2005 Klemens Friedl <frik85@reactos.at>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "precomp.h"
25 
27 
28 static const DWORD dwCpuTable[] = {
37 };
38 
40 
42 {
43  DWORD dwProcessId;
44  WCHAR strErrorText[260];
45  WCHAR szTitle[256];
46 
47  dwProcessId = GetSelectedProcessId();
48 
49  if (dwProcessId == 0)
50  return;
51 
52  hProcessAffinityHandle = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_SET_INFORMATION, FALSE, dwProcessId);
53  if (!hProcessAffinityHandle) {
54  GetLastErrorText(strErrorText, sizeof(strErrorText) / sizeof(WCHAR));
55  LoadStringW(hInst, IDS_MSG_ACCESSPROCESSAFF, szTitle, sizeof(szTitle) / sizeof(WCHAR));
56  MessageBoxW(hMainWnd, strErrorText, szTitle, MB_OK|MB_ICONSTOP);
57  return;
58  }
60  if (hProcessAffinityHandle) {
61  CloseHandle(hProcessAffinityHandle);
62  hProcessAffinityHandle = NULL;
63  }
64 }
65 
68 {
69  DWORD_PTR dwProcessAffinityMask = 0;
70  DWORD_PTR dwSystemAffinityMask = 0;
71  WCHAR strErrorText[260];
72  WCHAR szTitle[256];
73  BYTE nCpu;
74 
75  switch (message) {
76  case WM_INITDIALOG:
77 
78  /*
79  * Get the current affinity mask for the process and
80  * the number of CPUs present in the system
81  */
82  if (!GetProcessAffinityMask(hProcessAffinityHandle, &dwProcessAffinityMask, &dwSystemAffinityMask)) {
83  GetLastErrorText(strErrorText, sizeof(strErrorText) / sizeof(WCHAR));
84  EndDialog(hDlg, 0);
85  LoadStringW(hInst, IDS_MSG_ACCESSPROCESSAFF, szTitle, sizeof(szTitle) / sizeof(WCHAR));
86  MessageBoxW(hMainWnd, strErrorText, szTitle, MB_OK|MB_ICONSTOP);
87  }
88 
89  for (nCpu=0; nCpu<sizeof(dwCpuTable) / sizeof(dwCpuTable[0]); nCpu++) {
90  /*
91  * Enable a checkbox for each processor present in the system
92  */
93  if (dwSystemAffinityMask & (1 << nCpu))
94  EnableWindow(GetDlgItem(hDlg, dwCpuTable[nCpu]), TRUE);
95  /*
96  * Check each checkbox that the current process
97  * has affinity with
98  */
99  if (dwProcessAffinityMask & (1 << nCpu))
100  CheckDlgButton(hDlg, dwCpuTable[nCpu], BST_CHECKED);
101  }
102 
103  return TRUE;
104 
105  case WM_COMMAND:
106 
107  /*
108  * If the user has cancelled the dialog box
109  * then just close it
110  */
111  if (LOWORD(wParam) == IDCANCEL) {
112  EndDialog(hDlg, LOWORD(wParam));
113  return TRUE;
114  }
115 
116  /*
117  * The user has clicked OK -- so now we have
118  * to adjust the process affinity mask
119  */
120  if (LOWORD(wParam) == IDOK) {
121  for (nCpu=0; nCpu<sizeof(dwCpuTable) / sizeof(dwCpuTable[0]); nCpu++) {
122  /*
123  * First we have to create a mask out of each
124  * checkbox that the user checked.
125  */
126  if (IsDlgButtonChecked(hDlg, dwCpuTable[nCpu]))
127  dwProcessAffinityMask |= (1 << nCpu);
128  }
129 
130  /*
131  * Make sure they are giving the process affinity
132  * with at least one processor. I'd hate to see a
133  * process that is not in a wait state get deprived
134  * of it's cpu time.
135  */
136  if (!dwProcessAffinityMask) {
137  LoadStringW(hInst, IDS_MSG_PROCESSONEPRO, strErrorText, sizeof(strErrorText) / sizeof(WCHAR));
138  LoadStringW(hInst, IDS_MSG_INVALIDOPTION, szTitle, sizeof(szTitle) / sizeof(WCHAR));
139  MessageBoxW(hDlg, strErrorText, szTitle, MB_OK|MB_ICONSTOP);
140  return TRUE;
141  }
142 
143  /*
144  * Try to set the process affinity
145  */
146  if (!SetProcessAffinityMask(hProcessAffinityHandle, dwProcessAffinityMask)) {
147  GetLastErrorText(strErrorText, sizeof(strErrorText) / sizeof(WCHAR));
148  EndDialog(hDlg, LOWORD(wParam));
149  LoadStringW(hInst, IDS_MSG_ACCESSPROCESSAFF, szTitle, sizeof(szTitle) / sizeof(WCHAR));
150  MessageBoxW(hMainWnd, strErrorText, szTitle, MB_OK|MB_ICONSTOP);
151  }
152 
153  EndDialog(hDlg, LOWORD(wParam));
154  return TRUE;
155  }
156 
157  break;
158  }
159 
160  return 0;
161 }
#define IDC_CPU2
Definition: resource.h:40
BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT)
Definition: tftpd.h:59
#define TRUE
Definition: types.h:120
#define IDC_CPU8
Definition: resource.h:54
DWORD GetSelectedProcessId(void)
Definition: procpage.c:99
#define IDOK
Definition: winuser.h:824
#define CloseHandle
Definition: compat.h:398
#define IDD_AFFINITY_DIALOG
Definition: resource.h:23
#define PROCESS_QUERY_INFORMATION
Definition: pstypes.h:158
#define IDC_CPU24
Definition: resource.h:100
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define IDC_CPU13
Definition: resource.h:70
#define CALLBACK
Definition: compat.h:27
#define IDC_CPU30
Definition: resource.h:119
#define MB_ICONSTOP
Definition: winuser.h:797
int32_t INT_PTR
Definition: typedefs.h:62
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define IDS_MSG_ACCESSPROCESSAFF
Definition: resource.h:241
UINT_PTR WPARAM
Definition: windef.h:207
#define IDC_CPU23
Definition: resource.h:99
#define IDC_CPU20
Definition: resource.h:91
LONG_PTR LPARAM
Definition: windef.h:208
#define IDC_CPU5
Definition: resource.h:46
BOOL WINAPI SetProcessAffinityMask(IN HANDLE hProcess, IN DWORD_PTR dwProcessAffinityMask)
Definition: proc.c:924
#define IDC_CPU4
Definition: resource.h:44
#define IDC_CPU7
Definition: resource.h:51
smooth NULL
Definition: ftsmooth.c:416
#define IDC_CPU22
Definition: resource.h:97
void ProcessPage_OnSetAffinity(void)
Definition: affinity.c:41
#define IDC_CPU31
Definition: resource.h:122
#define IDC_CPU11
Definition: resource.h:64
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define DialogBoxW(i, t, p, f)
Definition: winuser.h:4268
#define IDC_CPU3
Definition: resource.h:42
#define IDC_CPU0
Definition: resource.h:38
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDC_CPU12
Definition: resource.h:67
unsigned int UINT
Definition: ndis.h:50
#define IDC_CPU10
Definition: resource.h:60
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IDC_CPU19
Definition: resource.h:88
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:36
#define IDS_MSG_PROCESSONEPRO
Definition: resource.h:242
HWND hMainWnd
Definition: magnifier.c:33
unsigned char BYTE
Definition: mem.h:68
#define WM_COMMAND
Definition: winuser.h:1716
uint32_t DWORD_PTR
Definition: typedefs.h:63
#define IDC_CPU25
Definition: resource.h:103
#define IDC_CPU9
Definition: resource.h:57
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define IDC_CPU17
Definition: resource.h:82
#define IDC_CPU15
Definition: resource.h:76
#define IDC_CPU16
Definition: resource.h:79
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1257
HINSTANCE hInst
Definition: dxdiag.c:13
#define IDC_CPU18
Definition: resource.h:85
static INT_PTR CALLBACK AffinityDialogWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
Definition: affinity.c:67
LPWSTR GetLastErrorText(LPWSTR lpszBuf, DWORD dwSize)
Definition: taskmgr.c:1152
#define MB_OK
Definition: winuser.h:784
#define IDC_CPU28
Definition: resource.h:112
#define IDC_CPU1
Definition: resource.h:39
BOOL WINAPI GetProcessAffinityMask(IN HANDLE hProcess, OUT PDWORD_PTR lpProcessAffinityMask, OUT PDWORD_PTR lpSystemAffinityMask)
Definition: proc.c:893
#define BST_CHECKED
Definition: winuser.h:197
#define IDS_MSG_INVALIDOPTION
Definition: resource.h:243
HANDLE hProcessAffinityHandle
Definition: affinity.c:26
static const DWORD dwCpuTable[]
Definition: affinity.c:28
#define PROCESS_SET_INFORMATION
Definition: pstypes.h:157
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define IDCANCEL
Definition: winuser.h:825
#define WM_INITDIALOG
Definition: winuser.h:1715
#define IDC_CPU6
Definition: resource.h:49
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define IDC_CPU29
Definition: resource.h:115
#define IDC_CPU26
Definition: resource.h:106
#define IDC_CPU27
Definition: resource.h:109
#define IDC_CPU21
Definition: resource.h:94
#define IDC_CPU14
Definition: resource.h:73