/* * FreeLoader * Copyright (C) 1998-2003 Brian Palmer * Copyright (C) 2006 Aleksey Bragin * * 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 #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 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 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);