@@ -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