mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[FREELDR] Add "WindowsVista" boot type [FREELDR] Set GDT correctly for Vista [FREELDR] Map first page of memory, this is an observed behavior, and also increases stability boot Checked windows 2003 SP2 ntoskrnl with freeloader. [SDK] Don't assert on big keys in bootloader Co-authored-by: Justin Miller <justin.miller@reactos.org>
This commit is contained in:
parent
6d853be981
commit
dd6c1c8843
8 changed files with 47 additions and 21 deletions
|
@ -69,6 +69,7 @@ OSLoadingMethods[] =
|
||||||
#endif
|
#endif
|
||||||
{"Windows" , EditCustomBootNTOS , LoadAndBootWindows},
|
{"Windows" , EditCustomBootNTOS , LoadAndBootWindows},
|
||||||
{"Windows2003" , EditCustomBootNTOS , LoadAndBootWindows},
|
{"Windows2003" , EditCustomBootNTOS , LoadAndBootWindows},
|
||||||
|
{"WindowsVista", EditCustomBootNTOS , LoadAndBootWindows},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
|
@ -346,7 +346,8 @@ Amd64SetupIdt(PVOID IdtBase)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
WinLdrSetProcessorContext(void)
|
WinLdrSetProcessorContext(
|
||||||
|
_In_ USHORT OperatingSystemVersion)
|
||||||
{
|
{
|
||||||
TRACE("WinLdrSetProcessorContext\n");
|
TRACE("WinLdrSetProcessorContext\n");
|
||||||
|
|
||||||
|
|
|
@ -249,7 +249,8 @@ MempAllocatePageTables(VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
WinLdrSetProcessorContext(VOID)
|
WinLdrSetProcessorContext(
|
||||||
|
_In_ USHORT OperatingSystemVersion)
|
||||||
{
|
{
|
||||||
ARM_CONTROL_REGISTER ControlRegister;
|
ARM_CONTROL_REGISTER ControlRegister;
|
||||||
ARM_TTB_REGISTER TtbRegister;
|
ARM_TTB_REGISTER TtbRegister;
|
||||||
|
|
|
@ -245,7 +245,7 @@ MempSetupPaging(IN PFN_NUMBER StartPage,
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicalPT[Page & 0x3ff].PageFrameNumber = Page;
|
PhysicalPT[Page & 0x3ff].PageFrameNumber = Page;
|
||||||
PhysicalPT[Page & 0x3ff].Valid = (Page != 0);
|
PhysicalPT[Page & 0x3ff].Valid = 1;
|
||||||
PhysicalPT[Page & 0x3ff].Write = (Page != 0);
|
PhysicalPT[Page & 0x3ff].Write = (Page != 0);
|
||||||
|
|
||||||
if (KernelMapping)
|
if (KernelMapping)
|
||||||
|
@ -429,7 +429,8 @@ void WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
WinLdrSetProcessorContext(void)
|
WinLdrSetProcessorContext(
|
||||||
|
_In_ USHORT OperatingSystemVersion)
|
||||||
{
|
{
|
||||||
GDTIDT GdtDesc, IdtDesc, OldIdt;
|
GDTIDT GdtDesc, IdtDesc, OldIdt;
|
||||||
PKGDTENTRY pGdt;
|
PKGDTENTRY pGdt;
|
||||||
|
@ -526,15 +527,19 @@ WinLdrSetProcessorContext(void)
|
||||||
* Longhorn/Vista reports LimitLow == 0x0fff == MM_PAGE_SIZE - 1, whereas
|
* Longhorn/Vista reports LimitLow == 0x0fff == MM_PAGE_SIZE - 1, whereas
|
||||||
* Windows 7+ uses larger sizes there (not aligned on a page boundary).
|
* Windows 7+ uses larger sizes there (not aligned on a page boundary).
|
||||||
*/
|
*/
|
||||||
#if 1
|
if (OperatingSystemVersion < _WIN32_WINNT_VISTA)
|
||||||
/* Server 2003 way */
|
{
|
||||||
KiSetGdtEntryEx(KiGetGdtEntry(pGdt, KGDT_R0_PCR), (ULONG32)Pcr, 0x1,
|
/* Server 2003 way */
|
||||||
TYPE_DATA, DPL_SYSTEM, TRUE, 2);
|
KiSetGdtEntryEx(KiGetGdtEntry(pGdt, KGDT_R0_PCR), (ULONG32)Pcr, 0x1,
|
||||||
#else
|
TYPE_DATA, DPL_SYSTEM, TRUE, 2);
|
||||||
/* Vista+ way */
|
}
|
||||||
KiSetGdtEntry(KiGetGdtEntry(pGdt, KGDT_R0_PCR), (ULONG32)Pcr, MM_PAGE_SIZE - 1,
|
else
|
||||||
TYPE_DATA, DPL_SYSTEM, 2);
|
{
|
||||||
#endif
|
/* Vista+ way */
|
||||||
|
KiSetGdtEntry(KiGetGdtEntry(pGdt, KGDT_R0_PCR), (ULONG32)Pcr, MM_PAGE_SIZE - 1,
|
||||||
|
TYPE_DATA, DPL_SYSTEM, 2);
|
||||||
|
}
|
||||||
|
|
||||||
// DumpGDTEntry(GdtDesc.Base, KGDT_R0_PCR);
|
// DumpGDTEntry(GdtDesc.Base, KGDT_R0_PCR);
|
||||||
|
|
||||||
/* KGDT_R3_TEB (0x38) Thread Environment Block Selector (Ring 3) */
|
/* KGDT_R3_TEB (0x38) Thread Environment Block Selector (Ring 3) */
|
||||||
|
|
|
@ -255,6 +255,15 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
// FIXME: Extension->AcpiTableSize;
|
// FIXME: Extension->AcpiTableSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (VersionToBoot >= _WIN32_WINNT_VISTA)
|
||||||
|
{
|
||||||
|
Extension->BootViaWinload = 1;
|
||||||
|
Extension->LoaderPerformanceData = PaToVa(&WinLdrSystemBlock->LoaderPerformanceData);
|
||||||
|
|
||||||
|
InitializeListHead(&Extension->BootApplicationPersistentData);
|
||||||
|
List_PaToVa(&Extension->BootApplicationPersistentData);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _M_IX86
|
#ifdef _M_IX86
|
||||||
/* Set headless block pointer */
|
/* Set headless block pointer */
|
||||||
if (WinLdrTerminalConnected)
|
if (WinLdrTerminalConnected)
|
||||||
|
@ -999,6 +1008,10 @@ LoadAndBootWindows(
|
||||||
{
|
{
|
||||||
OperatingSystemVersion = _WIN32_WINNT_NT4;
|
OperatingSystemVersion = _WIN32_WINNT_NT4;
|
||||||
}
|
}
|
||||||
|
else if (_stricmp(ArgValue, "WindowsVista") == 0)
|
||||||
|
{
|
||||||
|
OperatingSystemVersion = _WIN32_WINNT_VISTA;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ERR("Unknown 'BootType' value '%s', aborting!\n", ArgValue);
|
ERR("Unknown 'BootType' value '%s', aborting!\n", ArgValue);
|
||||||
|
@ -1245,7 +1258,7 @@ LoadAndBootWindowsCommon(
|
||||||
WinLdrSetupMemoryLayout(LoaderBlock);
|
WinLdrSetupMemoryLayout(LoaderBlock);
|
||||||
|
|
||||||
/* Set processor context */
|
/* Set processor context */
|
||||||
WinLdrSetProcessorContext();
|
WinLdrSetProcessorContext(OperatingSystemVersion);
|
||||||
|
|
||||||
/* Save final value of LoaderPagesSpanned */
|
/* Save final value of LoaderPagesSpanned */
|
||||||
LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
|
LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned;
|
||||||
|
|
|
@ -58,6 +58,7 @@ typedef struct _LOADER_SYSTEM_BLOCK
|
||||||
CHAR NtBootPathName[MAX_PATH+1];
|
CHAR NtBootPathName[MAX_PATH+1];
|
||||||
CHAR NtHalPathName[MAX_PATH+1];
|
CHAR NtHalPathName[MAX_PATH+1];
|
||||||
ARC_DISK_INFORMATION ArcDiskInformation;
|
ARC_DISK_INFORMATION ArcDiskInformation;
|
||||||
|
LOADER_PERFORMANCE_DATA LoaderPerformanceData;
|
||||||
} LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK;
|
} LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK;
|
||||||
|
|
||||||
extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock;
|
extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock;
|
||||||
|
@ -164,7 +165,8 @@ VOID
|
||||||
WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock);
|
WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
WinLdrSetProcessorContext(VOID);
|
WinLdrSetProcessorContext(
|
||||||
|
_In_ USHORT OperatingSystemVersion);
|
||||||
|
|
||||||
// arch/xxx/winldr.c
|
// arch/xxx/winldr.c
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
|
|
@ -185,7 +185,7 @@ WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
PPAGE_LOOKUP_TABLE_ITEM MemoryMap;
|
PPAGE_LOOKUP_TABLE_ITEM MemoryMap;
|
||||||
ULONG LastPageType;
|
ULONG LastPageType;
|
||||||
//PKTSS Tss;
|
//PKTSS Tss;
|
||||||
//BOOLEAN Status;
|
BOOLEAN Status;
|
||||||
|
|
||||||
/* Cleanup heap */
|
/* Cleanup heap */
|
||||||
FrLdrHeapCleanupAll();
|
FrLdrHeapCleanupAll();
|
||||||
|
@ -229,15 +229,14 @@ WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
MemoryMapSizeInPages = (NoEntries * sizeof(PAGE_LOOKUP_TABLE_ITEM) + MM_PAGE_SIZE - 1) / MM_PAGE_SIZE;
|
MemoryMapSizeInPages = (NoEntries * sizeof(PAGE_LOOKUP_TABLE_ITEM) + MM_PAGE_SIZE - 1) / MM_PAGE_SIZE;
|
||||||
|
|
||||||
TRACE("Got memory map with %d entries\n", NoEntries);
|
TRACE("Got memory map with %d entries\n", NoEntries);
|
||||||
#if 0
|
|
||||||
// Always contiguously map low 1Mb of memory
|
// Always map first page of memory
|
||||||
Status = MempSetupPaging(0, 0x100, FALSE);
|
Status = MempSetupPaging(0, 1, FALSE);
|
||||||
if (!Status)
|
if (!Status)
|
||||||
{
|
{
|
||||||
ERR("Error during MempSetupPaging of low 1Mb\n");
|
ERR("Error during MempSetupPaging of first page\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Before creating the map, we need to map pages to kernel mode */
|
/* Before creating the map, we need to map pages to kernel mode */
|
||||||
LastPageIndex = 1;
|
LastPageIndex = 1;
|
||||||
|
|
|
@ -379,8 +379,12 @@ extern ULONG CmlibTraceLevel;
|
||||||
//
|
//
|
||||||
// Hack since big keys are not yet supported
|
// Hack since big keys are not yet supported
|
||||||
//
|
//
|
||||||
|
#ifdef _BLDR_
|
||||||
|
#define ASSERT_VALUE_BIG(h, s) DbgPrint("Big keys aren't supported!\n");
|
||||||
|
#else
|
||||||
#define ASSERT_VALUE_BIG(h, s) \
|
#define ASSERT_VALUE_BIG(h, s) \
|
||||||
ASSERTMSG("Big keys not supported!\n", !CmpIsKeyValueBig(h, s));
|
ASSERTMSG("Big keys not supported!\n", !CmpIsKeyValueBig(h, s));
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Returns whether or not this is a small valued key
|
// Returns whether or not this is a small valued key
|
||||||
|
|
Loading…
Reference in a new issue