Author: tkreuzer Date: Mon Dec 31 10:08:34 2012 New Revision: 58066
URL: http://svn.reactos.org/svn/reactos?rev=58066&view=rev Log: [FREELDR] Implement MmCheckFreeldrImageFile() to check that freeldr was properly compiled and loaded.
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c trunk/reactos/boot/freeldr/freeldr/debug.c trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h trunk/reactos/boot/freeldr/freeldr/include/debug.h trunk/reactos/boot/freeldr/freeldr/include/mm.h trunk/reactos/boot/freeldr/freeldr/mm/meminit.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c [iso-8859-1] Mon Dec 31 10:08:34 2012 @@ -171,14 +171,6 @@ InstructionPointer[6], InstructionPointer[7]); }
-char *BugCodeStrings[] = -{ - "TEST_BUGCHECK", - "MISSING_HARDWARE_REQUIREMENTS", -}; - -ULONG_PTR BugCheckInfo[5]; - void NTAPI FrLdrBugCheckEx(
Modified: trunk/reactos/boot/freeldr/freeldr/debug.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/debug.... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/debug.c [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/debug.c [iso-8859-1] Mon Dec 31 10:08:34 2012 @@ -427,3 +427,13 @@
DbgBreakPoint(); } + +char *BugCodeStrings[] = +{ + "TEST_BUGCHECK", + "MISSING_HARDWARE_REQUIREMENTS", + "FREELDR_IMAGE_CORRUPTION", +}; + +ULONG_PTR BugCheckInfo[5]; +
Modified: trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h [iso-8859-1] Mon Dec 31 10:08:34 2012 @@ -23,6 +23,7 @@ #define BIOSCALLBUFSEGMENT (BIOSCALLBUFFER/16) /* Buffer to store temporary data for any Int386() call */ #define BIOSCALLBUFOFFSET HEX(0000) /* Buffer to store temporary data for any Int386() call */ #define BIOSCALLBUFSIZE PAGE_SIZE /* max is sizeof(VESA_SVGA_INFO) = 512 */ +#define MAX_FREELDR_PE_SIZE (DISKREADBUFFER - FREELDR_PE_BASE)
/* These addresses specify the realmode "BSS section" layout */ #define BSS_RealModeEntry (BSS_START + 0)
Modified: trunk/reactos/boot/freeldr/freeldr/include/debug.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/debug.h [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/include/debug.h [iso-8859-1] Mon Dec 31 10:08:34 2012 @@ -120,4 +120,19 @@
#endif // DBG
+void +NTAPI +FrLdrBugCheck(ULONG BugCode); + +/* Bugcheck codes */ +enum _FRLDR_BUGCHECK_CODES +{ + TEST_BUGCHECK, + MISSING_HARDWARE_REQUIREMENTS, + FREELDR_IMAGE_CORRUPTION, +}; + +extern char *BugCodeStrings[]; +extern ULONG_PTR BugCheckInfo[5]; + #endif // defined __DEBUG_H
Modified: trunk/reactos/boot/freeldr/freeldr/include/mm.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/includ... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/include/mm.h [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/include/mm.h [iso-8859-1] Mon Dec 31 10:08:34 2012 @@ -18,6 +18,13 @@ */
#pragma once + +extern char __ImageBase; +#ifdef __GNUC__ +#define FREELDR_SECTION_COUNT 3 +#else +#define FREELDR_SECTION_COUNT 1 +#endif
typedef struct _FREELDR_MEMORY_DESCRIPTOR {
Modified: trunk/reactos/boot/freeldr/freeldr/mm/meminit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/mem... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/mm/meminit.c [iso-8859-1] (original) +++ trunk/reactos/boot/freeldr/freeldr/mm/meminit.c [iso-8859-1] Mon Dec 31 10:08:34 2012 @@ -163,6 +163,47 @@ }
+BOOLEAN +MmCheckFreeldrImageFile() +{ + PIMAGE_NT_HEADERS NtHeaders; + PIMAGE_FILE_HEADER FileHeader; + PIMAGE_OPTIONAL_HEADER OptionalHeader; + + /* Get the NT headers */ + NtHeaders = RtlImageNtHeader(&__ImageBase); + if (!NtHeaders) + { + ERR("Coult not get NtHeaders!\n"); + return FALSE; + } + + /* Check the file header */ + FileHeader = &NtHeaders->FileHeader; + if ((FileHeader->Machine != IMAGE_FILE_MACHINE_NATIVE) || + (FileHeader->NumberOfSections != FREELDR_SECTION_COUNT) || + (FileHeader->PointerToSymbolTable != 0) || + (FileHeader->NumberOfSymbols != 0) || + (FileHeader->NumberOfSymbols != 0) || + (FileHeader->SizeOfOptionalHeader != 0xE0)) + { + return FALSE; + } + + /* Check the optional header */ + OptionalHeader = &NtHeaders->OptionalHeader; + if ((OptionalHeader->Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC) || + (OptionalHeader->Subsystem != 1) || // native + (OptionalHeader->ImageBase != FREELDR_PE_BASE) || + (OptionalHeader->SizeOfImage > MAX_FREELDR_PE_SIZE) || + (OptionalHeader->SectionAlignment != OptionalHeader->FileAlignment)) + { + return FALSE; + } + + return TRUE; +} + BOOLEAN MmInitializeMemoryManager(VOID) { #if DBG @@ -170,6 +211,12 @@ #endif
TRACE("Initializing Memory Manager.\n"); + + /* Check the freeldr binary */ + if (!MmCheckFreeldrImageFile()) + { + FrLdrBugCheck(FREELDR_IMAGE_CORRUPTION); + }
BiosMemoryMap = MachVtbl.GetMemoryMap(&BiosMemoryMapEntryCount);