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>
26 // See freeldr/include/winldr.h
27 #define TAG_WLDR_DTE 'eDlW'
28 #define TAG_WLDR_BDE 'dBlW'
29 #define TAG_WLDR_NAME 'mNlW'
33 /* Entry-point to kernel */
34 typedef VOID (NTAPI
*KERNEL_ENTRY_POINT
) (PLOADER_PARAMETER_BLOCK LoaderBlock
);
42 #define NUM_GDT 128 // Must be 128
43 #define NUM_IDT 0x100 // Only 16 are used though. Must be 0x100
46 typedef struct /* Root System Descriptor Pointer */
48 CHAR signature
[8]; /* contains "RSD PTR " */
49 UCHAR checksum
; /* to make sum of struct == 0 */
50 CHAR oem_id
[6]; /* OEM identification */
51 UCHAR revision
; /* Must be 0 for 1.0, 2 for 2.0 */
52 ULONG rsdt_physical_address
; /* 32-bit physical address of RSDT */
53 ULONG length
; /* XSDT Length in bytes including hdr */
54 ULONGLONG xsdt_physical_address
; /* 64-bit physical address of XSDT */
55 UCHAR extended_checksum
; /* Checksum of entire table */
56 CHAR reserved
[3]; /* reserved field must be 0 */
57 } RSDP_DESCRIPTOR
, *PRSDP_DESCRIPTOR
;
60 typedef struct _ARC_DISK_SIGNATURE_EX
62 ARC_DISK_SIGNATURE DiskSignature
;
63 CHAR ArcName
[MAX_PATH
];
64 } ARC_DISK_SIGNATURE_EX
, *PARC_DISK_SIGNATURE_EX
;
68 #define MAX_OPTIONS_LENGTH 255
70 typedef struct _LOADER_SYSTEM_BLOCK
72 LOADER_PARAMETER_BLOCK LoaderBlock
;
73 LOADER_PARAMETER_EXTENSION Extension
;
74 SETUP_LOADER_BLOCK SetupBlock
;
76 HEADLESS_LOADER_BLOCK HeadlessLoaderBlock
;
78 NLS_DATA_BLOCK NlsDataBlock
;
79 CHAR LoadOptions
[MAX_OPTIONS_LENGTH
+1];
80 CHAR ArcBootDeviceName
[MAX_PATH
+1];
81 // CHAR ArcHalDeviceName[MAX_PATH];
82 CHAR NtBootPathName
[MAX_PATH
+1];
83 CHAR NtHalPathName
[MAX_PATH
+1];
84 ARC_DISK_INFORMATION ArcDiskInformation
;
85 } LOADER_SYSTEM_BLOCK
, *PLOADER_SYSTEM_BLOCK
;
87 extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock
;
92 PVOID
VaToPa(PVOID Va
);
93 PVOID
PaToVa(PVOID Pa
);
94 VOID
List_PaToVa(_In_ LIST_ENTRY
*ListEntry
);
96 VOID
ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start
);
100 PVOID
WinLdrLoadModule(PCSTR ModuleName
, ULONG
*Size
,
101 TYPE_OF_MEMORY MemoryType
);
105 WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
);
109 WinLdrInitSystemHive(
110 IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
114 BOOLEAN
WinLdrScanSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
115 IN LPCSTR DirectoryPath
);
119 WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock
,
123 USHORT VersionToBoot
);
125 WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock
,
126 IN LPCSTR DirectoryPath
,
127 IN LPCSTR AnsiFileName
,
128 IN LPCSTR OemFileName
,
129 IN LPCSTR LanguageFileName
);
131 WinLdrAddDriverToList(LIST_ENTRY
*BootDriverListHead
,
137 WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock
);
140 WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock
);
143 WinLdrpDumpArcDisks(PLOADER_PARAMETER_BLOCK LoaderBlock
);
146 LoadAndBootWindowsCommon(
147 USHORT OperatingSystemVersion
,
148 PLOADER_PARAMETER_BLOCK LoaderBlock
,