1 /* 2 * FreeLoader 3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 /* INCLUDES *******************************************************************/ 21 22 #include <freeldr.h> 23 24 #include <debug.h> 25 DBG_DEFAULT_CHANNEL(WARNING); 26 27 /* GLOBALS ********************************************************************/ 28 29 CCHAR FrLdrBootPath[MAX_PATH] = ""; 30 31 /* FUNCTIONS ******************************************************************/ 32 33 VOID __cdecl BootMain(IN PCCH CmdLine) 34 { 35 /* Load the default settings from the command-line */ 36 LoadSettings(CmdLine); 37 38 /* Debugger pre-initialization */ 39 DebugInit(BootMgrInfo.DebugString); 40 41 MachInit(CmdLine); 42 43 TRACE("BootMain() called.\n"); 44 45 #ifndef UEFIBOOT 46 /* Check if the CPU is new enough */ 47 FrLdrCheckCpuCompatibility(); // FIXME: Should be done inside MachInit! 48 #endif 49 50 /* UI pre-initialization */ 51 if (!UiInitialize(FALSE)) 52 { 53 UiMessageBoxCritical("Unable to initialize UI."); 54 goto Quit; 55 } 56 57 /* Initialize memory manager */ 58 if (!MmInitializeMemoryManager()) 59 { 60 UiMessageBoxCritical("Unable to initialize memory manager."); 61 goto Quit; 62 } 63 64 /* Initialize I/O subsystem */ 65 FsInit(); 66 67 /* Initialize the module list */ 68 if (!PeLdrInitializeModuleList()) 69 { 70 UiMessageBoxCritical("Unable to initialize module list."); 71 goto Quit; 72 } 73 74 if (!MachInitializeBootDevices()) 75 { 76 UiMessageBoxCritical("Error when detecting hardware."); 77 goto Quit; 78 } 79 80 RunLoader(); 81 82 Quit: 83 /* If we reach this point, something went wrong before, therefore reboot */ 84 Reboot(); 85 } 86 87 // We need to emulate these, because the original ones don't work in freeldr 88 // These functions are here, because they need to be in the main compilation unit 89 // and cannot be in a library. 90 int __cdecl wctomb(char *mbchar, wchar_t wchar) 91 { 92 *mbchar = (char)wchar; 93 return 1; 94 } 95 96 int __cdecl mbtowc(wchar_t *wchar, const char *mbchar, size_t count) 97 { 98 *wchar = (wchar_t)*mbchar; 99 return 1; 100 } 101 102 // The wctype table is 144 KB, too much for poor freeldr 103 int __cdecl iswctype(wint_t wc, wctype_t wctypeFlags) 104 { 105 return _isctype((char)wc, wctypeFlags); 106 } 107 108 #ifdef _MSC_VER 109 #pragma warning(disable:4164) 110 #pragma function(pow) 111 #pragma function(log) 112 #pragma function(log10) 113 #endif 114 115 // Stubs to avoid pulling in data from CRT 116 double pow(double x, double y) 117 { 118 __debugbreak(); 119 return 0.0; 120 } 121 122 double log(double x) 123 { 124 __debugbreak(); 125 return 0.0; 126 } 127 128 double log10(double x) 129 { 130 __debugbreak(); 131 return 0.0; 132 } 133 134 PCCHAR FrLdrGetBootPath(VOID) 135 { 136 return FrLdrBootPath; 137 } 138 139 UCHAR FrldrGetBootDrive(VOID) 140 { 141 return FrldrBootDrive; 142 } 143 144 ULONG FrldrGetBootPartition(VOID) 145 { 146 return FrldrBootPartition; 147 } 148