Skip to content

Commit 2249694

Browse files
authored
Add files via upload
1 parent b963618 commit 2249694

File tree

6 files changed

+221
-150
lines changed

6 files changed

+221
-150
lines changed

SetProcess/SetProcess.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,18 @@ void cpu_set_action(int argc, char* argv[]) {
3333
EnablePrivilege(dwProcessId, SE_DEBUG_NAME);
3434
EnablePrivilege(dwProcessId, SE_INC_BASE_PRIORITY_NAME);
3535

36-
ULONG cpuBitMask = ConvertToBitMaskHex(argv[3]);
36+
DWORD IdCount;
37+
ULONG* Ids = ConvertToCpuSetIds(argv[3], &IdCount);
3738

3839
// Establecer Conjuntos de CPU
39-
if (SetProcessCpuSetMask(dwProcessId, cpuBitMask)){
40+
if (SetProcessCpuSetID(dwProcessId, Ids, IdCount)){
4041
// Establecerlo en todos los procesos hijos
4142
if (argc == 5 && strcmp(argv[4], "-r") == 0){
4243
DWORD dwChildProcessId[64] = {0}; // Inicializar el array a 0
4344
DWORD NumProcesses = GetChildProcesses(dwProcessId, dwChildProcessId);
4445

4546
for (DWORD i = 0; i < NumProcesses; i++) {
46-
SetProcessCpuSetMask(dwChildProcessId[i], cpuBitMask);
47+
SetProcessCpuSetID(dwChildProcessId[i], Ids, IdCount);
4748
}
4849

4950
}

SetProcess/SetProcess.h

Lines changed: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ extern "C" {
2222
ULONG IoPriority;
2323
} IO_PRIORITY_INFORMATION, *PIO_PRIORITY_INFORMATION;
2424

25-
WINBASEAPI WINBOOL WINAPI SetProcessDefaultCpuSetMasks(
26-
HANDLE Process,
27-
PGROUP_AFFINITY CpuSetMasks,
28-
USHORT CpuSetMaskCount
25+
WINBASEAPI WINBOOL WINAPI SetProcessDefaultCpuSets (
26+
HANDLE Process,
27+
const ULONG *CpuSetIds,
28+
ULONG CpuSetIdCount
2929
);
3030
}
3131

@@ -202,70 +202,76 @@ DWORD ConvertToBitMask(const char* Str, DWORD counts = NULL) {
202202
return Mask;
203203
}
204204

205-
WORD ConvertToBitMaskHex(const char* Str) {
205+
ULONG* ConvertToCpuSetIds(const char* str, DWORD* Count) {
206206
SYSTEM_INFO sysinfo;
207207
GetSystemInfo(&sysinfo);
208208
DWORD MAX_CPUS = sysinfo.dwNumberOfProcessors;
209209

210-
DWORD Mask = 0;
211-
const char* ptr = Str;
210+
ULONG* cpus = (ULONG*)malloc(MAX_CPUS * sizeof(ULONG));
211+
if (!cpus) {
212+
MessageBox(0, "Error allocating memory for CPU sets", "Error", MB_OK | MB_ICONERROR);
213+
return NULL;
214+
}
215+
216+
DWORD numCpus = 0;
217+
const char* ptr = str;
212218

213219
while (*ptr != '\0') {
214220
char* endptr;
215-
int Num = strtol(ptr, &endptr, 10);
221+
int num = strtol(ptr, &endptr, 10);
216222
if (ptr == endptr) {
217223
break; // No se pudo convertir a número
218224
}
219-
if (Num >= MAX_CPUS) {
220-
MessageBox(0, "cpu number out of range", "Error", MB_OK | MB_ICONERROR);
221-
return 0;
225+
if (num >= MAX_CPUS) {
226+
char errorMsg[64];
227+
snprintf(errorMsg, sizeof(errorMsg), "Número de CPU fuera de rango: %d", num);
228+
MessageBox(NULL, errorMsg, "Error", MB_OK | MB_ICONERROR);
229+
free(cpus);
230+
return NULL; // Salir si el número es mayor que el máximo de CPUs
222231
}
223-
Mask |= (1 << Num);
232+
// Ajustar num al ID de conjunto de CPU específico
233+
cpus[numCpus++] = 256 + num; // Ejemplo: 256 es el primer ID de conjunto de CPU
234+
224235
ptr = endptr;
236+
// No saltar la coma, solo avanzar si es una coma
225237
if (*ptr == ',') {
226-
++ptr; // Saltar la coma
238+
ptr++;
227239
}
228240
}
229241

230-
return Mask;
242+
*Count = numCpus;
243+
return cpus;
231244
}
232245

233-
BOOL SetProcessCpuSetMask(DWORD dwProcessId, DWORD cpuBitmask) {
246+
BOOL SetProcessCpuSetID(DWORD dwProcessId, ULONG* Ids, DWORD Count) {
234247
// Abrir el proceso con permisos para establecer información limitada
235248
HANDLE hProcess = OpenProcess(PROCESS_SET_INFORMATION, FALSE, dwProcessId);
236249
if (hProcess == NULL) {
250+
MessageBox(0, "Error opening process", "Error", MB_OK | MB_ICONERROR);
237251
return FALSE;
238252
}
239253

240-
// Si se especifica un bitmask de 0, se debe revertir los CpuSets
241-
if (cpuBitmask == 0) {
242-
BOOL success = SetProcessDefaultCpuSetMasks(hProcess, NULL, 0);
243-
if (!success) {
244-
MessageBox(0, "Error setting cpu sets", "Error", MB_OK | MB_ICONERROR);
254+
// Si se especifica NULL, se debe revertir los CpuSets
255+
if (Ids == NULL) {
256+
if (!SetProcessDefaultCpuSets(hProcess, NULL, 0)) {
257+
MessageBox(0, "Error setting default CPU sets", "Error", MB_OK | MB_ICONERROR);
258+
CloseHandle(hProcess);
259+
return FALSE;
245260
}
246261
CloseHandle(hProcess);
247-
return success;
262+
return TRUE;
248263
}
249264

250-
// Obtener el número máximo de CPUs disponibles en el sistema
251-
SYSTEM_INFO sysinfo;
252-
GetSystemInfo(&sysinfo);
253-
DWORD MAX_CPUS = sysinfo.dwNumberOfProcessors;
254-
255-
GROUP_AFFINITY cpuSetMasks[1];
256-
cpuSetMasks[0].Mask = cpuBitmask;
257-
cpuSetMasks[0].Group = 0;
258-
int actualCpuSetMaskCount = 1;
259-
260-
// Llamar a la función SetProcessDefaultCpuSetMasks para establecer las máscaras de CPU
261-
BOOL success = SetProcessDefaultCpuSetMasks(hProcess, cpuSetMasks, actualCpuSetMaskCount);
262-
if (!success) {
263-
MessageBox(0, "Error setting cpu sets", "Error", MB_OK | MB_ICONERROR);
265+
// Llamar a la función SetProcessDefaultCpuSets para establecer las máscaras de CPU
266+
if (!SetProcessDefaultCpuSets(hProcess, Ids, Count)) {
267+
MessageBox(0, "Error setting CPU sets", "Error", MB_OK | MB_ICONERROR);
268+
CloseHandle(hProcess);
269+
return FALSE;
264270
}
265271

266272
// Cerrar el handle del proceso
267273
CloseHandle(hProcess);
268-
return success;
274+
return TRUE;
269275
}
270276

271277
void SetIdealProcessor(DWORD dwProcessId, DWORD dwIdealProcessor)

SetProcess/SetProcess.layout

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
<CodeBlocks_layout_file>
33
<FileVersion major="1" minor="0" />
44
<ActiveTarget name="Release" />
5-
<File name="SetProcess.cpp" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
5+
<File name="SetProcess.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
66
<Cursor>
7-
<Cursor1 position="830" topLine="0" />
7+
<Cursor1 position="185" topLine="0" />
88
</Cursor>
99
</File>
10-
<File name="HelpProcess.h" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
10+
<File name="SetProcess.cpp" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
1111
<Cursor>
12-
<Cursor1 position="106" topLine="0" />
12+
<Cursor1 position="1586" topLine="21" />
1313
</Cursor>
1414
</File>
15-
<File name="SetProcess.rc" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
15+
<File name="SetProcess.rc" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
1616
<Cursor>
17-
<Cursor1 position="482" topLine="0" />
17+
<Cursor1 position="0" topLine="0" />
1818
</Cursor>
1919
</File>
2020
</CodeBlocks_layout_file>

SetProcessGui/SetProcessGui.cpp

Lines changed: 44 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -161,74 +161,67 @@ BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
161161
{
162162
if (index != LB_ERR)
163163
{
164-
DWORD CPUs[MAX_CPUS] = { 0 };
164+
ULONG cpuSetIds[MAX_CPUS] = {0};
165+
ULONG cpuSetIdCount = MAX_CPUS;
165166

166-
DWORD cpuBitmask = 0;
167-
GROUP_AFFINITY cpuSetMasks[MAX_CPUS];
168-
USHORT actualCpuSetMaskCount = 0;
169-
170-
// Obtener las máscaras de conjuntos de CPU predeterminadas
171-
BOOL success = GetProcessCpuSetMask(dwProcessId, cpuSetMasks, MAX_CPUS, &actualCpuSetMaskCount);
167+
// Obtener los IDs de los conjuntos de CPU para el proceso actual
168+
if(!GetProcessCpuSetId(dwProcessId, cpuSetIds, &cpuSetIdCount)){
169+
memset(cpuSetIds, 0, sizeof(cpuSetIds));
170+
cpuSetIdCount = 0;
171+
}
172172

173-
if (success)
173+
DWORD cpuSetBitMask[MAX_CPUS] = {0}; // Crear la bitmask como un array
174+
for (ULONG i = 0; i < cpuSetIdCount; ++i)
174175
{
175-
// Preparar la bitmask para mostrar en el diálogo o cualquier otro uso
176-
cpuBitmask = 0;
177-
for (USHORT i = 0; i < actualCpuSetMaskCount; ++i)
178-
{
179-
cpuBitmask |= cpuSetMasks[i].Mask;
180-
}
181-
182-
// Actualizar CPUs[] según la bitmask obtenida
183-
for (DWORD i = 0; i < MAX_CPUS; ++i)
184-
{
185-
CPUs[i] = (cpuBitmask & (1ULL << i)) ? 1 : 0;
176+
// Convertir cada ID de CPU en la bitmask correspondiente
177+
if (cpuSetIds[i] >= 256) {
178+
cpuSetBitMask[cpuSetIds[i] - 256] = 1;
186179
}
187180
}
188181

189-
// Mostrar el diálogo de bitmask con CPUs obtenidos o por defecto
190-
ShowBitMaskDialog(hwndDlg, CPUs);
182+
// Mostrar el diálogo para seleccionar conjuntos de CPU
183+
ShowBitMaskDialog(hwndDlg, cpuSetBitMask);
191184

192-
bool OneProcessorSelected = false;
193-
// Verificar si al menos un procesador está seleccionado
194-
for (DWORD i = 0; i < MAX_CPUS; ++i)
185+
bool anyProcessorSelected = false;
186+
for (ULONG i = 0; i < MAX_CPUS; ++i)
195187
{
196-
if (CPUs[i] == 1)
188+
if (cpuSetBitMask[i] != 0)
197189
{
198-
OneProcessorSelected = true;
190+
anyProcessorSelected = true;
199191
break;
200192
}
201193
}
202194

203-
if (!OneProcessorSelected)
195+
if (!anyProcessorSelected)
204196
{
205-
// Revertir
206-
SetProcessCpuSetMask(dwProcessId, NULL);
197+
// Si no se seleccionó ningún procesador, revertir los cambios
198+
SetProcessCpuSetId(dwProcessId, NULL, 0);
207199
RegKeyDelete(HKEY_CURRENT_USER, registryKey, "CpuSets");
208200
break;
209201
}
210202

211-
DWORD newCpuBitmask = 0;
212-
for (DWORD i = 0; i < MAX_CPUS; ++i)
203+
memset(cpuSetIds, 0, sizeof(cpuSetIds));
204+
ULONG idIndex = 0;
205+
206+
for (ULONG i = 0; i < MAX_CPUS; ++i)
213207
{
214-
if (CPUs[i] == 1)
208+
// Verificar si el bit en la posición i está activo en cpuSetBitMask
209+
if (cpuSetBitMask[i] == 1)
215210
{
216-
newCpuBitmask |= (1 << i);
211+
cpuSetIds[idIndex++] = i + 256;
217212
}
218213
}
219214

220-
// Establecer los conjuntos de CPU
221-
SetProcessCpuSetMask(dwProcessId, newCpuBitmask);
215+
// Establecer los conjuntos de CPU para el proceso
216+
SetProcessCpuSetId(dwProcessId, cpuSetIds, idIndex);
222217

223-
// Convertir la nueva bitmask a una cadena de bits para almacenar en el registro
224-
char cpuBitmaskString[MAX_CPUS + 1] = { 0 }; // Más 1 para el terminador nulo
225-
for (DWORD i = 0; i < MAX_CPUS; ++i)
218+
char cpuSetIdsString[MAX_CPUS + 1] = { 0 }; // +1 para el terminador nulo
219+
for (ULONG i = 0; i < MAX_CPUS; ++i)
226220
{
227-
cpuBitmaskString[i] = (newCpuBitmask & (1 << i)) ? '1' : '0';
221+
cpuSetIdsString[i] = (cpuSetBitMask[i] == 1) ? '1' : '0';
228222
}
229-
230-
// Escribir la nueva bitmask en el registro
231-
RegKeySet(HKEY_CURRENT_USER, registryKey, "CpuSets", cpuBitmaskString);
223+
cpuSetIdsString[MAX_CPUS] = '\0'; // Asegurar el terminador nulo
224+
RegKeySet(HKEY_CURRENT_USER, registryKey, "CpuSets", cpuSetIdsString);
232225
}
233226
}
234227
return TRUE;
@@ -237,19 +230,17 @@ BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
237230
{
238231
if (index != LB_ERR)
239232
{
240-
DWORD CPUs[MAX_CPUS] = { 0 };
233+
DWORD CPUs[MAX_CPUS] = {0};
241234

242-
// Cargar IdealProcesor si existe
243-
char* IdealProcStr = RegKeyQuery(HKEY_CURRENT_USER, registryKey, "IdealProc");
244-
if (IdealProcStr != nullptr)
245-
{
246-
DWORD IdealProc = atoi(IdealProcStr);
247-
memset(CPUs, 0, sizeof(DWORD) * MAX_CPUS);
235+
// Obtener el procesador ideal del hilo del proceso
236+
PROCESSOR_NUMBER idealProcessor;
237+
BOOL success = GetIdealProcessor(dwProcessId, &idealProcessor);
248238

249-
// Establecer el bit correspondiente en CPUs
250-
if (IdealProc < MAX_CPUS) {
251-
CPUs[IdealProc] = 1;
252-
}
239+
DWORD idealProcessorIndex = idealProcessor.Number;
240+
241+
for (DWORD i = 0; i < MAX_CPUS; ++i)
242+
{
243+
CPUs[i] = (i == idealProcessorIndex) ? 1 : 0;
253244
}
254245

255246
ShowBitMaskDialog(hwndDlg, CPUs);
@@ -259,7 +250,6 @@ BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
259250
break;
260251
}
261252

262-
263253
// Establecer procesador ideal
264254
SetIdealProcessor(dwProcessId, activeIndex);
265255

0 commit comments

Comments
 (0)