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)