From 4ca76581f99a008d91d8e8a3b10b80be6cc118be Mon Sep 17 00:00:00 2001
From: srs5694
Date: Tue, 18 Dec 2012 23:15:38 -0500
Subject: [PATCH] Identify ReiserFS for main screen. Further tweaks to graphics
mode-setting code.
---
docs/refind/getting.html | 4 +-
libeg/screen.c | 2 +
refind/lib.c | 94 +++++++++++++++++++++++-----------------
refind/main.c | 6 +--
refind/menu.c | 6 ++-
5 files changed, 65 insertions(+), 47 deletions(-)
diff --git a/docs/refind/getting.html b/docs/refind/getting.html
index 884c8ea..4d81329 100644
--- a/docs/refind/getting.html
+++ b/docs/refind/getting.html
@@ -15,7 +15,7 @@
href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com
Originally written: 3/14/2012; last Web page update:
-12/16/2012, referencing rEFInd 0.6.0
+12/18/2012, referencing rEFInd 0.6.0
I'm a technical writer and consultant specializing in Linux technologies. This Web page is provided free of charge and with no annoying outside ads; however, I did take time to prepare it, and Web hosting does cost money. If you find this Web page useful, please consider making a small donation to help keep this site up and running. Thanks!
@@ -131,7 +131,7 @@ href="mailto:rodsmith@rodsbooks.com">rodsmith@rodsbooks.com
either build.)
-->
-
+
A
diff --git a/libeg/screen.c b/libeg/screen.c
index bb55c08..8200438 100644
--- a/libeg/screen.c
+++ b/libeg/screen.c
@@ -122,6 +122,8 @@ BOOLEAN egSetScreenSize(IN OUT UINTN *ScreenWidth, IN OUT UINTN *ScreenHeight) {
if (*ScreenHeight == 0) { // User specified a mode number (stored in *ScreenWidth); use it directly
if (*ScreenWidth == GraphicsOutput->Mode->Mode) { // user requested current mode; do nothing
ModeSet = TRUE;
+ *ScreenWidth = Info->HorizontalResolution;
+ *ScreenHeight = Info->VerticalResolution;
} else {
ModeNum = (UINT32) *ScreenWidth;
Status = refit_call4_wrapper(GraphicsOutput->QueryMode, GraphicsOutput, ModeNum, &Size, &Info);
diff --git a/refind/lib.c b/refind/lib.c
index 91a409b..048b301 100644
--- a/refind/lib.c
+++ b/refind/lib.c
@@ -69,7 +69,7 @@ EFI_DEVICE_PATH EndDevicePath[] = {
#define EXT2_SUPER_MAGIC 0xEF53
#define HFSPLUS_MAGIC1 0x2B48
#define HFSPLUS_MAGIC2 0x5848
-#define REISERFS_SUPER_MAGIC 0x52654973
+#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs"
#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"
@@ -88,6 +88,10 @@ UINTN VolumesCount = 0;
// Maximum size for disk sectors
#define SECTOR_SIZE 4096
+// Number of bytes to read from a partition to determine its filesystem type
+// and identify its boot loader, and hence probable BIOS-mode OS installation
+#define SAMPLE_SIZE 69632 /* 68 KiB -- ReiserFS superblock begins at 64 KiB */
+
// Default names for volume badges (mini-icon to define disk type) and icons
#define VOLUME_BADGE_NAME L".VolumeBadge.icns"
#define VOLUME_ICON_NAME L".VolumeIcon.icns"
@@ -420,9 +424,16 @@ static UINT32 IdentifyFilesystemType(IN UINT8 *Buffer, IN UINTN BufferSize) {
UINT32 FoundType = FS_TYPE_UNKNOWN;
UINT32 *Ext2Incompat, *Ext2Compat;
UINT16 *Magic16;
+ char *MagicString;
if (Buffer != NULL) {
+ if (BufferSize >= 512) {
+ Magic16 = (UINT16*) (Buffer + 510);
+ if (*Magic16 == FAT_MAGIC)
+ return FS_TYPE_FAT;
+ } // search for FAT magic
+
if (BufferSize >= (1024 + 100)) {
Magic16 = (UINT16*) (Buffer + 1024 + 56);
if (*Magic16 == EXT2_SUPER_MAGIC) { // ext2/3/4
@@ -438,11 +449,14 @@ static UINT32 IdentifyFilesystemType(IN UINT8 *Buffer, IN UINTN BufferSize) {
}
} // search for ext2/3/4 magic
- if (BufferSize >= 512) {
- Magic16 = (UINT16*) (Buffer + 510);
- if (*Magic16 == FAT_MAGIC)
- return FS_TYPE_FAT;
- } // search for FAT magic
+ if (BufferSize >= (65536 + 62)) {
+ MagicString = (char*) (Buffer + 65536 + 52);
+ if ((CompareMem(MagicString, REISERFS_SUPER_MAGIC_STRING, 8) == 0) ||
+ (CompareMem(MagicString, REISER2FS_SUPER_MAGIC_STRING, 9) == 0) ||
+ (CompareMem(MagicString, REISER2FS_JR_SUPER_MAGIC_STRING, 9) == 0)) {
+ return FS_TYPE_REISERFS;
+ } // if
+ } // search for ReiserFS magic
if (BufferSize >= (1024 + 2)) {
Magic16 = (UINT16*) (Buffer + 1024);
@@ -458,7 +472,7 @@ static UINT32 IdentifyFilesystemType(IN UINT8 *Buffer, IN UINTN BufferSize) {
static VOID ScanVolumeBootcode(IN OUT REFIT_VOLUME *Volume, OUT BOOLEAN *Bootable)
{
EFI_STATUS Status;
- UINT8 SectorBuffer[SECTOR_SIZE];
+ UINT8 Buffer[SAMPLE_SIZE];
UINTN i;
MBR_PARTITION_INFO *MbrTable;
BOOLEAN MbrTableFound;
@@ -470,98 +484,98 @@ static VOID ScanVolumeBootcode(IN OUT REFIT_VOLUME *Volume, OUT BOOLEAN *Bootabl
if (Volume->BlockIO == NULL)
return;
- if (Volume->BlockIO->Media->BlockSize > SECTOR_SIZE)
+ if (Volume->BlockIO->Media->BlockSize > SAMPLE_SIZE)
return; // our buffer is too small...
// look at the boot sector (this is used for both hard disks and El Torito images!)
Status = refit_call5_wrapper(Volume->BlockIO->ReadBlocks,
Volume->BlockIO, Volume->BlockIO->Media->MediaId,
- Volume->BlockIOOffset, SECTOR_SIZE, SectorBuffer);
+ Volume->BlockIOOffset, SAMPLE_SIZE, Buffer);
if (!EFI_ERROR(Status)) {
- Volume->FSType = IdentifyFilesystemType(SectorBuffer, SECTOR_SIZE);
- if (*((UINT16 *)(SectorBuffer + 510)) == 0xaa55 && SectorBuffer[0] != 0) {
+ Volume->FSType = IdentifyFilesystemType(Buffer, SAMPLE_SIZE);
+ if (*((UINT16 *)(Buffer + 510)) == 0xaa55 && Buffer[0] != 0) {
*Bootable = TRUE;
Volume->HasBootCode = TRUE;
}
// detect specific boot codes
- if (CompareMem(SectorBuffer + 2, "LILO", 4) == 0 ||
- CompareMem(SectorBuffer + 6, "LILO", 4) == 0 ||
- CompareMem(SectorBuffer + 3, "SYSLINUX", 8) == 0 ||
- FindMem(SectorBuffer, SECTOR_SIZE, "ISOLINUX", 8) >= 0) {
+ if (CompareMem(Buffer + 2, "LILO", 4) == 0 ||
+ CompareMem(Buffer + 6, "LILO", 4) == 0 ||
+ CompareMem(Buffer + 3, "SYSLINUX", 8) == 0 ||
+ FindMem(Buffer, SECTOR_SIZE, "ISOLINUX", 8) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"linux";
Volume->OSName = L"Linux";
- } else if (FindMem(SectorBuffer, 512, "Geom\0Hard Disk\0Read\0 Error", 26) >= 0) { // GRUB
+ } else if (FindMem(Buffer, 512, "Geom\0Hard Disk\0Read\0 Error", 26) >= 0) { // GRUB
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"grub,linux";
Volume->OSName = L"Linux";
// // Below doesn't produce a bootable entry, so commented out for the moment....
// // GRUB in BIOS boot partition:
-// } else if (FindMem(SectorBuffer, 512, "Geom\0Read\0 Error", 16) >= 0) {
+// } else if (FindMem(Buffer, 512, "Geom\0Read\0 Error", 16) >= 0) {
// Volume->HasBootCode = TRUE;
// Volume->OSIconName = L"grub,linux";
// Volume->OSName = L"Linux";
// Volume->VolName = L"BIOS Boot Partition";
// *Bootable = TRUE;
- } else if ((*((UINT32 *)(SectorBuffer + 502)) == 0 &&
- *((UINT32 *)(SectorBuffer + 506)) == 50000 &&
- *((UINT16 *)(SectorBuffer + 510)) == 0xaa55) ||
- FindMem(SectorBuffer, SECTOR_SIZE, "Starting the BTX loader", 23) >= 0) {
+ } else if ((*((UINT32 *)(Buffer + 502)) == 0 &&
+ *((UINT32 *)(Buffer + 506)) == 50000 &&
+ *((UINT16 *)(Buffer + 510)) == 0xaa55) ||
+ FindMem(Buffer, SECTOR_SIZE, "Starting the BTX loader", 23) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"freebsd";
Volume->OSName = L"FreeBSD";
- } else if (FindMem(SectorBuffer, 512, "!Loading", 8) >= 0 ||
- FindMem(SectorBuffer, SECTOR_SIZE, "/cdboot\0/CDBOOT\0", 16) >= 0) {
+ } else if (FindMem(Buffer, 512, "!Loading", 8) >= 0 ||
+ FindMem(Buffer, SECTOR_SIZE, "/cdboot\0/CDBOOT\0", 16) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"openbsd";
Volume->OSName = L"OpenBSD";
- } else if (FindMem(SectorBuffer, 512, "Not a bootxx image", 18) >= 0 ||
- *((UINT32 *)(SectorBuffer + 1028)) == 0x7886b6d1) {
+ } else if (FindMem(Buffer, 512, "Not a bootxx image", 18) >= 0 ||
+ *((UINT32 *)(Buffer + 1028)) == 0x7886b6d1) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"netbsd";
Volume->OSName = L"NetBSD";
- } else if (FindMem(SectorBuffer, SECTOR_SIZE, "NTLDR", 5) >= 0) {
+ } else if (FindMem(Buffer, SECTOR_SIZE, "NTLDR", 5) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"win";
Volume->OSName = L"Windows";
- } else if (FindMem(SectorBuffer, SECTOR_SIZE, "BOOTMGR", 7) >= 0) {
+ } else if (FindMem(Buffer, SECTOR_SIZE, "BOOTMGR", 7) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"winvista,win";
Volume->OSName = L"Windows";
- } else if (FindMem(SectorBuffer, 512, "CPUBOOT SYS", 11) >= 0 ||
- FindMem(SectorBuffer, 512, "KERNEL SYS", 11) >= 0) {
+ } else if (FindMem(Buffer, 512, "CPUBOOT SYS", 11) >= 0 ||
+ FindMem(Buffer, 512, "KERNEL SYS", 11) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"freedos";
Volume->OSName = L"FreeDOS";
- } else if (FindMem(SectorBuffer, 512, "OS2LDR", 6) >= 0 ||
- FindMem(SectorBuffer, 512, "OS2BOOT", 7) >= 0) {
+ } else if (FindMem(Buffer, 512, "OS2LDR", 6) >= 0 ||
+ FindMem(Buffer, 512, "OS2BOOT", 7) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"ecomstation";
Volume->OSName = L"eComStation";
- } else if (FindMem(SectorBuffer, 512, "Be Boot Loader", 14) >= 0) {
+ } else if (FindMem(Buffer, 512, "Be Boot Loader", 14) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"beos";
Volume->OSName = L"BeOS";
- } else if (FindMem(SectorBuffer, 512, "yT Boot Loader", 14) >= 0) {
+ } else if (FindMem(Buffer, 512, "yT Boot Loader", 14) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"zeta,beos";
Volume->OSName = L"ZETA";
- } else if (FindMem(SectorBuffer, 512, "\x04" "beos\x06" "system\x05" "zbeos", 18) >= 0 ||
- FindMem(SectorBuffer, 512, "\x06" "system\x0c" "haiku_loader", 20) >= 0) {
+ } else if (FindMem(Buffer, 512, "\x04" "beos\x06" "system\x05" "zbeos", 18) >= 0 ||
+ FindMem(Buffer, 512, "\x06" "system\x0c" "haiku_loader", 20) >= 0) {
Volume->HasBootCode = TRUE;
Volume->OSIconName = L"haiku,beos";
Volume->OSName = L"Haiku";
@@ -578,21 +592,21 @@ static VOID ScanVolumeBootcode(IN OUT REFIT_VOLUME *Volume, OUT BOOLEAN *Bootabl
#endif
// dummy FAT boot sector (created by OS X's newfs_msdos)
- if (FindMem(SectorBuffer, 512, "Non-system disk", 15) >= 0)
+ if (FindMem(Buffer, 512, "Non-system disk", 15) >= 0)
Volume->HasBootCode = FALSE;
// dummy FAT boot sector (created by Linux's mkdosfs)
- if (FindMem(SectorBuffer, 512, "This is not a bootable disk", 27) >= 0)
+ if (FindMem(Buffer, 512, "This is not a bootable disk", 27) >= 0)
Volume->HasBootCode = FALSE;
// dummy FAT boot sector (created by Windows)
- if (FindMem(SectorBuffer, 512, "Press any key to restart", 24) >= 0)
+ if (FindMem(Buffer, 512, "Press any key to restart", 24) >= 0)
Volume->HasBootCode = FALSE;
// check for MBR partition table
- if (*((UINT16 *)(SectorBuffer + 510)) == 0xaa55) {
+ if (*((UINT16 *)(Buffer + 510)) == 0xaa55) {
MbrTableFound = FALSE;
- MbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446);
+ MbrTable = (MBR_PARTITION_INFO *)(Buffer + 446);
for (i = 0; i < 4; i++)
if (MbrTable[i].StartLBA && MbrTable[i].Size)
MbrTableFound = TRUE;
diff --git a/refind/main.c b/refind/main.c
index ea8c337..011489b 100644
--- a/refind/main.c
+++ b/refind/main.c
@@ -63,10 +63,10 @@
#define MACOSX_LOADER_PATH L"System\\Library\\CoreServices\\boot.efi"
#if defined (EFIX64)
-#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shellx64.efi"
+#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\EFI\\tools\\shellx64.efi,\\shellx64.efi"
#define DRIVER_DIRS L"drivers,drivers_x64"
#elif defined (EFI32)
-#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\shellia32.efi"
+#define SHELL_NAMES L"\\EFI\\tools\\shell.efi,\\EFI\\tools\shellia32.efi,\\shellia32.efi"
#define DRIVER_DIRS L"drivers,drivers_ia32"
#else
#define SHELL_NAMES L"\\EFI\\tools\\shell.efi"
@@ -118,7 +118,7 @@ static VOID AboutrEFInd(VOID)
if (AboutMenu.EntryCount == 0) {
AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
- AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.0.1");
+ AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.0.2");
AddMenuInfoLine(&AboutMenu, L"");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith");
diff --git a/refind/menu.c b/refind/menu.c
index 7579978..ec54eb1 100644
--- a/refind/menu.c
+++ b/refind/menu.c
@@ -603,10 +603,12 @@ static VOID TextMenuStyle(IN REFIT_MENU_SCREEN *Screen, IN SCROLL_STATE *State,
case MENU_FUNCTION_PAINT_SELECTION:
// redraw selection cursor
- refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, 2, MenuPosY + (State->PreviousSelection - State->FirstVisible));
+ refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, 2,
+ MenuPosY + (State->PreviousSelection - State->FirstVisible));
refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_CHOICE_BASIC);
refit_call2_wrapper(ST->ConOut->OutputString, ST->ConOut, DisplayStrings[State->PreviousSelection]);
- refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, 2, MenuPosY + (State->CurrentSelection - State->FirstVisible));
+ refit_call3_wrapper(ST->ConOut->SetCursorPosition, ST->ConOut, 2,
+ MenuPosY + (State->CurrentSelection - State->FirstVisible));
refit_call2_wrapper(ST->ConOut->SetAttribute, ST->ConOut, ATTR_CHOICE_CURRENT);
refit_call2_wrapper(ST->ConOut->OutputString, ST->ConOut, DisplayStrings[State->CurrentSelection]);
break;
--
2.39.2