From 7c23a2e38e9c49828364a7b02c2116fd0964b94e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 3 Mar 2025 20:29:36 +0100 Subject: [PATCH] [NTOS:MM] Split MmVerifyImageIsOkForMpUse() into an auxiliary inlined helper. This helper is used when an existing NtHeader is already available. --- ntoskrnl/mm/ARM3/sysldr.c | 43 +++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/ntoskrnl/mm/ARM3/sysldr.c b/ntoskrnl/mm/ARM3/sysldr.c index 2cdfc365cc7..eb1544babbf 100644 --- a/ntoskrnl/mm/ARM3/sysldr.c +++ b/ntoskrnl/mm/ARM3/sysldr.c @@ -2716,28 +2716,37 @@ MiEnablePagingOfDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry) if (PointerPte) MiSetPagingOfDriver(PointerPte, LastPte); } +FORCEINLINE +BOOLEAN +MiVerifyImageIsOkForMpUse( + _In_ PIMAGE_NT_HEADERS NtHeaders) +{ + /* Fail if we have 2+ CPUs, but the image is only safe for UP */ + if ((KeNumberProcessors > 1) && + (NtHeaders->FileHeader.Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY)) + { + return FALSE; + } + /* Otherwise, it's safe to use */ + return TRUE; +} + +// TODO: Use this function to verify that the loaded boot drivers +// (in ExpLoadBootSymbols) are compatible with MP. BOOLEAN NTAPI -MmVerifyImageIsOkForMpUse(IN PVOID BaseAddress) +MmVerifyImageIsOkForMpUse( + _In_ PVOID BaseAddress) { - PIMAGE_NT_HEADERS NtHeader; + PIMAGE_NT_HEADERS NtHeaders; PAGED_CODE(); - /* Get NT Headers */ - NtHeader = RtlImageNtHeader(BaseAddress); - if (NtHeader) - { - /* Check if this image is only safe for UP while we have 2+ CPUs */ - if ((KeNumberProcessors > 1) && - (NtHeader->FileHeader.Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY)) - { - /* Fail */ - return FALSE; - } - } - - /* Otherwise, it's safe */ - return TRUE; + /* Get the NT headers. If none, suppose the image + * is safe to use, otherwise invoke the helper. */ + NtHeaders = RtlImageNtHeader(BaseAddress); + if (!NtHeaders) + return TRUE; + return MiVerifyImageIsOkForMpUse(NtHeaders); } NTSTATUS