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/…
==============================================================================
--- 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/inclu…
==============================================================================
--- 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/inclu…
==============================================================================
--- 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/inclu…
==============================================================================
--- 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/me…
==============================================================================
--- 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);