mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 09:24:11 +00:00
141 lines
4 KiB
C
141 lines
4 KiB
C
/*
|
|
* PROJECT: ReactOS Boot Loader
|
|
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
|
* FILE: boot/freeldr/freeldr/cmdline.c
|
|
* PURPOSE: FreeLDR Command Line Parsing
|
|
* PROGRAMMERS: ReactOS Portable Systems Group
|
|
*/
|
|
|
|
/* INCLUDES *******************************************************************/
|
|
|
|
#include <freeldr.h>
|
|
|
|
/* GLOBALS ********************************************************************/
|
|
|
|
typedef struct tagCMDLINEINFO
|
|
{
|
|
PCCH DebugString;
|
|
PCCH DefaultOperatingSystem;
|
|
LONG TimeOut;
|
|
} CMDLINEINFO, *PCMDLINEINFO;
|
|
|
|
CCHAR DebugString[256];
|
|
CCHAR DefaultOs[256];
|
|
CMDLINEINFO CmdLineInfo;
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
VOID
|
|
CmdLineParse(IN PCCH CmdLine)
|
|
{
|
|
PCHAR End, Setting;
|
|
ULONG_PTR Length, Offset = 0;
|
|
|
|
/* Set defaults */
|
|
CmdLineInfo.DebugString = NULL;
|
|
CmdLineInfo.DefaultOperatingSystem = NULL;
|
|
CmdLineInfo.TimeOut = -1;
|
|
|
|
/*
|
|
* Get debug string, in the following format:
|
|
* "debug=option1=XXX;option2=YYY;..."
|
|
* and translate it into the format:
|
|
* "OPTION1=XXX OPTION2=YYY ..."
|
|
*/
|
|
Setting = strstr(CmdLine, "debug=");
|
|
if (Setting)
|
|
{
|
|
/* Check if there are more command-line parameters following */
|
|
Setting += sizeof("debug=") + sizeof(ANSI_NULL);
|
|
End = strstr(Setting, " ");
|
|
if (End)
|
|
Length = End - Setting;
|
|
else
|
|
Length = sizeof(DebugString);
|
|
|
|
/* Copy the debug string and upcase it */
|
|
strncpy(DebugString, Setting, Length);
|
|
DebugString[Length - 1] = ANSI_NULL;
|
|
_strupr(DebugString);
|
|
|
|
/* Replace all separators ';' by spaces */
|
|
Setting = DebugString;
|
|
while (*Setting)
|
|
{
|
|
if (*Setting == ';') *Setting = ' ';
|
|
Setting++;
|
|
}
|
|
|
|
CmdLineInfo.DebugString = DebugString;
|
|
}
|
|
|
|
/* Get timeout */
|
|
Setting = strstr(CmdLine, "timeout=");
|
|
if (Setting) CmdLineInfo.TimeOut = atoi(Setting +
|
|
sizeof("timeout=") +
|
|
sizeof(ANSI_NULL));
|
|
|
|
/* Get default OS */
|
|
Setting = strstr(CmdLine, "defaultos=");
|
|
if (Setting)
|
|
{
|
|
/* Check if there are more command-line parameters following */
|
|
Setting += sizeof("defaultos=") + sizeof(ANSI_NULL);
|
|
End = strstr(Setting, " ");
|
|
if (End)
|
|
Length = End - Setting;
|
|
else
|
|
Length = sizeof(DefaultOs);
|
|
|
|
/* Copy the default OS */
|
|
strncpy(DefaultOs, Setting, Length);
|
|
DefaultOs[Length - 1] = ANSI_NULL;
|
|
CmdLineInfo.DefaultOperatingSystem = DefaultOs;
|
|
}
|
|
|
|
/* Get ramdisk base address */
|
|
Setting = strstr(CmdLine, "rdbase=");
|
|
if (Setting) gRamDiskBase = (PVOID)(ULONG_PTR)strtoull(Setting +
|
|
sizeof("rdbase=") -
|
|
sizeof(ANSI_NULL),
|
|
NULL,
|
|
0);
|
|
|
|
/* Get ramdisk size */
|
|
Setting = strstr(CmdLine, "rdsize=");
|
|
if (Setting) gRamDiskSize = strtoul(Setting +
|
|
sizeof("rdsize=") -
|
|
sizeof(ANSI_NULL),
|
|
NULL,
|
|
0);
|
|
|
|
/* Get ramdisk offset */
|
|
Setting = strstr(CmdLine, "rdoffset=");
|
|
if (Setting) Offset = strtoul(Setting +
|
|
sizeof("rdoffset=") -
|
|
sizeof(ANSI_NULL),
|
|
NULL,
|
|
0);
|
|
|
|
/* Fix it up */
|
|
gRamDiskBase = (PVOID)((ULONG_PTR)gRamDiskBase + Offset);
|
|
}
|
|
|
|
PCCH
|
|
CmdLineGetDebugString(VOID)
|
|
{
|
|
return CmdLineInfo.DebugString;
|
|
}
|
|
|
|
PCCH
|
|
CmdLineGetDefaultOS(VOID)
|
|
{
|
|
return CmdLineInfo.DefaultOperatingSystem;
|
|
}
|
|
|
|
LONG
|
|
CmdLineGetTimeOut(VOID)
|
|
{
|
|
return CmdLineInfo.TimeOut;
|
|
}
|