mirror of
https://github.com/reactos/reactos.git
synced 2025-04-21 04:37:15 +00:00
- More refactoring of FreeLDR/SetupLDR PE Loader Code to remove some hacks.
- Don't double-free some entries when failing to load a boot driver. This would cause a crash when pciide couldn't load (since we don't yet import drivers in FreeLDR, and pciide needs pciidex). Thanks to encoded for reporting it. - We now free boot driver memory again since it's safe to do so again. This should reduce memory requirements even more. svn path=/trunk/; revision=25928
This commit is contained in:
parent
864da6c412
commit
a1ad43c2ee
8 changed files with 118 additions and 140 deletions
|
@ -24,42 +24,6 @@
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#undef DbgPrint
|
#undef DbgPrint
|
||||||
|
|
||||||
/* Base Addres of Kernel in Physical Memory */
|
|
||||||
#define KERNEL_BASE_PHYS 0x200000
|
|
||||||
|
|
||||||
/* Bits to shift to convert a Virtual Address into an Offset in the Page Table */
|
|
||||||
#define PFN_SHIFT 12
|
|
||||||
|
|
||||||
/* Bits to shift to convert a Virtual Address into an Offset in the Page Directory */
|
|
||||||
#define PDE_SHIFT 22
|
|
||||||
#define PDE_SHIFT_PAE 18
|
|
||||||
|
|
||||||
/* Converts a Relative Address read from the Kernel into a Physical Address */
|
|
||||||
#define RaToPa(p) \
|
|
||||||
(ULONG_PTR)((ULONG_PTR)p + KERNEL_BASE_PHYS)
|
|
||||||
|
|
||||||
/* Converts a Physical Address Pointer into a Page Frame Number */
|
|
||||||
#define PaPtrToPfn(p) \
|
|
||||||
(((ULONG_PTR)&p) >> PFN_SHIFT)
|
|
||||||
|
|
||||||
/* Converts a Physical Address into a Page Frame Number */
|
|
||||||
#define PaToPfn(p) \
|
|
||||||
((p) >> PFN_SHIFT)
|
|
||||||
|
|
||||||
#define STARTUP_BASE 0xC0000000
|
|
||||||
#define HYPERSPACE_BASE 0xC0400000
|
|
||||||
#define HYPERSPACE_PAE_BASE 0xC0800000
|
|
||||||
#define APIC_BASE 0xFEC00000
|
|
||||||
#define KPCR_BASE 0xFF000000
|
|
||||||
|
|
||||||
#define LowMemPageTableIndex 0
|
|
||||||
#define StartupPageTableIndex (STARTUP_BASE >> 22)
|
|
||||||
#define HyperspacePageTableIndex (HYPERSPACE_BASE >> 22)
|
|
||||||
#define KpcrPageTableIndex (KPCR_BASE >> 22)
|
|
||||||
#define ApicPageTableIndex (APIC_BASE >> 22)
|
|
||||||
|
|
||||||
#define KernelEntryPoint (KernelEntry - KERNEL_BASE_PHYS) + KernelBase
|
|
||||||
|
|
||||||
/* Load Address of Next Module */
|
/* Load Address of Next Module */
|
||||||
ULONG_PTR NextModuleBase = KERNEL_BASE_PHYS;
|
ULONG_PTR NextModuleBase = KERNEL_BASE_PHYS;
|
||||||
|
|
||||||
|
@ -72,61 +36,14 @@ ULONG_PTR KernelBase;
|
||||||
/* Kernel Entrypoint in Physical Memory */
|
/* Kernel Entrypoint in Physical Memory */
|
||||||
ULONG_PTR KernelEntry;
|
ULONG_PTR KernelEntry;
|
||||||
|
|
||||||
typedef struct _HARDWARE_PTE_X64 {
|
|
||||||
ULONG Valid : 1;
|
|
||||||
ULONG Write : 1;
|
|
||||||
ULONG Owner : 1;
|
|
||||||
ULONG WriteThrough : 1;
|
|
||||||
ULONG CacheDisable : 1;
|
|
||||||
ULONG Accessed : 1;
|
|
||||||
ULONG Dirty : 1;
|
|
||||||
ULONG LargePage : 1;
|
|
||||||
ULONG Global : 1;
|
|
||||||
ULONG CopyOnWrite : 1;
|
|
||||||
ULONG Prototype : 1;
|
|
||||||
ULONG reserved : 1;
|
|
||||||
ULONG PageFrameNumber : 20;
|
|
||||||
ULONG reserved2 : 31;
|
|
||||||
ULONG NoExecute : 1;
|
|
||||||
} HARDWARE_PTE_X64, *PHARDWARE_PTE_X64;
|
|
||||||
|
|
||||||
typedef struct _PAGE_DIRECTORY_X86 {
|
|
||||||
HARDWARE_PTE Pde[1024];
|
|
||||||
} PAGE_DIRECTORY_X86, *PPAGE_DIRECTORY_X86;
|
|
||||||
|
|
||||||
typedef struct _PAGE_DIRECTORY_X64 {
|
|
||||||
HARDWARE_PTE_X64 Pde[2048];
|
|
||||||
} PAGE_DIRECTORY_X64, *PPAGE_DIRECTORY_X64;
|
|
||||||
|
|
||||||
typedef struct _PAGE_DIRECTORY_TABLE_X64 {
|
|
||||||
HARDWARE_PTE_X64 Pde[4];
|
|
||||||
} PAGE_DIRECTORY_TABLE_X64, *PPAGE_DIRECTORY_TABLE_X64;
|
|
||||||
|
|
||||||
/* Page Directory and Tables for non-PAE Systems */
|
/* Page Directory and Tables for non-PAE Systems */
|
||||||
extern PAGE_DIRECTORY_X86 startup_pagedirectory;
|
extern PAGE_DIRECTORY_X86 startup_pagedirectory;
|
||||||
extern PAGE_DIRECTORY_X86 lowmem_pagetable;
|
extern PAGE_DIRECTORY_X86 lowmem_pagetable;
|
||||||
extern PAGE_DIRECTORY_X86 kernel_pagetable;
|
extern PAGE_DIRECTORY_X86 kernel_pagetable;
|
||||||
extern ULONG_PTR hyperspace_pagetable;
|
extern ULONG_PTR hyperspace_pagetable;
|
||||||
extern ULONG_PTR _pae_pagedirtable;
|
|
||||||
extern PAGE_DIRECTORY_X86 apic_pagetable;
|
extern PAGE_DIRECTORY_X86 apic_pagetable;
|
||||||
extern PAGE_DIRECTORY_X86 kpcr_pagetable;
|
extern PAGE_DIRECTORY_X86 kpcr_pagetable;
|
||||||
|
|
||||||
/* Page Directory and Tables for PAE Systems */
|
|
||||||
extern PAGE_DIRECTORY_TABLE_X64 startup_pagedirectorytable_pae;
|
|
||||||
extern PAGE_DIRECTORY_X64 startup_pagedirectory_pae;
|
|
||||||
extern PAGE_DIRECTORY_X64 lowmem_pagetable_pae;
|
|
||||||
extern PAGE_DIRECTORY_X64 kernel_pagetable_pae;
|
|
||||||
extern ULONG_PTR hyperspace_pagetable_pae;
|
|
||||||
extern ULONG_PTR pagedirtable_pae;
|
|
||||||
extern PAGE_DIRECTORY_X64 apic_pagetable_pae;
|
|
||||||
extern PAGE_DIRECTORY_X64 kpcr_pagetable_pae;
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
FrLdrLoadImage(IN PCHAR szFileName,
|
|
||||||
IN INT nPos,
|
|
||||||
IN BOOLEAN IsKernel);
|
|
||||||
|
|
||||||
PVOID
|
PVOID
|
||||||
NTAPI
|
NTAPI
|
||||||
LdrPEGetExportByName(PVOID BaseAddress,
|
LdrPEGetExportByName(PVOID BaseAddress,
|
||||||
|
@ -269,8 +186,8 @@ FrLdrSetupPageDirectory(VOID)
|
||||||
|
|
||||||
/* Set up Low Memory PTEs */
|
/* Set up Low Memory PTEs */
|
||||||
PageDir = (PPAGE_DIRECTORY_X86)&lowmem_pagetable;
|
PageDir = (PPAGE_DIRECTORY_X86)&lowmem_pagetable;
|
||||||
for (i=0; i<1024; i++) {
|
for (i=0; i<1024; i++)
|
||||||
|
{
|
||||||
PageDir->Pde[i].Valid = 1;
|
PageDir->Pde[i].Valid = 1;
|
||||||
PageDir->Pde[i].Write = 1;
|
PageDir->Pde[i].Write = 1;
|
||||||
PageDir->Pde[i].Owner = 1;
|
PageDir->Pde[i].Owner = 1;
|
||||||
|
@ -279,8 +196,8 @@ FrLdrSetupPageDirectory(VOID)
|
||||||
|
|
||||||
/* Set up Kernel PTEs */
|
/* Set up Kernel PTEs */
|
||||||
PageDir = (PPAGE_DIRECTORY_X86)&kernel_pagetable;
|
PageDir = (PPAGE_DIRECTORY_X86)&kernel_pagetable;
|
||||||
for (i=0; i<1536; i++) {
|
for (i=0; i<1536; i++)
|
||||||
|
{
|
||||||
PageDir->Pde[i].Valid = 1;
|
PageDir->Pde[i].Valid = 1;
|
||||||
PageDir->Pde[i].Write = 1;
|
PageDir->Pde[i].Write = 1;
|
||||||
PageDir->Pde[i].PageFrameNumber = PaToPfn(KERNEL_BASE_PHYS + i * PAGE_SIZE);
|
PageDir->Pde[i].PageFrameNumber = PaToPfn(KERNEL_BASE_PHYS + i * PAGE_SIZE);
|
||||||
|
@ -658,7 +575,7 @@ FrLdrReMapImage(IN PVOID Base,
|
||||||
return DriverSize;
|
return DriverSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOLEAN
|
PVOID
|
||||||
NTAPI
|
NTAPI
|
||||||
FrLdrMapImage(IN FILE *Image,
|
FrLdrMapImage(IN FILE *Image,
|
||||||
IN PCHAR Name,
|
IN PCHAR Name,
|
||||||
|
@ -713,21 +630,13 @@ FrLdrMapImage(IN FILE *Image,
|
||||||
//DbgPrint("Image: %s loaded at: %p\n", Name, ImageBase);
|
//DbgPrint("Image: %s loaded at: %p\n", Name, ImageBase);
|
||||||
|
|
||||||
/* Load HAL if this is the kernel */
|
/* Load HAL if this is the kernel */
|
||||||
if (ImageType == 1)
|
if (ImageType == 1) FrLdrLoadImage("hal.dll", 10, FALSE);
|
||||||
{
|
|
||||||
PIMAGE_NT_HEADERS NtHeader;
|
|
||||||
NtHeader = RtlImageNtHeader(LoadBase);
|
|
||||||
KernelBase = NtHeader->OptionalHeader.ImageBase;
|
|
||||||
KernelEntry = RaToPa(NtHeader->OptionalHeader.AddressOfEntryPoint);
|
|
||||||
FrLdrLoadImage("hal.dll", 10, FALSE);
|
|
||||||
LoaderBlock.KernelBase = KernelBase;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform import fixups */
|
/* Perform import fixups */
|
||||||
if (ImageType != 2) LdrPEFixupImports(LoadBase, Name);
|
if (ImageType != 2) LdrPEFixupImports(LoadBase, Name);
|
||||||
|
|
||||||
/* Return Success */
|
/* Return the final mapped address */
|
||||||
return TRUE;
|
return LoadBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG_PTR
|
ULONG_PTR
|
||||||
|
|
|
@ -2,9 +2,6 @@
|
||||||
<include base="freeldr_main">include</include>
|
<include base="freeldr_main">include</include>
|
||||||
<include base="ntoskrnl">include</include>
|
<include base="ntoskrnl">include</include>
|
||||||
<define name="__USE_W32API" />
|
<define name="__USE_W32API" />
|
||||||
<!--
|
|
||||||
<define name="DEBUG" />
|
|
||||||
-->
|
|
||||||
<define name="_NTHAL_" />
|
<define name="_NTHAL_" />
|
||||||
<compilerflag>-ffreestanding</compilerflag>
|
<compilerflag>-ffreestanding</compilerflag>
|
||||||
<compilerflag>-fno-builtin</compilerflag>
|
<compilerflag>-fno-builtin</compilerflag>
|
||||||
|
|
|
@ -20,6 +20,46 @@
|
||||||
#ifndef __REACTOS_H
|
#ifndef __REACTOS_H
|
||||||
#define __REACTOS_H
|
#define __REACTOS_H
|
||||||
|
|
||||||
|
/* Base Addres of Kernel in Physical Memory */
|
||||||
|
#define KERNEL_BASE_PHYS 0x200000
|
||||||
|
|
||||||
|
/* Bits to shift to convert a Virtual Address into an Offset in the Page Table */
|
||||||
|
#define PFN_SHIFT 12
|
||||||
|
|
||||||
|
/* Bits to shift to convert a Virtual Address into an Offset in the Page Directory */
|
||||||
|
#define PDE_SHIFT 22
|
||||||
|
#define PDE_SHIFT_PAE 18
|
||||||
|
|
||||||
|
/* Converts a Relative Address read from the Kernel into a Physical Address */
|
||||||
|
#define RaToPa(p) \
|
||||||
|
(ULONG_PTR)((ULONG_PTR)p + KERNEL_BASE_PHYS)
|
||||||
|
|
||||||
|
/* Converts a Physical Address Pointer into a Page Frame Number */
|
||||||
|
#define PaPtrToPfn(p) \
|
||||||
|
(((ULONG_PTR)&p) >> PFN_SHIFT)
|
||||||
|
|
||||||
|
/* Converts a Physical Address into a Page Frame Number */
|
||||||
|
#define PaToPfn(p) \
|
||||||
|
((p) >> PFN_SHIFT)
|
||||||
|
|
||||||
|
#define STARTUP_BASE 0xC0000000
|
||||||
|
#define HYPERSPACE_BASE 0xC0400000
|
||||||
|
#define HYPERSPACE_PAE_BASE 0xC0800000
|
||||||
|
#define APIC_BASE 0xFEC00000
|
||||||
|
#define KPCR_BASE 0xFF000000
|
||||||
|
|
||||||
|
#define LowMemPageTableIndex 0
|
||||||
|
#define StartupPageTableIndex (STARTUP_BASE >> 22)
|
||||||
|
#define HyperspacePageTableIndex (HYPERSPACE_BASE >> 22)
|
||||||
|
#define KpcrPageTableIndex (KPCR_BASE >> 22)
|
||||||
|
#define ApicPageTableIndex (APIC_BASE >> 22)
|
||||||
|
|
||||||
|
#define KernelEntryPoint (KernelEntry - KERNEL_BASE_PHYS) + KernelBase
|
||||||
|
|
||||||
|
typedef struct _PAGE_DIRECTORY_X86
|
||||||
|
{
|
||||||
|
HARDWARE_PTE Pde[1024];
|
||||||
|
} PAGE_DIRECTORY_X86, *PPAGE_DIRECTORY_X86;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
|
@ -66,4 +106,20 @@ BOOLEAN NTAPI FrLdrCloseModule(ULONG_PTR ModuleBase, ULONG dwModuleSize);
|
||||||
VOID NTAPI FrLdrStartup(ULONG Magic);
|
VOID NTAPI FrLdrStartup(ULONG Magic);
|
||||||
typedef VOID (FASTCALL *ASMCODE)(ULONG Magic, PROS_LOADER_PARAMETER_BLOCK LoaderBlock);
|
typedef VOID (FASTCALL *ASMCODE)(ULONG Magic, PROS_LOADER_PARAMETER_BLOCK LoaderBlock);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
NTAPI
|
||||||
|
FrLdrMapImage(
|
||||||
|
IN FILE *Image,
|
||||||
|
IN PCHAR ShortName,
|
||||||
|
IN ULONG ImageType
|
||||||
|
);
|
||||||
|
|
||||||
|
PVOID
|
||||||
|
NTAPI
|
||||||
|
FrLdrLoadImage(
|
||||||
|
IN PCHAR szFileName,
|
||||||
|
IN INT nPos,
|
||||||
|
IN ULONG ImageType
|
||||||
|
);
|
||||||
|
|
||||||
#endif // defined __REACTOS_H
|
#endif // defined __REACTOS_H
|
||||||
|
|
|
@ -37,16 +37,9 @@ CHAR szHalName[255];
|
||||||
CHAR szBootPath[255];
|
CHAR szBootPath[255];
|
||||||
static CHAR szLoadingMsg[] = "Loading ReactOS...";
|
static CHAR szLoadingMsg[] = "Loading ReactOS...";
|
||||||
BOOLEAN FrLdrBootType;
|
BOOLEAN FrLdrBootType;
|
||||||
|
extern ULONG_PTR KernelBase, KernelEntry;
|
||||||
|
|
||||||
BOOLEAN
|
PVOID
|
||||||
NTAPI
|
|
||||||
FrLdrMapImage(
|
|
||||||
IN FILE *Image,
|
|
||||||
IN PCHAR ShortName,
|
|
||||||
IN ULONG ImageType
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
NTAPI
|
||||||
FrLdrLoadImage(IN PCHAR szFileName,
|
FrLdrLoadImage(IN PCHAR szFileName,
|
||||||
IN INT nPos,
|
IN INT nPos,
|
||||||
|
@ -55,6 +48,7 @@ FrLdrLoadImage(IN PCHAR szFileName,
|
||||||
PFILE FilePointer;
|
PFILE FilePointer;
|
||||||
PCHAR szShortName;
|
PCHAR szShortName;
|
||||||
CHAR szBuffer[256], szFullPath[256];
|
CHAR szBuffer[256], szFullPath[256];
|
||||||
|
PVOID LoadBase;
|
||||||
|
|
||||||
/* Check if this the HAL being loaded */
|
/* Check if this the HAL being loaded */
|
||||||
if (!_stricmp(szFileName, "hal.dll"))
|
if (!_stricmp(szFileName, "hal.dll"))
|
||||||
|
@ -107,11 +101,11 @@ FrLdrLoadImage(IN PCHAR szFileName,
|
||||||
UiDrawStatusText(szBuffer);
|
UiDrawStatusText(szBuffer);
|
||||||
|
|
||||||
/* Do the actual loading */
|
/* Do the actual loading */
|
||||||
FrLdrMapImage(FilePointer, szShortName, ImageType);
|
LoadBase = FrLdrMapImage(FilePointer, szShortName, ImageType);
|
||||||
|
|
||||||
/* Update Processbar and return success */
|
/* Update Processbar and return success */
|
||||||
if (!FrLdrBootType) UiDrawProgressBarCenter(nPos, 100, szLoadingMsg);
|
if (!FrLdrBootType) UiDrawProgressBarCenter(nPos, 100, szLoadingMsg);
|
||||||
return TRUE;
|
return LoadBase;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
|
@ -497,6 +491,8 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
|
||||||
CHAR szFileName[255];
|
CHAR szFileName[255];
|
||||||
CHAR MsgBuffer[256];
|
CHAR MsgBuffer[256];
|
||||||
ULONG SectionId;
|
ULONG SectionId;
|
||||||
|
PIMAGE_NT_HEADERS NtHeader;
|
||||||
|
PVOID LoadBase;
|
||||||
|
|
||||||
ULONG_PTR Base;
|
ULONG_PTR Base;
|
||||||
ULONG Size;
|
ULONG Size;
|
||||||
|
@ -682,7 +678,14 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load the kernel */
|
/* Load the kernel */
|
||||||
if (!FrLdrLoadImage(szKernelName, 5, 1)) return;
|
LoadBase = FrLdrLoadImage(szKernelName, 5, 1);
|
||||||
|
if (!LoadBase) return;
|
||||||
|
|
||||||
|
/* Get the NT header, kernel base and kernel entry */
|
||||||
|
NtHeader = RtlImageNtHeader(LoadBase);
|
||||||
|
KernelBase = NtHeader->OptionalHeader.ImageBase;
|
||||||
|
KernelEntry = RaToPa(NtHeader->OptionalHeader.AddressOfEntryPoint);
|
||||||
|
LoaderBlock.KernelBase = KernelBase;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Load the System hive from disk
|
* Load the System hive from disk
|
||||||
|
|
|
@ -18,8 +18,12 @@
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _NTSYSTEM_
|
||||||
#include <freeldr.h>
|
#include <freeldr.h>
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
ROS_LOADER_PARAMETER_BLOCK LoaderBlock;
|
ROS_LOADER_PARAMETER_BLOCK LoaderBlock;
|
||||||
char reactos_kernel_cmdline[255]; // Command line passed to kernel
|
char reactos_kernel_cmdline[255]; // Command line passed to kernel
|
||||||
LOADER_MODULE reactos_modules[64]; // Array to hold boot module info loaded for the kernel
|
LOADER_MODULE reactos_modules[64]; // Array to hold boot module info loaded for the kernel
|
||||||
|
@ -28,17 +32,11 @@ unsigned long reactos_memory_map_descriptor_size;
|
||||||
memory_map_t reactos_memory_map[32]; // Memory map
|
memory_map_t reactos_memory_map[32]; // Memory map
|
||||||
char szBootPath[256];
|
char szBootPath[256];
|
||||||
char szHalName[256];
|
char szHalName[256];
|
||||||
|
extern ULONG_PTR KernelBase, KernelEntry;
|
||||||
|
|
||||||
|
|
||||||
#define USE_UI
|
#define USE_UI
|
||||||
|
|
||||||
BOOLEAN
|
|
||||||
NTAPI
|
|
||||||
FrLdrMapImage(
|
|
||||||
IN FILE *Image,
|
|
||||||
IN PCHAR ShortName,
|
|
||||||
IN ULONG ImageType
|
|
||||||
);
|
|
||||||
|
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
static FrLdrLoadKernel(IN PCHAR szFileName,
|
static FrLdrLoadKernel(IN PCHAR szFileName,
|
||||||
|
@ -47,6 +45,8 @@ static FrLdrLoadKernel(IN PCHAR szFileName,
|
||||||
PFILE FilePointer;
|
PFILE FilePointer;
|
||||||
PCHAR szShortName;
|
PCHAR szShortName;
|
||||||
CHAR szBuffer[256];
|
CHAR szBuffer[256];
|
||||||
|
PVOID LoadBase;
|
||||||
|
PIMAGE_NT_HEADERS NtHeader;
|
||||||
|
|
||||||
/* Extract Kernel filename without path */
|
/* Extract Kernel filename without path */
|
||||||
szShortName = strrchr(szFileName, '\\');
|
szShortName = strrchr(szFileName, '\\');
|
||||||
|
@ -78,7 +78,13 @@ static FrLdrLoadKernel(IN PCHAR szFileName,
|
||||||
UiDrawStatusText(szBuffer);
|
UiDrawStatusText(szBuffer);
|
||||||
|
|
||||||
/* Do the actual loading */
|
/* Do the actual loading */
|
||||||
FrLdrMapImage(FilePointer, szShortName, 1);
|
LoadBase = FrLdrMapImage(FilePointer, szShortName, 1);
|
||||||
|
|
||||||
|
/* Get the NT header, kernel base and kernel entry */
|
||||||
|
NtHeader = RtlImageNtHeader(LoadBase);
|
||||||
|
KernelBase = NtHeader->OptionalHeader.ImageBase;
|
||||||
|
KernelEntry = RaToPa(NtHeader->OptionalHeader.AddressOfEntryPoint);
|
||||||
|
LoaderBlock.KernelBase = KernelBase;
|
||||||
|
|
||||||
/* Update Processbar and return success */
|
/* Update Processbar and return success */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<include base="setupldr_main">include</include>
|
<include base="setupldr_main">include</include>
|
||||||
<include base="ntoskrnl">include</include>
|
<include base="ntoskrnl">include</include>
|
||||||
<define name="__USE_W32API" />
|
<define name="__USE_W32API" />
|
||||||
<compilerflag>-nostdlib</compilerflag>
|
<define name="_NTHAL_" />
|
||||||
<compilerflag>-ffreestanding</compilerflag>
|
<compilerflag>-ffreestanding</compilerflag>
|
||||||
<compilerflag>-fno-builtin</compilerflag>
|
<compilerflag>-fno-builtin</compilerflag>
|
||||||
<compilerflag>-fno-inline</compilerflag>
|
<compilerflag>-fno-inline</compilerflag>
|
||||||
|
|
|
@ -31,15 +31,6 @@ POBJECT_TYPE IoDriverObjectType = NULL;
|
||||||
|
|
||||||
extern BOOLEAN ExpInTextModeSetup;
|
extern BOOLEAN ExpInTextModeSetup;
|
||||||
|
|
||||||
/* DECLARATIONS ***************************************************************/
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
LdrTemporaryDriverHack(
|
|
||||||
PLDR_DATA_TABLE_ENTRY ModuleObject,
|
|
||||||
PUNICODE_STRING ModuleName
|
|
||||||
);
|
|
||||||
|
|
||||||
/* PRIVATE FUNCTIONS **********************************************************/
|
/* PRIVATE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
|
@ -810,13 +801,7 @@ LdrProcessDriverModule(PLDR_DATA_TABLE_ENTRY LdrEntry,
|
||||||
&MissingApiName,
|
&MissingApiName,
|
||||||
&MissingDriverName,
|
&MissingDriverName,
|
||||||
&LoadedImports);
|
&LoadedImports);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status)) return Status;
|
||||||
{
|
|
||||||
/* Fail */
|
|
||||||
ExFreePool(LdrEntry->FullDllName.Buffer);
|
|
||||||
ExFreePool(LdrEntry);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return */
|
/* Return */
|
||||||
*ModuleObject = LdrEntry;
|
*ModuleObject = LdrEntry;
|
||||||
|
|
|
@ -22,6 +22,25 @@ extern ULONG NtGlobalFlag;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
MiFreeBootDriverMemory(PVOID BaseAddress,
|
||||||
|
ULONG Length)
|
||||||
|
{
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
/* Loop each page */
|
||||||
|
for (i = 0; i < PAGE_ROUND_UP(Length) / PAGE_SIZE; i++)
|
||||||
|
{
|
||||||
|
/* Free the page */
|
||||||
|
MmDeleteVirtualMapping(NULL,
|
||||||
|
(PVOID)((ULONG_PTR)BaseAddress + i * PAGE_SIZE),
|
||||||
|
TRUE,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
MiLoadImageSection(IN OUT PVOID *SectionPtr,
|
MiLoadImageSection(IN OUT PVOID *SectionPtr,
|
||||||
|
@ -1175,6 +1194,9 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)NewImageAddress +
|
LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)NewImageAddress +
|
||||||
NtHeader->OptionalHeader.AddressOfEntryPoint);
|
NtHeader->OptionalHeader.AddressOfEntryPoint);
|
||||||
LdrEntry->SizeOfImage = LdrEntry->SizeOfImage;
|
LdrEntry->SizeOfImage = LdrEntry->SizeOfImage;
|
||||||
|
|
||||||
|
/* Free the old copy */
|
||||||
|
MiFreeBootDriverMemory(DllBase, LdrEntry->SizeOfImage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue