4 * Copyright (C) 2009 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
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <ndk/ldrtypes.h>
24 #include <arc/setupblk.h>
29 VOID
AllocateAndInitLPB(PLOADER_PARAMETER_BLOCK
*OutLoaderBlock
);
30 BOOLEAN
WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock
, LPSTR BootPath
);
31 void WinLdrSetupForNt(PLOADER_PARAMETER_BLOCK LoaderBlock
,
36 WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock
,
40 USHORT VersionToBoot
);
42 WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
43 IN LPCSTR DirectoryPath
,
44 IN LPCSTR AnsiFileName
,
45 IN LPCSTR OemFileName
,
46 IN LPCSTR LanguageFileName
);
48 WinLdrAddDriverToList(LIST_ENTRY
*BootDriverListHead
,
54 //FIXME: Do a better way to retrieve Arc disk information
55 extern ULONG reactos_disk_count
;
56 extern ARC_DISK_SIGNATURE reactos_arc_disk_info
[];
57 extern char reactos_arc_strings
[32][256];
59 extern BOOLEAN UseRealHeap
;
60 extern ULONG LoaderPagesSpanned
;
64 SetupLdrLoadNlsData(PLOADER_PARAMETER_BLOCK LoaderBlock
, HINF InfHandle
, LPCSTR SearchPath
)
66 INFCONTEXT InfContext
;
68 LPCSTR AnsiName
, OemName
, LangName
;
70 /* Get ANSI codepage file */
71 if (!InfFindFirstLine(InfHandle
, "NLS", "AnsiCodepage", &InfContext
))
73 printf("Failed to find 'NLS/AnsiCodepage'\n");
76 if (!InfGetDataField(&InfContext
, 1, &AnsiName
))
78 printf("Failed to get load options\n");
82 /* Get OEM codepage file */
83 if (!InfFindFirstLine(InfHandle
, "NLS", "OemCodepage", &InfContext
))
85 printf("Failed to find 'NLS/AnsiCodepage'\n");
88 if (!InfGetDataField(&InfContext
, 1, &OemName
))
90 printf("Failed to get load options\n");
94 if (!InfFindFirstLine(InfHandle
, "NLS", "UnicodeCasetable", &InfContext
))
96 printf("Failed to find 'NLS/AnsiCodepage'\n");
99 if (!InfGetDataField(&InfContext
, 1, &LangName
))
101 printf("Failed to get load options\n");
105 Status
= WinLdrLoadNLSData(LoaderBlock
, SearchPath
, AnsiName
, OemName
, LangName
);
106 DPRINTM(DPRINT_WINDOWS
, "NLS data loaded with status %d\n", Status
);
110 SetupLdrScanBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock
, HINF InfHandle
, LPCSTR SearchPath
)
112 INFCONTEXT InfContext
;
114 LPCSTR Media
, DriverName
;
115 WCHAR ServiceName
[256];
116 WCHAR ImagePath
[256];
118 /* Open inf section */
119 if (!InfFindFirstLine(InfHandle
, "SourceDisksFiles", NULL
, &InfContext
))
122 /* Load all listed boot drivers */
125 if (InfGetDataField(&InfContext
, 7, &Media
) &&
126 InfGetDataField(&InfContext
, 0, &DriverName
))
128 if (strcmp(Media
, "x") == 0)
130 /* Convert name to widechar */
131 swprintf(ServiceName
, L
"%S", DriverName
);
133 /* Remove .sys extension */
134 ServiceName
[wcslen(ServiceName
) - 4] = 0;
136 /* Prepare image path */
137 swprintf(ImagePath
, L
"%S", DriverName
);
139 /* Add it to the list */
140 Status
= WinLdrAddDriverToList(&LoaderBlock
->BootDriverListHead
,
141 L
"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\",
147 DPRINTM(DPRINT_WINDOWS
, "could not add boot driver %s, %s\n", SearchPath
, DriverName
);
152 } while (InfFindNextLine(&InfContext
, &InfContext
));
155 VOID
LoadReactOSSetup2(VOID
)
157 CHAR SystemPath
[512], SearchPath
[512];
160 CHAR LoadOptions
[512];
162 PVOID NtosBase
= NULL
, HalBase
= NULL
, KdComBase
= NULL
;
166 INFCONTEXT InfContext
;
167 PLOADER_PARAMETER_BLOCK LoaderBlock
, LoaderBlockVA
;
168 PSETUP_LOADER_BLOCK SetupBlock
;
169 KERNEL_ENTRY_POINT KiSystemStartup
;
170 PLDR_DATA_TABLE_ENTRY KernelDTE
, HalDTE
, KdComDTE
= NULL
;
176 LPCSTR SourcePaths
[] =
178 "", /* Only for floppy boot */
181 #elif defined(_M_MPPC)
183 #elif defined(_M_MRX000)
190 /* Try to open system drive */
193 /* Open 'txtsetup.sif' from any of source paths */
194 MachDiskGetBootPath(SystemPath
, sizeof(SystemPath
));
195 for (i
= MachDiskBootingFromFloppy() ? 0 : 1; ; i
++)
197 SourcePath
= SourcePaths
[i
];
200 printf("Failed to open 'txtsetup.sif'\n");
203 sprintf(FileName
, "%s\\txtsetup.sif", SourcePath
);
204 if (InfOpenFile (&InfHandle
, FileName
, &ErrorLine
))
206 sprintf(BootPath
, "%s%s\\", SystemPath
, SourcePath
);
212 if (!InfFindFirstLine(InfHandle
,
217 printf("Failed to find 'SetupData/OsLoadOptions'\n");
221 if (!InfGetDataField (&InfContext
, 1, &BootOptions
))
223 printf("Failed to get load options\n");
228 UiDrawStatusText("");
229 UiDrawStatusText("Detecting Hardware...");
231 /* Let user know we started loading */
232 UiDrawStatusText("Loading...");
234 /* Construct the system path */
235 sprintf(SystemPath
, "%s\\", SourcePath
);
237 DPRINTM(DPRINT_WINDOWS
,"SystemRoot: '%s', SystemPath: '%s'\n", BootPath
, SystemPath
);
239 /* Allocate and minimalistic-initialize LPB */
240 AllocateAndInitLPB(&LoaderBlock
);
242 /* Allocate and initialize setup loader block */
243 SetupBlock
= MmHeapAlloc(sizeof(SETUP_LOADER_BLOCK
));
244 RtlZeroMemory(SetupBlock
, sizeof(SETUP_LOADER_BLOCK
));
245 LoaderBlock
->SetupLdrBlock
= SetupBlock
;
247 /* Set textmode setup flag */
248 SetupBlock
->Flags
= SETUPLDR_TEXT_MODE
;
250 /* Detect hardware */
252 LoaderBlock
->ConfigurationRoot
= MachHwDetect();
255 strcpy(FileName
, BootPath
);
256 strcat(FileName
, "NTOSKRNL.EXE");
257 Status
= WinLdrLoadImage(FileName
, LoaderSystemCode
, &NtosBase
);
258 DPRINTM(DPRINT_WINDOWS
, "Ntos loaded with status %d at %p\n", Status
, NtosBase
);
261 strcpy(FileName
, BootPath
);
262 strcat(FileName
, "HAL.DLL");
263 Status
= WinLdrLoadImage(FileName
, LoaderHalCode
, &HalBase
);
264 DPRINTM(DPRINT_WINDOWS
, "HAL loaded with status %d at %p\n", Status
, HalBase
);
266 /* Load kernel-debugger support dll */
267 strcpy(FileName
, BootPath
);
268 strcat(FileName
, "KDCOM.DLL");
269 Status
= WinLdrLoadImage(FileName
, LoaderBootDriver
, &KdComBase
);
270 DPRINTM(DPRINT_WINDOWS
, "KdCom loaded with status %d at %p\n", Status
, KdComBase
);
272 /* Allocate data table entries for above-loaded modules */
273 WinLdrAllocateDataTableEntry(LoaderBlock
, "ntoskrnl.exe",
274 "NTOSKRNL.EXE", NtosBase
, &KernelDTE
);
275 WinLdrAllocateDataTableEntry(LoaderBlock
, "hal.dll",
276 "HAL.DLL", HalBase
, &HalDTE
);
277 WinLdrAllocateDataTableEntry(LoaderBlock
, "kdcom.dll",
278 "KDCOM.DLL", KdComBase
, &KdComDTE
);
280 /* Load all referenced DLLs for kernel, HAL and kdcom.dll */
281 strcpy(SearchPath
, BootPath
);
282 WinLdrScanImportDescriptorTable(LoaderBlock
, SearchPath
, KernelDTE
);
283 WinLdrScanImportDescriptorTable(LoaderBlock
, SearchPath
, HalDTE
);
285 WinLdrScanImportDescriptorTable(LoaderBlock
, SearchPath
, KdComDTE
);
288 SetupLdrLoadNlsData(LoaderBlock
, InfHandle
, BootPath
);
290 /* Get a list of boot drivers */
291 SetupLdrScanBootDrivers(LoaderBlock
, InfHandle
, BootPath
);
293 /* Load boot drivers */
294 Status
= WinLdrLoadBootDrivers(LoaderBlock
, BootPath
);
295 DPRINTM(DPRINT_WINDOWS
, "Boot drivers loaded with status %d\n", Status
);
297 /* Alloc PCR, TSS, do magic things with the GDT/IDT */
298 WinLdrSetupForNt(LoaderBlock
, &GdtIdt
, &PcrBasePage
, &TssBasePage
);
300 /* Initialize Phase 1 - no drivers loading anymore */
302 WinLdrInitializePhase1(LoaderBlock
, LoadOptions
, SystemPath
, BootPath
, _WIN32_WINNT_WS03
);
304 /* Save entry-point pointer and Loader block VAs */
305 KiSystemStartup
= (KERNEL_ENTRY_POINT
)KernelDTE
->EntryPoint
;
306 LoaderBlockVA
= PaToVa(LoaderBlock
);
308 /* "Stop all motors", change videomode */
309 MachPrepareForReactOS(TRUE
);
312 //DumpMemoryAllocMap();
314 /* Turn on paging mode of CPU*/
315 WinLdrTurnOnPaging(LoaderBlock
, PcrBasePage
, TssBasePage
, GdtIdt
);
317 /* Save final value of LoaderPagesSpanned */
318 LoaderBlock
->Extension
->LoaderPagesSpanned
= LoaderPagesSpanned
;
320 DPRINTM(DPRINT_WINDOWS
, "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n",
321 KiSystemStartup
, LoaderBlockVA
);
323 //WinLdrpDumpMemoryDescriptors(LoaderBlockVA);
324 //WinLdrpDumpBootDriver(LoaderBlockVA);
325 //WinLdrpDumpArcDisks(LoaderBlockVA);
327 /*asm(".intel_syntax noprefix\n");
330 asm(".att_syntax\n");*/
333 (*KiSystemStartup
)(LoaderBlockVA
);