3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
4 * Copyright (C) 2006 Aleksey Bragin <aleksey@reactos.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #include <arc/setupblk.h>
25 #define TAG_WLDR_DTE 'eDlW'
26 #define TAG_WLDR_BDE 'dBlW'
27 #define TAG_WLDR_NAME 'mNlW'
29 /* Entry-point to kernel */
30 typedef VOID (NTAPI
*KERNEL_ENTRY_POINT
) (PLOADER_PARAMETER_BLOCK LoaderBlock
);
34 #define SECTOR_SIZE 512
37 #define NUM_GDT 128 // Must be 128
38 #define NUM_IDT 0x100 // only 16 are used though. Must be 0x100
41 typedef struct /* Root System Descriptor Pointer */
43 CHAR signature
[8]; /* contains "RSD PTR " */
44 UCHAR checksum
; /* to make sum of struct == 0 */
45 CHAR oem_id
[6]; /* OEM identification */
46 UCHAR revision
; /* Must be 0 for 1.0, 2 for 2.0 */
47 ULONG rsdt_physical_address
; /* 32-bit physical address of RSDT */
48 ULONG length
; /* XSDT Length in bytes including hdr */
49 ULONGLONG xsdt_physical_address
; /* 64-bit physical address of XSDT */
50 UCHAR extended_checksum
; /* Checksum of entire table */
51 CHAR reserved
[3]; /* reserved field must be 0 */
52 } RSDP_DESCRIPTOR
, *PRSDP_DESCRIPTOR
;
55 typedef struct _ARC_DISK_SIGNATURE_EX
57 ARC_DISK_SIGNATURE DiskSignature
;
58 CHAR ArcName
[MAX_PATH
];
59 } ARC_DISK_SIGNATURE_EX
, *PARC_DISK_SIGNATURE_EX
;
61 #define MAX_OPTIONS_LENGTH 255
63 typedef struct _LOADER_SYSTEM_BLOCK
65 LOADER_PARAMETER_BLOCK LoaderBlock
;
66 LOADER_PARAMETER_EXTENSION Extension
;
67 SETUP_LOADER_BLOCK SetupBlock
;
69 HEADLESS_LOADER_BLOCK HeadlessLoaderBlock
;
71 NLS_DATA_BLOCK NlsDataBlock
;
72 CHAR LoadOptions
[MAX_OPTIONS_LENGTH
+1];
73 CHAR ArcBootDeviceName
[MAX_PATH
+1];
74 // CHAR ArcHalDeviceName[MAX_PATH];
75 CHAR NtBootPathName
[MAX_PATH
+1];
76 CHAR NtHalPathName
[MAX_PATH
+1];
77 ARC_DISK_INFORMATION ArcDiskInformation
;
78 } LOADER_SYSTEM_BLOCK
, *PLOADER_SYSTEM_BLOCK
;
80 extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock
;
82 ///////////////////////////////////////////////////////////////////////////////////////
84 // ReactOS Loading Functions
86 ///////////////////////////////////////////////////////////////////////////////////////
87 VOID
LoadAndBootWindows(IN OperatingSystemItem
* OperatingSystem
,
88 IN USHORT OperatingSystemVersion
);
91 PVOID
VaToPa(PVOID Va
);
92 PVOID
PaToVa(PVOID Pa
);
93 VOID
List_PaToVa(_In_ LIST_ENTRY
*ListEntry
);
94 VOID
ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start
);
98 WinLdrLoadImage(IN PCHAR FileName
,
99 TYPE_OF_MEMORY MemoryType
,
100 OUT PVOID
*ImageBasePA
);
104 WinLdrAllocateDataTableEntry(IN OUT PLIST_ENTRY ModuleListHead
,
108 OUT PLDR_DATA_TABLE_ENTRY
*NewEntry
);
111 WinLdrScanImportDescriptorTable(IN OUT PLIST_ENTRY ModuleListHead
,
112 IN PCCH DirectoryPath
,
113 IN PLDR_DATA_TABLE_ENTRY ScanDTE
);
116 PVOID
WinLdrLoadModule(PCSTR ModuleName
, ULONG
*Size
,
117 TYPE_OF_MEMORY MemoryType
);
121 WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
);
124 BOOLEAN
WinLdrInitSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
125 IN LPCSTR DirectoryPath
);
127 BOOLEAN
WinLdrScanSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
128 IN LPCSTR DirectoryPath
);
132 WinLdrCheckForLoadedDll(IN OUT PLIST_ENTRY ModuleListHead
,
134 OUT PLDR_DATA_TABLE_ENTRY
*LoadedEntry
);
137 WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock
,
141 USHORT VersionToBoot
);
143 WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
144 IN LPCSTR DirectoryPath
,
145 IN LPCSTR AnsiFileName
,
146 IN LPCSTR OemFileName
,
147 IN LPCSTR LanguageFileName
);
149 WinLdrAddDriverToList(LIST_ENTRY
*BootDriverListHead
,
155 WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock
);
158 WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock
);
161 WinLdrpDumpArcDisks(PLOADER_PARAMETER_BLOCK LoaderBlock
);
164 MempSetupPaging(IN PFN_NUMBER StartPage
,
165 IN PFN_NUMBER NumberOfPages
,
166 IN BOOLEAN KernelMapping
);
169 MempUnmapPage(PFN_NUMBER Page
);
175 LoadAndBootWindowsCommon(
176 USHORT OperatingSystemVersion
,
177 PLOADER_PARAMETER_BLOCK LoaderBlock
,
183 LoadReactOSSetup(IN OperatingSystemItem
* OperatingSystem
,
184 IN USHORT OperatingSystemVersion
);
187 WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock
);
190 WinLdrSetProcessorContext(VOID
);