<p>The biggest drawback to this approach is that you won't be able to edit the rEFInd configuration file or move rEFInd-related binaries from an EFI shell if you install it in this way, since Apple's HFS+ driver for EFI is read-only. (The same is true of rEFInd's HFS+ driver, so it won't help you overcome this limitation.) You may also be limited in making changes to your rEFInd configuration from Linux or other OSes, too, since Linux's HFS+ drivers disable write support by default on volumes with an active journal. You can force write access by using the <tt>force</tt> option to <tt>mount</tt>; however, this procedure is noted as being risky in the Linux HFS+ documentation, so I don't recommend doing this on a regular basis. As a compromise, you might try creating a small non-journaled HFS+ volume that's dedicated to holding rEFInd. You could even mount it as the Linux <tt>/boot</tt> partition, in which case it would also hold the Linux kernel and related files. You'll need to install rEFInd manually if you try this.</p>
+<p>A variant of this solution is suggested in <a href="http://www.sparxeng.com/blog/software/fixing-slow-boot-on-a-triple-boot-mountain-lion-mac">this blog post,</a> which recommends placing rEFInd on an HFS+ volume on the first SATA channel. (In the blogger's case, that channel used to hold an optical drive, but that drive was replaced by a hard disk.)</p>
+
<a name="fallback">
<h3>Using the Fallback Filename</h3>
</a>
if (AboutMenu.EntryCount == 0) {
AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
- AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.7.3");
+ AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.7.3.4");
AddMenuInfoLine(&AboutMenu, L"");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2013 Roderick W. Smith");
CHAR8 Header[512];
UINTN Size = sizeof(Header);
+ if ((RootDir == NULL) || (FileName == NULL)) {
+ // Assume valid here, because Macs produce NULL RootDir (& maybe FileName)
+ // when launching from a Firewire drive. This should be handled better, but
+ // fix would have to be in StartEFIImageList() and/or in FindVolumeAndFilename().
+ return TRUE;
+ } // if
+
Status = refit_call5_wrapper(RootDir->Open, RootDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
if (EFI_ERROR(Status))
- return 0;
+ return FALSE;
Status = refit_call3_wrapper(FileHandle->Read, FileHandle, &Size, Header);
refit_call1_wrapper(FileHandle->Close, FileHandle);
for (DevicePathIndex = 0; DevicePaths[DevicePathIndex] != NULL; DevicePathIndex++) {
FindVolumeAndFilename(DevicePaths[DevicePathIndex], &Volume, &Filename);
// Some EFIs crash if attempting to load driver for invalid architecture, so
- // protect for this condition....
- if ((LoaderType == TYPE_LEGACY) || IsValidLoader(Volume->RootDir, Filename)) {
+ // protect for this condition; but sometimes Volume comes back NULL, so provide
+ // an exception. (TODO: Handle this special condition better.)
+ if ((LoaderType == TYPE_LEGACY) || (Volume == NULL) || IsValidLoader(Volume->RootDir, Filename)) {
// NOTE: Below commented-out line could be more efficient if file were read ahead of
// time and passed as a pre-loaded image to LoadImage(), but it doesn't work on my
// 32-bit Mac Mini or my 64-bit Intel box when launching a Linux kernel; the