Reactos

[NTOS:MM:PS] Little fixes for NTDLL loading (#7707)

- [NTOS:PS] `STATUS_INVALID_IMAGE_PROTECT` returned by `MmCheckSystemImage` should be a fatal error too.
- [NTOS:PS] Fix object attributes for opening NTDLL.
- [NTOS:MM] Remove `MmCheckSystemImage` unused parameter.
- [NTOS:MM] Inline `MmVerifyImageIsOkForMpUse` in `MmCheckSystemImage`, reducing a call to `RtlImageNtHeader`.

authored by

Ratin Gao and committed by
GitHub
4d605ec2 7c23a2e3

+11 -11
+1 -3
ntoskrnl/include/internal/mm.h
··· 1652 1652 NTSTATUS 1653 1653 NTAPI 1654 1654 MmCheckSystemImage( 1655 - IN HANDLE ImageHandle, 1656 - IN BOOLEAN PurgeSection 1657 - ); 1655 + _In_ HANDLE ImageHandle); 1658 1656 1659 1657 NTSTATUS 1660 1658 NTAPI
+7 -5
ntoskrnl/mm/ARM3/sysldr.c
··· 2751 2751 2752 2752 NTSTATUS 2753 2753 NTAPI 2754 - MmCheckSystemImage(IN HANDLE ImageHandle, 2755 - IN BOOLEAN PurgeSection) 2754 + MmCheckSystemImage( 2755 + _In_ HANDLE ImageHandle) 2756 2756 { 2757 2757 NTSTATUS Status; 2758 2758 HANDLE SectionHandle; ··· 2846 2846 goto Fail; 2847 2847 } 2848 2848 2849 - /* Check that it's a valid SMP image if we have more then one CPU */ 2850 - if (!MmVerifyImageIsOkForMpUse(ViewBase)) 2849 + #ifdef CONFIG_SMP 2850 + /* Check that it's a valid SMP image if we have more than one CPU */ 2851 + if (!MiVerifyImageIsOkForMpUse(NtHeaders)) 2851 2852 { 2852 2853 /* Otherwise it's not the right image */ 2853 2854 Status = STATUS_IMAGE_MP_UP_MISMATCH; 2854 2855 } 2856 + #endif // CONFIG_SMP 2855 2857 } 2856 2858 2857 2859 /* Unmap the section, close the handle, and return status */ ··· 3180 3182 } 3181 3183 3182 3184 /* Validate it */ 3183 - Status = MmCheckSystemImage(FileHandle, FALSE); 3185 + Status = MmCheckSystemImage(FileHandle); 3184 3186 if ((Status == STATUS_IMAGE_CHECKSUM_MISMATCH) || 3185 3187 (Status == STATUS_IMAGE_MP_UP_MISMATCH) || 3186 3188 (Status == STATUS_INVALID_IMAGE_PROTECT))
+3 -3
ntoskrnl/ps/psmgr.c
··· 196 196 /* Locate and open NTDLL to determine ImageBase and LdrStartup */ 197 197 InitializeObjectAttributes(&ObjectAttributes, 198 198 &PsNtDllPathName, 199 - 0, 199 + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 200 200 NULL, 201 201 NULL); 202 202 Status = ZwOpenFile(&FileHandle, ··· 212 212 } 213 213 214 214 /* Check if the image is valid */ 215 - Status = MmCheckSystemImage(FileHandle, TRUE); 216 - if (Status == STATUS_IMAGE_CHECKSUM_MISMATCH) 215 + Status = MmCheckSystemImage(FileHandle); 216 + if (Status == STATUS_IMAGE_CHECKSUM_MISMATCH || Status == STATUS_INVALID_IMAGE_PROTECT) 217 217 { 218 218 /* Raise a hard error */ 219 219 HardErrorParameters = (ULONG_PTR)&PsNtDllPathName;