ReactOS 0.4.16-dev-106-g10b08aa
bootmgr.c
Go to the documentation of this file.
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>
26
27/* GLOBALS ********************************************************************/
28
29typedef VOID
31 _Inout_ OperatingSystemItem* OperatingSystem);
32
33static VOID
35 _Inout_ OperatingSystemItem* OperatingSystem)
36{
37 EditCustomBootReactOS(OperatingSystem, TRUE);
38}
39
40static VOID
42 _Inout_ OperatingSystemItem* OperatingSystem)
43{
44 EditCustomBootReactOS(OperatingSystem, FALSE);
45}
46
47typedef struct _OS_LOADING_METHOD
48{
53
54static const OS_LOADING_METHOD
56{
58
59#if defined(_M_IX86) || defined(_M_AMD64)
60#ifndef UEFIBOOT
61 {"BootSector", EditCustomBootSector, LoadAndBootSector},
62 {"Linux" , EditCustomBootLinux , LoadAndBootLinux },
63#endif
64#endif
65#ifdef _M_IX86
66 {"WindowsNT40" , EditCustomBootNTOS, LoadAndBootWindows},
67#endif
69 {"Windows2003" , EditCustomBootNTOS, LoadAndBootWindows},
70 {"WindowsVista", EditCustomBootNTOS, LoadAndBootWindows},
71};
72
73/* FUNCTIONS ******************************************************************/
74
75#ifdef HAS_DEPRECATED_OPTIONS
79VOID
81 _In_ PCSTR MsgFmt,
82 ...)
83{
84 va_list ap;
85 CHAR msgString[300];
86
87 /* If the user didn't cancel the timeout, don't display the warning */
88 if (BootMgrInfo.TimeOut >= 0)
89 return;
90
91 va_start(ap, MsgFmt);
92 RtlStringCbVPrintfA(msgString, sizeof(msgString),
93 MsgFmt, ap);
94 va_end(ap);
95
97 " WARNING!\n"
98 "\n"
99 "%s\n"
100 "\n"
101 "Should you need assistance, please contact ReactOS developers\n"
102 "on the official ReactOS Mattermost server <chat.reactos.org>.",
103 msgString);
104}
105#endif // HAS_DEPRECATED_OPTIONS
106
107static const OS_LOADING_METHOD*
109 _In_ ULONG_PTR SectionId)
110{
111 ULONG i;
112 CHAR BootType[80];
113
114 /* The operating system section has been opened by InitOperatingSystemList() */
115 ASSERT(SectionId != 0);
116
117 /* Try to read the boot type. We must have the value (it
118 * has been possibly added by InitOperatingSystemList()) */
119 *BootType = ANSI_NULL;
120 IniReadSettingByName(SectionId, "BootType", BootType, sizeof(BootType));
121 ASSERT(*BootType);
122
124#ifdef HAS_DEPRECATED_OPTIONS
125 if ((_stricmp(BootType, "Drive") == 0) ||
126 (_stricmp(BootType, "Partition") == 0))
127 {
128 /* Display the deprecation warning message */
130 "The '%s' configuration you are booting into is no longer\n"
131 "supported and will be removed in future FreeLoader versions.\n"
132 "\n"
133 "Please edit FREELDR.INI to replace all occurrences of\n"
134 "\n"
135 " %*s to:\n"
136 " BootType=%s ------> BootType=BootSector",
137 BootType,
138 strlen(BootType), "", // Indentation
139 BootType);
140
141 /* Type fixup */
142 strcpy(BootType, "BootSector");
143 if (!IniModifySettingValue(SectionId, "BootType", BootType))
144 {
145 ERR("Could not fixup the BootType entry for OS '%s', ignoring.\n",
146 ((PINI_SECTION)SectionId)->SectionName);
147 }
148 }
149#endif // HAS_DEPRECATED_OPTIONS
151
152 /* Find the suitable OS loading method */
153 for (i = 0; ; ++i)
154 {
156 {
157 UiMessageBox("Unknown boot entry type '%s'", BootType);
158 return NULL;
159 }
160 if (_stricmp(BootType, OSLoadingMethods[i].BootType) == 0)
161 return &OSLoadingMethods[i];
162 }
164}
165
173static PCHAR*
175 _In_ PCSTR LoadIdentifier,
176 _In_ ULONG_PTR SectionId,
177 _Out_ PULONG pArgc)
178{
179 SIZE_T Size;
180 ULONG Count;
181 ULONG i;
182 ULONG Argc;
183 PCHAR* Argv;
184 PCHAR* Args;
185 PCHAR SettingName, SettingValue;
186
187 *pArgc = 0;
188
189 ASSERT(SectionId != 0);
190
191 /* Normalize LoadIdentifier to make subsequent tests simpler */
192 if (LoadIdentifier && !*LoadIdentifier)
193 LoadIdentifier = NULL;
194
195 /* Count the number of operating systems in the section */
196 Count = IniGetNumSectionItems(SectionId);
197
198 /*
199 * The argument vector contains the program name, the SystemPartition,
200 * the LoadIdentifier (optional), and the items in the OS section.
201 * For POSIX compliance, a terminating NULL pointer (not counted in Argc)
202 * is appended, such that Argv[Argc] == NULL.
203 */
204 Argc = 2 + (LoadIdentifier ? 1 : 0) + Count;
205
206 /* Calculate the total size needed for the string buffer of the argument vector */
207 Size = 0;
208 /* i == 0: Program name */
209 // TODO: Provide one in the future...
210 /* i == 1: SystemPartition : from where FreeLdr has been started */
211 Size += (strlen("SystemPartition=") + strlen(FrLdrBootPath) + 1) * sizeof(CHAR);
212 /* i == 2: LoadIdentifier : ASCII string that may be used
213 * to associate an identifier with a set of load parameters */
214 if (LoadIdentifier)
215 {
216 Size += (strlen("LoadIdentifier=") + strlen(LoadIdentifier) + 1) * sizeof(CHAR);
217 }
218 /* The section items */
219 for (i = 0; i < Count; ++i)
220 {
221 Size += IniGetSectionSettingNameSize(SectionId, i); // Counts also the NULL-terminator, that we transform into the '=' sign separator.
222 Size += IniGetSectionSettingValueSize(SectionId, i); // Counts also the NULL-terminator.
223 }
224 Size += sizeof(ANSI_NULL); // Final NULL-terminator.
225
226 /* Allocate memory to hold the argument vector: pointers and string buffer */
227 Argv = FrLdrHeapAlloc((Argc + 1) * sizeof(PCHAR) + Size, TAG_STRING);
228 if (!Argv)
229 return NULL;
230
231 /* Initialize the argument vector: loop through the section and copy the Key=Value options */
232 SettingName = (PCHAR)((ULONG_PTR)Argv + ((Argc + 1) * sizeof(PCHAR)));
233 Args = Argv;
234 /* i == 0: Program name */
235 *Args++ = NULL; // TODO: Provide one in the future...
236 /* i == 1: SystemPartition */
237 {
238 strcpy(SettingName, "SystemPartition=");
239 strcat(SettingName, FrLdrBootPath);
240
241 *Args++ = SettingName;
242 SettingName += (strlen(SettingName) + 1);
243 }
244 /* i == 2: LoadIdentifier */
245 if (LoadIdentifier)
246 {
247 strcpy(SettingName, "LoadIdentifier=");
248 strcat(SettingName, LoadIdentifier);
249
250 *Args++ = SettingName;
251 SettingName += (strlen(SettingName) + 1);
252 }
253 /* The section items */
254 for (i = 0; i < Count; ++i)
255 {
256 Size = IniGetSectionSettingNameSize(SectionId, i);
257 SettingValue = SettingName + Size;
258 IniReadSettingByNumber(SectionId, i,
259 SettingName, Size,
260 SettingValue, IniGetSectionSettingValueSize(SectionId, i));
261 SettingName[Size - 1] = '=';
262
263 *Args++ = SettingName;
264 SettingName += (strlen(SettingName) + 1);
265 }
266 /* Terminating NULL pointer */
267 *Args = NULL;
268
269#if DBG
270 /* Dump the argument vector for debugging */
271 for (i = 0; i < Argc; ++i)
272 {
273 TRACE("Argv[%lu]: '%s'\n", i, Argv[i]);
274 }
275#endif
276
277 *pArgc = Argc;
278 return Argv;
279}
280
281VOID
283 _In_ OperatingSystemItem* OperatingSystem)
284{
285 ULONG_PTR SectionId = OperatingSystem->SectionId;
286 const OS_LOADING_METHOD* OSLoadingMethod;
287 ULONG Argc;
288 PCHAR* Argv;
289
290 /* Find the suitable OS loader to start */
291 OSLoadingMethod = GetOSLoadingMethod(SectionId);
292 if (!OSLoadingMethod)
293 return;
294 ASSERT(OSLoadingMethod->OsLoader);
295
296 /* Build the ARC-compatible argument vector */
297 Argv = BuildArgvForOsLoader(OperatingSystem->LoadIdentifier, SectionId, &Argc);
298 if (!Argv)
299 return; // Unexpected failure.
300
301#ifdef _M_IX86
302#ifndef UEFIBOOT
303 /* Install the drive mapper according to this section drive mappings */
304 DriveMapMapDrivesInSection(SectionId);
305#endif
306#endif
307
308 /* Start the OS loader */
309 OSLoadingMethod->OsLoader(Argc, Argv, NULL);
311}
312
313#ifdef HAS_OPTION_MENU_EDIT_CMDLINE
314VOID
315EditOperatingSystemEntry(
316 _Inout_ OperatingSystemItem* OperatingSystem)
317{
318 /* Find the suitable OS entry editor and open it */
319 const OS_LOADING_METHOD* OSLoadingMethod =
320 GetOSLoadingMethod(OperatingSystem->SectionId);
321 if (OSLoadingMethod)
322 {
323 ASSERT(OSLoadingMethod->EditOsEntry);
324 OSLoadingMethod->EditOsEntry(OperatingSystem);
325 }
326}
327#endif // HAS_OPTION_MENU_EDIT_CMDLINE
328
331 IN ULONG KeyPress,
332 IN ULONG SelectedMenuItem,
334{
335 /* Any key-press cancels the global timeout */
336 BootMgrInfo.TimeOut = -1;
337
338 switch (KeyPress)
339 {
340 case KEY_F8:
341 DoOptionsMenu(&((OperatingSystemItem*)Context)[SelectedMenuItem]);
342 return TRUE;
343
344#ifdef HAS_OPTION_MENU_EDIT_CMDLINE
345 case KEY_F10:
346 EditOperatingSystemEntry(&((OperatingSystemItem*)Context)[SelectedMenuItem]);
347 return TRUE;
348#endif
349
350 default:
351 /* We didn't handle the key */
352 return FALSE;
353 }
354}
355
357{
358 OperatingSystemItem* OperatingSystemList;
359 PCSTR* OperatingSystemDisplayNames;
360 ULONG OperatingSystemCount;
361 ULONG DefaultOperatingSystem;
362 ULONG SelectedOperatingSystem;
363 ULONG i;
364
366 {
367 UiMessageBoxCritical("Error when detecting hardware.");
368 return;
369 }
370
371#ifdef _M_IX86
372#ifndef UEFIBOOT
373 /* Load additional SCSI driver (if any) */
375 {
376 UiMessageBoxCritical("Unable to load additional boot device drivers.");
377 }
378#endif
379#endif
380
381 /* Open FREELDR.INI and load the global FreeLoader settings */
382 if (!IniFileInitialize())
383 {
384 UiMessageBoxCritical("Error initializing .ini file.");
385 return;
386 }
388#if 0
389 if (FALSE)
390 {
391 UiMessageBoxCritical("Could not load global FreeLoader settings.");
392 return;
393 }
394#endif
395
396 /* Debugger main initialization */
398
399 /* UI main initialization */
400 if (!UiInitialize(TRUE))
401 {
402 UiMessageBoxCritical("Unable to initialize UI.");
403 return;
404 }
405
406 OperatingSystemList = InitOperatingSystemList(&OperatingSystemCount,
407 &DefaultOperatingSystem);
408 if (!OperatingSystemList)
409 {
410 UiMessageBox("Unable to read operating systems section in freeldr.ini.\nPress ENTER to reboot.");
411 goto Reboot;
412 }
413 if (OperatingSystemCount == 0)
414 {
415 UiMessageBox("There were no operating systems listed in freeldr.ini.\nPress ENTER to reboot.");
416 goto Reboot;
417 }
418
419 /* Create list of display names */
420 OperatingSystemDisplayNames = FrLdrTempAlloc(sizeof(PCSTR) * OperatingSystemCount, 'mNSO');
421 if (!OperatingSystemDisplayNames)
422 goto Reboot;
423
424 for (i = 0; i < OperatingSystemCount; i++)
425 {
426 OperatingSystemDisplayNames[i] = OperatingSystemList[i].LoadIdentifier;
427 }
428
429 /* Find all the message box settings and run them */
431
432 for (;;)
433 {
434 /* Redraw the backdrop */
436
437 /* Show the operating system list menu */
438 if (!UiDisplayMenu("Please select the operating system to start:",
439 "For troubleshooting and advanced startup options for "
440 "ReactOS, press F8.",
441 TRUE,
442 OperatingSystemDisplayNames,
443 OperatingSystemCount,
444 DefaultOperatingSystem,
446 &SelectedOperatingSystem,
447 FALSE,
449 OperatingSystemList))
450 {
451 UiMessageBox("Press ENTER to reboot.");
452 goto Reboot;
453 }
454
455 /* Load the chosen operating system */
456 LoadOperatingSystem(&OperatingSystemList[SelectedOperatingSystem]);
457
458 BootMgrInfo.TimeOut = -1;
459
460 /* If we get there, the OS loader failed. As it may have
461 * messed up the display, re-initialize the UI. */
462#ifndef _M_ARM
464#endif
466 }
467
468Reboot:
469 UiUnInitialize("Rebooting...");
470 IniCleanup();
471 return;
472}
#define WARNING
Definition: BusLogic958.h:56
unsigned char BOOLEAN
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
char ** Args
Definition: acdebug.h:353
#define VOID
Definition: acefi.h:82
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
ARC_STATUS(__cdecl * ARC_ENTRY_POINT)(_In_ ULONG Argc, _In_ PCHAR Argv[], _In_ PCHAR Envp[])
Definition: arcsupp.h:12
void LoadSettings(void)
Definition: settings.c:53
#define ERR(fmt,...)
Definition: precomp.h:57
@ Reboot
Definition: bl.h:891
VOID EditCustomBootReactOS(IN OUT OperatingSystemItem *OperatingSystem, IN BOOLEAN IsSetup)
Definition: custom.c:486
ULONG LoadBootDeviceDriver(VOID)
Definition: scsiport.c:1635
#define DebugInit(DebugString)
Definition: debug.h:120
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
#define MachInitializeBootDevices()
Definition: machine.h:133
FORCEINLINE VOID FrLdrHeapFree(PVOID MemoryPointer, ULONG Tag)
Definition: mm.h:181
FORCEINLINE PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
Definition: mm.h:188
FORCEINLINE PVOID FrLdrHeapAlloc(SIZE_T MemorySize, ULONG Tag)
Definition: mm.h:174
VOID DoOptionsMenu(IN OperatingSystemItem *OperatingSystem)
Definition: options.c:92
BOOTMGRINFO BootMgrInfo
Definition: settings.c:18
BOOLEAN UiDisplayMenu(IN PCSTR MenuHeader, IN PCSTR MenuFooter OPTIONAL, IN BOOLEAN ShowBootOptions, IN PCSTR MenuItemList[], IN ULONG MenuItemCount, IN ULONG DefaultMenuItem, IN LONG MenuTimeOut, OUT PULONG SelectedMenuItem, IN BOOLEAN CanEscape, IN UiMenuKeyPressFilterCallback KeyPressFilter OPTIONAL, IN PVOID Context OPTIONAL)
Definition: ui.c:605
VOID UiShowMessageBoxesInSection(IN ULONG_PTR SectionId)
Definition: ui.c:524
VOID UiMessageBoxCritical(_In_ PCSTR MessageText)
Definition: ui.c:372
UIVTBL UiVtbl
Definition: ui.c:64
VOID UiUnInitialize(PCSTR BootText)
Definition: ui.c:224
VOID UiDrawBackdrop(VOID)
Definition: ui.c:233
BOOLEAN UiInitialize(BOOLEAN ShowUi)
Definition: ui.c:92
VOID UiMessageBox(_In_ PCSTR Format,...)
Definition: ui.c:359
#define _stricmp
Definition: cat.c:22
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static VOID EditCustomBootNTOS(_Inout_ OperatingSystemItem *OperatingSystem)
Definition: bootmgr.c:41
VOID LoadOperatingSystem(_In_ OperatingSystemItem *OperatingSystem)
Definition: bootmgr.c:282
BOOLEAN MainBootMenuKeyPressFilter(IN ULONG KeyPress, IN ULONG SelectedMenuItem, IN PVOID Context OPTIONAL)
Definition: bootmgr.c:330
static PCHAR * BuildArgvForOsLoader(_In_ PCSTR LoadIdentifier, _In_ ULONG_PTR SectionId, _Out_ PULONG pArgc)
This function converts the list of Key=Value options in the given operating system section into an AR...
Definition: bootmgr.c:174
struct _OS_LOADING_METHOD * POS_LOADING_METHOD
static const OS_LOADING_METHOD * GetOSLoadingMethod(_In_ ULONG_PTR SectionId)
Definition: bootmgr.c:108
static const OS_LOADING_METHOD OSLoadingMethods[]
Definition: bootmgr.c:55
struct _OS_LOADING_METHOD OS_LOADING_METHOD
static VOID EditCustomBootReactOSSetup(_Inout_ OperatingSystemItem *OperatingSystem)
Definition: bootmgr.c:34
VOID(* EDIT_OS_ENTRY_PROC)(_Inout_ OperatingSystemItem *OperatingSystem)
Definition: bootmgr.c:30
VOID RunLoader(VOID)
Definition: bootmgr.c:356
CCHAR FrLdrBootPath[MAX_PATH]
Definition: freeldr.c:39
VOID WarnDeprecated(_In_ PCSTR MsgFmt,...)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
ARC_STATUS LoadReactOSSetup(IN ULONG Argc, IN PCHAR Argv[], IN PCHAR Envp[])
Definition: setupldr.c:475
ARC_STATUS LoadAndBootWindows(IN ULONG Argc, IN PCHAR Argv[], IN PCHAR Envp[])
Definition: winldr.c:976
ULONG IniGetSectionSettingValueSize(ULONG_PTR SectionId, ULONG SettingIndex)
Definition: inifile.c:103
ULONG IniGetNumSectionItems(ULONG_PTR SectionId)
Definition: inifile.c:55
BOOLEAN IniFileInitialize(VOID)
Definition: ini_init.c:25
BOOLEAN IniModifySettingValue(ULONG_PTR SectionId, PCSTR SettingName, PCSTR SettingValue)
Definition: inifile.c:296
ULONG IniGetSectionSettingNameSize(ULONG_PTR SectionId, ULONG SettingIndex)
Definition: inifile.c:90
BOOLEAN IniReadSettingByNumber(ULONG_PTR SectionId, ULONG SettingNumber, PCHAR SettingName, ULONG NameSize, PCHAR SettingValue, ULONG ValueSize)
Definition: inifile.c:116
BOOLEAN IniReadSettingByName(ULONG_PTR SectionId, PCSTR SettingName, PCHAR Buffer, ULONG BufferSize)
Definition: inifile.c:149
VOID IniCleanup(VOID)
Definition: inifile.c:238
#define KEY_F8
Definition: keycodes.h:58
#define KEY_F10
Definition: keycodes.h:60
#define PCHAR
Definition: match.c:90
#define ASSERT(a)
Definition: mode.c:44
#define _Inout_
Definition: ms_sal.h:378
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
int Count
Definition: noreturn.cpp:7
#define UNREACHABLE
#define ANSI_NULL
NTSTRSAFEAPI RtlStringCbVPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat, _In_ va_list argList)
Definition: ntstrsafe.h:1034
#define TAG_STRING
Definition: oslist.h:22
OperatingSystemItem * InitOperatingSystemList(_Out_ PULONG OperatingSystemCount, _Out_ PULONG DefaultOperatingSystem)
Definition: oslist.c:46
@ ESUCCESS
Definition: arc.h:32
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
LONG TimeOut
Definition: settings.h:14
PCSTR DebugString
Definition: settings.h:12
ULONG_PTR FrLdrSection
Definition: settings.h:15
EDIT_OS_ENTRY_PROC EditOsEntry
Definition: bootmgr.c:50
ARC_ENTRY_POINT OsLoader
Definition: bootmgr.c:51
VOID(* UnInitialize)(VOID)
Definition: ui.h:251
uint32_t * PULONG
Definition: typedefs.h:59
ULONG_PTR SIZE_T
Definition: typedefs.h:80
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
void int int ULONGLONG int va_list * ap
Definition: winesup.h:36
char CHAR
Definition: xmlstorage.h:175