diff --git a/dll/ntdll/ldr/ldrinit.c b/dll/ntdll/ldr/ldrinit.c index 991f498dba252..efe3a9ec6085d 100644 --- a/dll/ntdll/ldr/ldrinit.c +++ b/dll/ntdll/ldr/ldrinit.c @@ -1538,7 +1538,36 @@ VOID NTAPI LdrpValidateImageForMp(IN PLDR_DATA_TABLE_ENTRY LdrDataTableEntry) { - UNIMPLEMENTED; + PIMAGE_NT_HEADERS NtHeaders; + NTSTATUS Status; + + /* Get the NT Headers */ + NtHeaders = RtlImageNtHeader(LdrDataTableEntry->DllBase); + if (NtHeaders == NULL) + { + RtlRaiseStatus(STATUS_INVALID_IMAGE_FORMAT); + } + + /* Check if the image is UP only */ + if (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY) + { + /* Set process affinity to 1 */ + DPRINT1("LDR: Image is UP only, setting process affinity to 1\n"); + KAFFINITY AffinityMask = 1; + Status = NtSetInformationProcess(NtCurrentProcess(), + ProcessAffinityMask, + &AffinityMask, + sizeof(AffinityMask)); + if (!NT_SUCCESS(Status)) + { + RtlRaiseStatus(Status); + } + + /* Save it in the PEB */ + NtCurrentPeb()->NumberOfProcessors = 1; + } + + // FIXME: Anything else to do? } BOOLEAN