+/*
+ * FreeLoader
+ * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
+ * Copyright (C) 2006 Aleksey Bragin <aleksey@reactos.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#pragma once
+
+#include <arc/setupblk.h>
+
+#if 0
+// See freeldr/include/winldr.h
+#define TAG_WLDR_DTE 'eDlW'
+#define TAG_WLDR_BDE 'dBlW'
+#define TAG_WLDR_NAME 'mNlW'
+
+#endif
+
+/* Entry-point to kernel */
+typedef VOID (NTAPI *KERNEL_ENTRY_POINT) (PLOADER_PARAMETER_BLOCK LoaderBlock);
+
+
+// Some definitions
+
+#if 0
+
+// Descriptors
+#define NUM_GDT 128 // Must be 128
+#define NUM_IDT 0x100 // Only 16 are used though. Must be 0x100
+
+#include <pshpack1.h>
+typedef struct /* Root System Descriptor Pointer */
+{
+ CHAR signature [8]; /* contains "RSD PTR " */
+ UCHAR checksum; /* to make sum of struct == 0 */
+ CHAR oem_id [6]; /* OEM identification */
+ UCHAR revision; /* Must be 0 for 1.0, 2 for 2.0 */
+ ULONG rsdt_physical_address; /* 32-bit physical address of RSDT */
+ ULONG length; /* XSDT Length in bytes including hdr */
+ ULONGLONG xsdt_physical_address; /* 64-bit physical address of XSDT */
+ UCHAR extended_checksum; /* Checksum of entire table */
+ CHAR reserved [3]; /* reserved field must be 0 */
+} RSDP_DESCRIPTOR, *PRSDP_DESCRIPTOR;
+#include <poppack.h>
+
+typedef struct _ARC_DISK_SIGNATURE_EX
+{
+ ARC_DISK_SIGNATURE DiskSignature;
+ CHAR ArcName[MAX_PATH];
+} ARC_DISK_SIGNATURE_EX, *PARC_DISK_SIGNATURE_EX;
+
+#endif
+
+#define MAX_OPTIONS_LENGTH 255
+
+typedef struct _LOADER_SYSTEM_BLOCK
+{
+ LOADER_PARAMETER_BLOCK LoaderBlock;
+ LOADER_PARAMETER_EXTENSION Extension;
+ SETUP_LOADER_BLOCK SetupBlock;
+#ifdef _M_IX86
+ HEADLESS_LOADER_BLOCK HeadlessLoaderBlock;
+#endif
+ NLS_DATA_BLOCK NlsDataBlock;
+ CHAR LoadOptions[MAX_OPTIONS_LENGTH+1];
+ CHAR ArcBootDeviceName[MAX_PATH+1];
+ // CHAR ArcHalDeviceName[MAX_PATH];
+ CHAR NtBootPathName[MAX_PATH+1];
+ CHAR NtHalPathName[MAX_PATH+1];
+ ARC_DISK_INFORMATION ArcDiskInformation;
+} LOADER_SYSTEM_BLOCK, *PLOADER_SYSTEM_BLOCK;
+
+extern PLOADER_SYSTEM_BLOCK WinLdrSystemBlock;
+
+
+// conversion.c
+#if 0
+PVOID VaToPa(PVOID Va);
+PVOID PaToVa(PVOID Pa);
+VOID List_PaToVa(_In_ LIST_ENTRY *ListEntry);
+#endif
+VOID ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start);
+
+
+// winldr.c
+PVOID WinLdrLoadModule(PCSTR ModuleName, ULONG *Size,
+ TYPE_OF_MEMORY MemoryType);
+
+// wlmemory.c
+BOOLEAN
+WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock);
+
+// wlregistry.c
+BOOLEAN
+WinLdrInitSystemHive(
+ IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN PCSTR SystemRoot,
+ IN BOOLEAN Setup);
+
+BOOLEAN WinLdrScanSystemHive(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN LPCSTR DirectoryPath);
+
+// winldr.c
+VOID
+WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock,
+ LPCSTR Options,
+ LPCSTR SystemPath,
+ LPCSTR BootPath,
+ USHORT VersionToBoot);
+BOOLEAN
+WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN LPCSTR DirectoryPath,
+ IN LPCSTR AnsiFileName,
+ IN LPCSTR OemFileName,
+ IN LPCSTR LanguageFileName);
+BOOLEAN
+WinLdrAddDriverToList(LIST_ENTRY *BootDriverListHead,
+ LPWSTR RegistryPath,
+ LPWSTR ImagePath,
+ LPWSTR ServiceName);
+
+VOID
+WinLdrpDumpMemoryDescriptors(PLOADER_PARAMETER_BLOCK LoaderBlock);
+
+VOID
+WinLdrpDumpBootDriver(PLOADER_PARAMETER_BLOCK LoaderBlock);
+
+VOID
+WinLdrpDumpArcDisks(PLOADER_PARAMETER_BLOCK LoaderBlock);
+
+VOID
+LoadAndBootWindowsCommon(
+ USHORT OperatingSystemVersion,
+ PLOADER_PARAMETER_BLOCK LoaderBlock,
+ LPCSTR BootOptions,
+ LPCSTR BootPath,
+ BOOLEAN Setup);