3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
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.
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.
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.
22 #define TAG_STRING ' rtS'
23 #define TAG_OS_ITEM 'tISO'
25 static PCSTR
CopyString(PCSTR Source
)
31 Dest
= FrLdrHeapAlloc(strlen(Source
) + 1, TAG_STRING
);
40 OperatingSystemItem
* InitOperatingSystemList(ULONG
* OperatingSystemCountPointer
)
43 CHAR SettingName
[260];
44 CHAR SettingValue
[260];
46 PCHAR TitleStart
, TitleEnd
;
49 OperatingSystemItem
* Items
;
52 // Open the [FreeLoader] section
54 if (!IniOpenSection("Operating Systems", &SectionId
))
60 // Count number of operating systems in the section
62 Count
= IniGetNumSectionItems(SectionId
);
65 // Allocate memory to hold operating system lists
67 Items
= FrLdrHeapAlloc(Count
* sizeof(OperatingSystemItem
), TAG_OS_ITEM
);
74 // Now loop through and read the operating system section and display names
76 for (Idx
= 0; Idx
< Count
; Idx
++)
78 IniReadSettingByNumber(SectionId
, Idx
, SettingName
, sizeof(SettingName
), SettingValue
, sizeof(SettingValue
));
81 // Search start and end of the title
84 TitleStart
= SettingValue
;
85 while (*TitleStart
== ' ' || *TitleStart
== '"')
87 TitleEnd
= TitleStart
;
88 if (*TitleEnd
!= ANSI_NULL
)
90 while (*TitleEnd
!= ANSI_NULL
&& *TitleEnd
!= '"')
92 if (*TitleEnd
!= ANSI_NULL
)
94 *TitleEnd
= ANSI_NULL
;
95 OsLoadOptions
= TitleEnd
+ 1;
99 // Copy the system partition, identifier and options
101 Items
[Idx
].SystemPartition
= CopyString(SettingName
);
102 Items
[Idx
].LoadIdentifier
= CopyString(TitleStart
);
103 Items
[Idx
].OsLoadOptions
= CopyString(OsLoadOptions
);
109 *OperatingSystemCountPointer
= Count
;