[ros-dev] [ros-diffs] [hbelusca] 57899: [FREELDR] - Use a list of possible operating system method loading to load ReactOS / ROS-Setup / Windows / Linux or booting from a disk / partition ..., instead of using a (huge) ...

Aleksey Bragin aleksey at reactos.org
Fri Dec 14 09:40:16 UTC 2012


Great, that if/elseif was really lame and I wanted to fix that since the 
moment I added Windows boot support.

Regards,
Aleksey Bragin

On 13.12.2012 4:46, hbelusca at svn.reactos.org wrote:
> Author: hbelusca
> Date: Thu Dec 13 00:46:55 2012
> New Revision: 57899
>
> URL: http://svn.reactos.org/svn/reactos?rev=57899&view=rev
> Log:
> [FREELDR]
> - Use a list of possible operating system method loading to load ReactOS / ROS-Setup / Windows / Linux or booting from a disk / partition ..., instead of using a (huge) if () else if () ... instruction.
> - Modify the corresponding functions to take into account for this new functionality.
> - Allow having a live + boot cd if needed, in a elegant way.
>
> Modified:
>      trunk/reactos/boot/freeldr/freeldr/arch/i386/custom.c
>      trunk/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c
>      trunk/reactos/boot/freeldr/freeldr/bootmgr.c
>      trunk/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h
>      trunk/reactos/boot/freeldr/freeldr/include/linux.h
>      trunk/reactos/boot/freeldr/freeldr/include/winldr.h
>      trunk/reactos/boot/freeldr/freeldr/linuxboot.c
>      trunk/reactos/boot/freeldr/freeldr/windows/setupldr.c
>      trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
>
> Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/custom.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i386/custom.c?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/arch/i386/custom.c [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/arch/i386/custom.c [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -40,8 +40,8 @@
>   		"ReactOS",
>   		"Linux"
>   		};
> -	ULONG		CustomBootMenuCount = sizeof(CustomBootMenuList) / sizeof(CustomBootMenuList[0]);
> -	ULONG		SelectedMenuItem;
> +	ULONG	CustomBootMenuCount = sizeof(CustomBootMenuList) / sizeof(CustomBootMenuList[0]);
> +	ULONG	SelectedMenuItem;
>   
>   	if (!UiDisplayMenu("Please choose a boot method:",
>   	                   CustomBootMenuList,
> @@ -74,10 +74,11 @@
>   
>   VOID OptionMenuCustomBootDisk(VOID)
>   {
> -	CHAR	SectionName[100];
> -	CHAR	BootDriveString[20];
> -	ULONG	SectionId;
> +	ULONG_PTR	SectionId;
> +	CHAR		SectionName[100];
> +	CHAR		BootDriveString[20];
>   	TIMEINFO*	TimeInfo;
> +	OperatingSystemItem	OperatingSystem;
>   
>   	RtlZeroMemory(SectionName, sizeof(SectionName));
>   	RtlZeroMemory(BootDriveString, sizeof(BootDriveString));
> @@ -111,16 +112,21 @@
>   
>   	UiMessageBox(CustomBootPrompt);
>   
> -	LoadAndBootDrive(SectionName);
> +	OperatingSystem.SystemPartition = SectionName;
> +	OperatingSystem.LoadIdentifier  = NULL;
> +	OperatingSystem.OsLoadOptions   = NULL;
> +
> +	LoadAndBootDrive(&OperatingSystem, 0);
>   }
>   
>   VOID OptionMenuCustomBootPartition(VOID)
>   {
> -	CHAR	SectionName[100];
> -	CHAR	BootDriveString[20];
> -	CHAR	BootPartitionString[20];
> -	ULONG	SectionId;
> +	ULONG_PTR	SectionId;
> +	CHAR		SectionName[100];
> +	CHAR		BootDriveString[20];
> +	CHAR		BootPartitionString[20];
>   	TIMEINFO*	TimeInfo;
> +	OperatingSystemItem	OperatingSystem;
>   
>   	RtlZeroMemory(SectionName, sizeof(SectionName));
>   	RtlZeroMemory(BootDriveString, sizeof(BootDriveString));
> @@ -166,17 +172,22 @@
>   
>   	UiMessageBox(CustomBootPrompt);
>   
> -	LoadAndBootPartition(SectionName);
> +	OperatingSystem.SystemPartition = SectionName;
> +	OperatingSystem.LoadIdentifier  = NULL;
> +	OperatingSystem.OsLoadOptions   = NULL;
> +
> +	LoadAndBootPartition(&OperatingSystem, 0);
>   }
>   
>   VOID OptionMenuCustomBootBootSectorFile(VOID)
>   {
> -	CHAR	SectionName[100];
> -	CHAR	BootDriveString[20];
> -	CHAR	BootPartitionString[20];
> -	CHAR	BootSectorFileString[200];
> -	ULONG	SectionId;
> +	ULONG_PTR	SectionId;
> +	CHAR		SectionName[100];
> +	CHAR		BootDriveString[20];
> +	CHAR		BootPartitionString[20];
> +	CHAR		BootSectorFileString[200];
>   	TIMEINFO*	TimeInfo;
> +	OperatingSystemItem	OperatingSystem;
>   
>   	RtlZeroMemory(SectionName, sizeof(SectionName));
>   	RtlZeroMemory(BootDriveString, sizeof(BootDriveString));
> @@ -234,19 +245,24 @@
>   
>   	UiMessageBox(CustomBootPrompt);
>   
> -	LoadAndBootBootSector(SectionName);
> +	OperatingSystem.SystemPartition = SectionName;
> +	OperatingSystem.LoadIdentifier  = NULL;
> +	OperatingSystem.OsLoadOptions   = NULL;
> +
> +	LoadAndBootBootSector(&OperatingSystem, 0);
>   }
>   
>   VOID OptionMenuCustomBootLinux(VOID)
>   {
> -	CHAR	SectionName[100];
> -	CHAR	BootDriveString[20];
> -	CHAR	BootPartitionString[20];
> -	CHAR	LinuxKernelString[200];
> -	CHAR	LinuxInitrdString[200];
> -	CHAR	LinuxCommandLineString[200];
> -	ULONG	SectionId;
> +	ULONG_PTR	SectionId;
> +	CHAR		SectionName[100];
> +	CHAR		BootDriveString[20];
> +	CHAR		BootPartitionString[20];
> +	CHAR		LinuxKernelString[200];
> +	CHAR		LinuxInitrdString[200];
> +	CHAR		LinuxCommandLineString[200];
>   	TIMEINFO*	TimeInfo;
> +	OperatingSystemItem	OperatingSystem;
>   
>   	RtlZeroMemory(SectionName, sizeof(SectionName));
>   	RtlZeroMemory(BootDriveString, sizeof(BootDriveString));
> @@ -331,7 +347,11 @@
>   
>   	UiMessageBox(CustomBootPrompt);
>   
> -	LoadAndBootLinux(SectionName, "Custom Linux Setup");
> +	OperatingSystem.SystemPartition = SectionName;
> +	OperatingSystem.LoadIdentifier  = "Custom Linux Setup";
> +	OperatingSystem.OsLoadOptions   = NULL;
> +
> +	LoadAndBootLinux(&OperatingSystem, 0);
>   }
>   
>   VOID OptionMenuReboot(VOID)
>
> Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -19,21 +19,24 @@
>   
>   #include <freeldr.h>
>   
> -VOID LoadAndBootBootSector(PCSTR OperatingSystemName)
> +VOID
> +LoadAndBootBootSector(IN OperatingSystemItem* OperatingSystem,
> +                      IN USHORT OperatingSystemVersion)
>   {
> +	ULONG_PTR	SectionId;
> +	PCSTR	SectionName = OperatingSystem->SystemPartition;
> +	CHAR	FileName[260];
>   	PFILE	FilePointer;
> +	ULONG	BytesRead;
>   	CHAR	SettingName[80];
> -	ULONG	SectionId;
> -	CHAR	FileName[260];
> -	ULONG	BytesRead;
>   
>   	// Find all the message box settings and run them
> -	UiShowMessageBoxesInSection(OperatingSystemName);
> +	UiShowMessageBoxesInSection(SectionName);
>   
>   	// Try to open the operating system section in the .ini file
> -	if (!IniOpenSection(OperatingSystemName, &SectionId))
> -	{
> -		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
> +	if (!IniOpenSection(SectionName, &SectionId))
> +	{
> +		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", SectionName);
>   		UiMessageBox(SettingName);
>   		return;
>   	}
> @@ -79,22 +82,25 @@
>   	ChainLoadBiosBootSectorCode();
>   }
>   
> -VOID LoadAndBootPartition(PCSTR OperatingSystemName)
> +VOID
> +LoadAndBootPartition(IN OperatingSystemItem* OperatingSystem,
> +                     IN USHORT OperatingSystemVersion)
>   {
> +	ULONG_PTR		SectionId;
> +	PCSTR			SectionName = OperatingSystem->SystemPartition;
>   	CHAR			SettingName[80];
>   	CHAR			SettingValue[80];
> -	ULONG			SectionId;
>   	PARTITION_TABLE_ENTRY	PartitionTableEntry;
>   	UCHAR			DriveNumber;
>   	ULONG			PartitionNumber;
>   
>   	// Find all the message box settings and run them
> -	UiShowMessageBoxesInSection(OperatingSystemName);
> +	UiShowMessageBoxesInSection(SectionName);
>   
>   	// Try to open the operating system section in the .ini file
> -	if (!IniOpenSection(OperatingSystemName, &SectionId))
> -	{
> -		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
> +	if (!IniOpenSection(SectionName, &SectionId))
> +	{
> +		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", SectionName);
>   		UiMessageBox(SettingName);
>   		return;
>   	}
> @@ -151,20 +157,23 @@
>   	ChainLoadBiosBootSectorCode();
>   }
>   
> -VOID LoadAndBootDrive(PCSTR OperatingSystemName)
> +VOID
> +LoadAndBootDrive(IN OperatingSystemItem* OperatingSystem,
> +                 IN USHORT OperatingSystemVersion)
>   {
> +	ULONG_PTR	SectionId;
> +	PCSTR	SectionName = OperatingSystem->SystemPartition;
>   	CHAR	SettingName[80];
>   	CHAR	SettingValue[80];
> -	ULONG	SectionId;
>   	UCHAR	DriveNumber;
>   
>   	// Find all the message box settings and run them
> -	UiShowMessageBoxesInSection(OperatingSystemName);
> +	UiShowMessageBoxesInSection(SectionName);
>   
>   	// Try to open the operating system section in the .ini file
> -	if (!IniOpenSection(OperatingSystemName, &SectionId))
> -	{
> -		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
> +	if (!IniOpenSection(SectionName, &SectionId))
> +	{
> +		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", SectionName);
>   		UiMessageBox(SettingName);
>   		return;
>   	}
>
> Modified: trunk/reactos/boot/freeldr/freeldr/bootmgr.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/bootmgr.c?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/bootmgr.c [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/bootmgr.c [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -24,7 +24,90 @@
>   CHAR reactos_arc_hardware_data[HW_MAX_ARC_HEAP_SIZE] = {0};
>   CHAR reactos_arc_strings[32][256];
>   
> -ULONG	 GetDefaultOperatingSystem(OperatingSystemItem* OperatingSystemList, ULONG	 OperatingSystemCount)
> +typedef
> +VOID
> +(*OS_LOADING_METHOD)(IN OperatingSystemItem* OperatingSystem,
> +                     IN USHORT OperatingSystemVersion);
> +
> +struct
> +{
> +    CHAR BootType[80];
> +    USHORT OperatingSystemVersion;
> +    OS_LOADING_METHOD Load;
> +} OSLoadingMethods[] =
> +{
> +#ifdef FREELDR_REACTOS_SETUP
> +    {"ReactOSSetup", 0                , LoadReactOSSetup     },
> +#endif
> +
> +#ifdef _M_IX86
> +    {"BootSector"  , 0                , LoadAndBootBootSector},
> +    {"Drive"       , 0                , LoadAndBootDrive     },
> +    {"Partition"   , 0                , LoadAndBootPartition },
> +
> +    {"Linux"       , 0                , LoadAndBootLinux     },
> +
> +    {"Windows"     , 0                , LoadAndBootWindows   },
> +    {"WindowsNT40" , _WIN32_WINNT_NT4 , LoadAndBootWindows   },
> +#endif
> +    {"Windows2003" , _WIN32_WINNT_WS03, LoadAndBootWindows   },
> +
> +//  {"Not found"   , 0                , NULL                 }
> +};
> +
> +VOID LoadOperatingSystem(IN OperatingSystemItem* OperatingSystem)
> +{
> +    ULONG_PTR SectionId;
> +    PCSTR SectionName = OperatingSystem->SystemPartition;
> +    CHAR BootType[80];
> +    ULONG i;
> +
> +    // Try to open the operating system section in the .ini file
> +    if (IniOpenSection(SectionName, &SectionId))
> +    {
> +        // Try to read the boot type
> +        IniReadSettingByName(SectionId, "BootType", BootType, sizeof(BootType));
> +    }
> +    else
> +    {
> +        BootType[0] = ANSI_NULL;
> +    }
> +
> +    if (BootType[0] == ANSI_NULL && SectionName[0] != ANSI_NULL)
> +    {
> +        // Try to infere the boot type value
> +#ifdef _M_IX86
> +        ULONG FileId;
> +        if (ArcOpen((PSTR)SectionName, OpenReadOnly, &FileId) == ESUCCESS)
> +        {
> +            ArcClose(FileId);
> +            strcpy(BootType, "BootSector");
> +        }
> +        else
> +#endif
> +        {
> +            strcpy(BootType, "Windows");
> +        }
> +    }
> +
> +    // Install the drive mapper according to this section drive mappings
> +#if defined(_M_IX86) && !defined(_MSC_VER)
> +    DriveMapMapDrivesInSection(SectionName);
> +#endif
> +
> +    // Loop through the OS loading method table and find a suitable OS to boot
> +    for (i = 0; i < sizeof(OSLoadingMethods) / sizeof(OSLoadingMethods[0]); ++i)
> +    {
> +        if (_stricmp(BootType, OSLoadingMethods[i].BootType) == 0)
> +        {
> +            OSLoadingMethods[i].Load(OperatingSystem,
> +                                     OSLoadingMethods[i].OperatingSystemVersion);
> +            return;
> +        }
> +    }
> +}
> +
> +ULONG GetDefaultOperatingSystem(OperatingSystemItem* OperatingSystemList, ULONG OperatingSystemCount)
>   {
>   	CHAR	DefaultOSText[80];
>   	PCSTR	DefaultOSName;
> @@ -105,17 +188,14 @@
>   
>   VOID RunLoader(VOID)
>   {
> -	CHAR	SettingValue[80];
> -	CHAR BootType[80];
>   	ULONG_PTR	SectionId;
>   	ULONG		OperatingSystemCount;
>   	OperatingSystemItem*	OperatingSystemList;
> -	PCSTR	*OperatingSystemDisplayNames;
> -	PCSTR SectionName;
> -	ULONG	i;
> +	PCSTR*		OperatingSystemDisplayNames;
>   	ULONG		DefaultOperatingSystem;
>   	LONG		TimeOut;
>   	ULONG		SelectedOperatingSystem;
> +	ULONG	i;
>   
>   	// FIXME: if possible, only detect and register ARC devices...
>   	if (!MachHwDetect())
> @@ -206,78 +286,8 @@
>   
>   		TimeOut = -1;
>   
> -		// Try to open the operating system section in the .ini file
> -		SettingValue[0] = ANSI_NULL;
> -		SectionName = OperatingSystemList[SelectedOperatingSystem].SystemPartition;
> -		if (IniOpenSection(SectionName, &SectionId))
> -		{
> -			// Try to read the boot type
> -			IniReadSettingByName(SectionId, "BootType", BootType, sizeof(BootType));
> -		}
> -		else
> -			BootType[0] = ANSI_NULL;
> -
> -		if (BootType[0] == ANSI_NULL && SectionName[0] != ANSI_NULL)
> -		{
> -			// Try to infere boot type value
> -#ifdef _M_IX86
> -			ULONG FileId;
> -			if (ArcOpen((CHAR*)SectionName, OpenReadOnly, &FileId) == ESUCCESS)
> -			{
> -				ArcClose(FileId);
> -				strcpy(BootType, "BootSector");
> -			}
> -			else
> -#endif
> -			{
> -				strcpy(BootType, "Windows");
> -			}
> -		}
> -
> -		// Get OS setting value
> -		IniOpenSection("Operating Systems", &SectionId);
> -		IniReadSettingByName(SectionId, SectionName, SettingValue, sizeof(SettingValue));
> -
> -		// Install the drive mapper according to this sections drive mappings
> -#if defined(_M_IX86) && !defined(_MSC_VER)
> -		DriveMapMapDrivesInSection(SectionName);
> -#endif
> -
> -#ifdef FREELDR_REACTOS_SETUP
> -        // WinLdr-style boot
> -        LoadReactOSSetup();
> -#elif defined(_M_IX86)
> -		if (_stricmp(BootType, "Windows") == 0)
> -		{
> -			LoadAndBootWindows(SectionName, SettingValue, 0);
> -		}
> -		else if (_stricmp(BootType, "WindowsNT40") == 0)
> -		{
> -			LoadAndBootWindows(SectionName, SettingValue, _WIN32_WINNT_NT4);
> -		}
> -		else if (_stricmp(BootType, "Windows2003") == 0)
> -		{
> -			LoadAndBootWindows(SectionName, SettingValue, _WIN32_WINNT_WS03);
> -		}
> -		else if (_stricmp(BootType, "Linux") == 0)
> -		{
> -			LoadAndBootLinux(SectionName, OperatingSystemDisplayNames[SelectedOperatingSystem]);
> -		}
> -		else if (_stricmp(BootType, "BootSector") == 0)
> -		{
> -			LoadAndBootBootSector(SectionName);
> -		}
> -		else if (_stricmp(BootType, "Partition") == 0)
> -		{
> -			LoadAndBootPartition(SectionName);
> -		}
> -		else if (_stricmp(BootType, "Drive") == 0)
> -		{
> -			LoadAndBootDrive(SectionName);
> -		}
> -#else
> -		LoadAndBootWindows(SectionName, SettingValue, _WIN32_WINNT_WS03);
> -#endif
> +		// Load the chosen operating system
> +		LoadOperatingSystem(&OperatingSystemList[SelectedOperatingSystem]);
>   	}
>   
>   reboot:
>
> Modified: trunk/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -19,6 +19,12 @@
>   
>   #pragma once
>   
> -VOID	LoadAndBootBootSector(PCSTR OperatingSystemName);
> -VOID	LoadAndBootPartition(PCSTR OperatingSystemName);
> -VOID	LoadAndBootDrive(PCSTR OperatingSystemName);
> +VOID
> +LoadAndBootBootSector(IN OperatingSystemItem* OperatingSystem,
> +                      IN USHORT OperatingSystemVersion);
> +VOID
> +LoadAndBootPartition(IN OperatingSystemItem* OperatingSystem,
> +                     IN USHORT OperatingSystemVersion);
> +VOID
> +LoadAndBootDrive(IN OperatingSystemItem* OperatingSystem,
> +                 IN USHORT OperatingSystemVersion);
>
> Modified: trunk/reactos/boot/freeldr/freeldr/include/linux.h
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/include/linux.h?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/include/linux.h [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/include/linux.h [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -18,6 +18,7 @@
>    */
>   
>   #include <fs.h>
> +#include <oslist.h>
>   
>   #ifndef __LINUX_H
>   #define __LINUX_H
> @@ -129,7 +130,9 @@
>   VOID	BootNewLinuxKernel(VOID);				// Implemented in linux.S
>   VOID	BootOldLinuxKernel(ULONG KernelSize);		// Implemented in linux.S
>   
> -VOID	LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description);
> +VOID
> +LoadAndBootLinux(IN OperatingSystemItem* OperatingSystem,
> +                 IN USHORT OperatingSystemVersion);
>   
>   BOOLEAN	LinuxParseIniSection(PCSTR OperatingSystemName);
>   BOOLEAN	LinuxReadBootSector(PFILE LinuxKernelFile);
>
> Modified: trunk/reactos/boot/freeldr/freeldr/include/winldr.h
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/include/winldr.h?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/include/winldr.h [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/include/winldr.h [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -80,9 +80,8 @@
>   // ReactOS Loading Functions
>   //
>   ///////////////////////////////////////////////////////////////////////////////////////
> -VOID LoadAndBootWindows(PCSTR OperatingSystemName,
> -                        PSTR SettingsValue,
> -                        USHORT OperatingSystemVersion);
> +VOID LoadAndBootWindows(IN OperatingSystemItem* OperatingSystem,
> +                        IN USHORT OperatingSystemVersion);
>   
>   // conversion.c
>   PVOID VaToPa(PVOID Va);
> @@ -179,7 +178,9 @@
>       LPCSTR BootPath,
>       BOOLEAN Setup);
>   
> -VOID LoadReactOSSetup(VOID);
> +VOID
> +LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
> +                 IN USHORT OperatingSystemVersion);
>   
>   VOID
>   WinLdrSetupMachineDependent(PLOADER_PARAMETER_BLOCK LoaderBlock);
>
> Modified: trunk/reactos/boot/freeldr/freeldr/linuxboot.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/linuxboot.c?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/linuxboot.c [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/linuxboot.c [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -72,8 +72,12 @@
>   	return TRUE;
>   }
>   
> -VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description)
> -{
> +VOID
> +LoadAndBootLinux(IN OperatingSystemItem* OperatingSystem,
> +                 IN USHORT OperatingSystemVersion)
> +{
> +	PCSTR	SectionName = OperatingSystem->SystemPartition;
> +	PCSTR	Description = OperatingSystem->LoadIdentifier;
>   	PFILE	LinuxKernel = 0;
>   	PFILE	LinuxInitrdFile = 0;
>   	CHAR	TempString[260];
> @@ -93,7 +97,7 @@
>   	UiDrawProgressBarCenter(0, 100, LinuxBootDescription);
>   
>   	// Parse the .ini file section
> -	if (!LinuxParseIniSection(OperatingSystemName))
> +	if (!LinuxParseIniSection(SectionName))
>   	{
>   		goto LinuxBootFailed;
>   	}
> @@ -235,18 +239,18 @@
>   	LinuxCommandLineSize = 0;
>   }
>   
> -BOOLEAN LinuxParseIniSection(PCSTR OperatingSystemName)
> -{
> -	CHAR	SettingName[260];
> -	ULONG	SectionId;
> +BOOLEAN LinuxParseIniSection(PCSTR SectionName)
> +{
> +	ULONG_PTR	SectionId;
> +	CHAR		SettingName[260];
>   
>   	// Find all the message box settings and run them
> -	UiShowMessageBoxesInSection(OperatingSystemName);
> +	UiShowMessageBoxesInSection(SectionName);
>   
>   	// Try to open the operating system section in the .ini file
> -	if (!IniOpenSection(OperatingSystemName, &SectionId))
> -	{
> -		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", OperatingSystemName);
> +	if (!IniOpenSection(SectionName, &SectionId))
> +	{
> +		sprintf(SettingName, "Section [%s] not found in freeldr.ini.\n", SectionName);
>   		UiMessageBox(SettingName);
>   		return FALSE;
>   	}
>
> Modified: trunk/reactos/boot/freeldr/freeldr/windows/setupldr.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windows/setupldr.c?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/windows/setupldr.c [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/windows/setupldr.c [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -133,7 +133,9 @@
>       } while (InfFindNextLine(&InfContext, &InfContext));
>   }
>   
> -VOID LoadReactOSSetup(VOID)
> +VOID
> +LoadReactOSSetup(IN OperatingSystemItem* OperatingSystem,
> +                 IN USHORT OperatingSystemVersion)
>   {
>       CHAR FileName[512];
>       CHAR BootPath[512];
>
> Modified: trunk/reactos/boot/freeldr/freeldr/windows/winldr.c
> URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/windows/winldr.c?rev=57899&r1=57898&r2=57899&view=diff
> ==============================================================================
> --- trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] (original)
> +++ trunk/reactos/boot/freeldr/freeldr/windows/winldr.c [iso-8859-1] Thu Dec 13 00:46:55 2012
> @@ -456,22 +456,28 @@
>   }
>   
>   VOID
> -LoadAndBootWindows(PCSTR OperatingSystemName,
> -                   PSTR SettingsValue,
> -                   USHORT OperatingSystemVersion)
> -{
> +LoadAndBootWindows(IN OperatingSystemItem* OperatingSystem,
> +                   IN USHORT OperatingSystemVersion)
> +{
> +	ULONG_PTR SectionId;
> +	PCSTR SectionName = OperatingSystem->SystemPartition;
> +	CHAR  SettingsValue[80];
>   	BOOLEAN HasSection;
> -	char  BootPath[MAX_PATH];
> +	CHAR  BootPath[MAX_PATH];
>   	CHAR  FileName[MAX_PATH];
>   	CHAR  BootOptions[256];
>   	PCHAR File;
>   	BOOLEAN Status;
> -	ULONG_PTR SectionId;
>   	PLOADER_PARAMETER_BLOCK LoaderBlock;
> +
> +	// Get OS setting value
> +	SettingsValue[0] = ANSI_NULL;
> +	IniOpenSection("Operating Systems", &SectionId);
> +	IniReadSettingByName(SectionId, SectionName, SettingsValue, sizeof(SettingsValue));
>   
>   	// Open the operating system section
>   	// specified in the .ini file
> -	HasSection = IniOpenSection(OperatingSystemName, &SectionId);
> +	HasSection = IniOpenSection(SectionName, &SectionId);
>   
>   	UiDrawBackdrop();
>   	UiDrawProgressBarCenter(1, 100, "Loading NT...");
> @@ -480,7 +486,7 @@
>   	if (!HasSection ||
>   	    !IniReadSettingByName(SectionId, "SystemPath", BootPath, sizeof(BootPath)))
>   	{
> -		strcpy(BootPath, OperatingSystemName);
> +		strcpy(BootPath, SectionName);
>   	}
>   
>   	/* Special case for LiveCD */
> @@ -499,7 +505,7 @@
>   	if (!HasSection || !IniReadSettingByName(SectionId, "Options", BootOptions, sizeof(BootOptions)))
>   	{
>   		/* Get options after the title */
> -		const CHAR*p = SettingsValue;
> +		PCSTR p = SettingsValue;
>   		while (*p == ' ' || *p == '"')
>   			p++;
>   		while (*p != '\0' && *p != '"')
>
>




More information about the Ros-dev mailing list