+// Add a Linux kernel as a submenu entry for another (pre-existing) Linux kernel entry.
+static VOID AddKernelToSubmenu(LOADER_ENTRY * TargetLoader, CHAR16 *FileName, REFIT_VOLUME *Volume) {
+ REFIT_FILE *File;
+ CHAR16 **TokenList = NULL, *InitrdName, *SubmenuName = NULL, *VolName = NULL, *Path = NULL, *Title;
+ REFIT_MENU_SCREEN *SubScreen;
+ LOADER_ENTRY *SubEntry;
+ UINTN TokenCount;
+
+ File = ReadLinuxOptionsFile(TargetLoader->LoaderPath, Volume);
+ if (File != NULL) {
+ SubScreen = TargetLoader->me.SubScreen;
+ InitrdName = FindInitrd(FileName, Volume);
+ while ((TokenCount = ReadTokenLine(File, &TokenList)) > 1) {
+ SubEntry = InitializeLoaderEntry(TargetLoader);
+ SplitPathName(FileName, &VolName, &Path, &SubmenuName);
+ MyFreePool(VolName);
+ MyFreePool(Path);
+ MergeStrings(&SubmenuName, L": ", '\0');
+ MergeStrings(&SubmenuName, TokenList[0] ? StrDuplicate(TokenList[0]) : StrDuplicate(L"Boot Linux"), '\0');
+ Title = StrDuplicate(SubmenuName);
+ SubEntry->me.Title = Title;
+ MyFreePool(SubEntry->LoadOptions);
+ SubEntry->LoadOptions = AddInitrdToOptions(TokenList[1], InitrdName);
+ MyFreePool(SubEntry->LoaderPath);
+ SubEntry->LoaderPath = StrDuplicate(FileName);
+ CleanUpPathNameSlashes(SubEntry->LoaderPath);
+ SubEntry->DevicePath = FileDevicePath(Volume->DeviceHandle, SubEntry->LoaderPath);
+ FreeTokenLine(&TokenList, &TokenCount);
+ SubEntry->UseGraphicsMode = GlobalConfig.GraphicsFor & GRAPHICS_FOR_LINUX;
+ AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry);
+ } // while
+ MyFreePool(SubmenuName);
+ MyFreePool(InitrdName);
+ MyFreePool(File);
+ } // if
+} // static VOID AddKernelToSubmenu()
+