https://git.reactos.org/?p=reactos.git;a=commitdiff;h=647b518bd3e7f340258309f04248768f1decbc78

commit 647b518bd3e7f340258309f04248768f1decbc78
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Mon Jan 20 18:25:05 2025 +0200
Commit:     Timo Kreuzer <timo.kreu...@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&seqNum=3
                 //
-                /* 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)

Reply via email to