https://git.reactos.org/?p=reactos.git;a=commitdiff;h=647b518bd3e7f34025830…
commit 647b518bd3e7f340258309f04248768f1decbc78
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Mon Jan 20 18:25:05 2025 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Sat Jan 25 16:33:27 2025 +0200
[NTOS:MM] Fix process affinity in MmCreatePeb
---
ntoskrnl/mm/ARM3/procsup.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/ntoskrnl/mm/ARM3/procsup.c b/ntoskrnl/mm/ARM3/procsup.c
index da94b64b7ec..77ca7befd70 100644
--- a/ntoskrnl/mm/ARM3/procsup.c
+++ b/ntoskrnl/mm/ARM3/procsup.c
@@ -20,6 +20,7 @@
ULONG MmProcessColorSeed = 0x12345678;
ULONG MmMaximumDeadKernelStacks = 5;
SLIST_HEADER MmDeadStackSListHead;
+ULONG MmRotatingUniprocessorNumber = 0;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -526,7 +527,6 @@ MmCreatePeb(IN PEPROCESS Process,
PIMAGE_LOAD_CONFIG_DIRECTORY ImageConfigData;
NTSTATUS Status;
USHORT Characteristics;
- KAFFINITY ProcessAffinityMask = 0;
SectionOffset.QuadPart = (ULONGLONG)0;
*BasePeb = NULL;
@@ -606,6 +606,7 @@ MmCreatePeb(IN PEPROCESS Process,
// Heap and Debug Data
//
Peb->NumberOfProcessors = KeNumberProcessors;
+ Peb->ImageProcessAffinityMask = KeActiveProcessors;
Peb->BeingDebugged = (BOOLEAN)(Process->DebugPort != NULL);
Peb->NtGlobalFlag = NtGlobalFlag;
Peb->HeapSegmentReserve = MmHeapSegmentReserve;
@@ -712,7 +713,7 @@ MmCreatePeb(IN PEPROCESS Process,
if ((ImageConfigData) && (ImageConfigData->ProcessAffinityMask))
{
/* Take the value from the image configuration directory */
- ProcessAffinityMask = ImageConfigData->ProcessAffinityMask;
+ Peb->ImageProcessAffinityMask =
ImageConfigData->ProcessAffinityMask;
}
//
@@ -720,17 +721,12 @@ MmCreatePeb(IN PEPROCESS Process,
if (Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY)
{
//
- // Force it to use CPU 0
+ // Set single processor rotating affinity.
+ // See
https://www.microsoftpressstore.com/articles/article.aspx?p=2233328&seq…
//
- /* FIXME: this should use the MmRotatingUniprocessorNumber */
- Peb->ImageProcessAffinityMask = 0;
- }
- else
- {
- //
- // Whatever was configured
- //
- Peb->ImageProcessAffinityMask = ProcessAffinityMask;
+ Peb->ImageProcessAffinityMask =
AFFINITY_MASK(MmRotatingUniprocessorNumber);
+ ASSERT(Peb->ImageProcessAffinityMask & KeActiveProcessors);
+ MmRotatingUniprocessorNumber = (MmRotatingUniprocessorNumber + 1) %
KeNumberProcessors;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)