X-Git-Url: https://code.delx.au/refind/blobdiff_plain/b72a91c9b51a3c6761db777f3e2818d240adf62e..43cec5357ceb29fc3618ebeea3d1a0a6bb067d53:/refind/lib.c diff --git a/refind/lib.c b/refind/lib.c index d0262c1..d0af83b 100644 --- a/refind/lib.c +++ b/refind/lib.c @@ -73,6 +73,7 @@ EFI_DEVICE_PATH EndDevicePath[] = { #define REISERFS_SUPER_MAGIC_STRING "ReIsErFs" #define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" #define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" +#define BTRFS_SIGNATURE "_BHRfS_M" // variables @@ -407,6 +408,9 @@ static CHAR16 *FSTypeName(IN UINT32 TypeCode) { case FS_TYPE_REISERFS: retval = L" ReiserFS"; break; + case FS_TYPE_BTRFS: + retval = L" Btrfs"; + break; case FS_TYPE_ISO9660: retval = L" ISO-9660"; break; @@ -458,6 +462,12 @@ static UINT32 IdentifyFilesystemType(IN UINT8 *Buffer, IN UINTN BufferSize) { } // if } // search for ReiserFS magic + if (BufferSize >= (65536 + 64 + 8)) { + MagicString = (char*) (Buffer + 65536 + 64); + if (CompareMem(MagicString, BTRFS_SIGNATURE, 8) == 0) + return FS_TYPE_BTRFS; + } // search for Btrfs magic + if (BufferSize >= (1024 + 2)) { Magic16 = (UINT16*) (Buffer + 1024); if ((*Magic16 == HFSPLUS_MAGIC1) || (*Magic16 == HFSPLUS_MAGIC2)) { @@ -467,7 +477,7 @@ static UINT32 IdentifyFilesystemType(IN UINT8 *Buffer, IN UINTN BufferSize) { } // if (Buffer != NULL) return FoundType; -} +} // UINT32 IdentifyFilesystemType() static VOID ScanVolumeBootcode(REFIT_VOLUME *Volume, BOOLEAN *Bootable) { @@ -626,21 +636,27 @@ static VOID ScanVolumeBootcode(REFIT_VOLUME *Volume, BOOLEAN *Bootable) } } /* VOID ScanVolumeBootcode() */ -// default volume badge icon based on disk kind -static VOID ScanVolumeDefaultIcon(IN OUT REFIT_VOLUME *Volume) +// Set default volume badge icon based on /.VolumeBadge.{icns|png} file or disk kind +static VOID SetVolumeBadgeIcon(IN OUT REFIT_VOLUME *Volume) { - switch (Volume->DiskKind) { - case DISK_KIND_INTERNAL: - Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_INTERNAL); - break; - case DISK_KIND_EXTERNAL: - Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_EXTERNAL); - break; - case DISK_KIND_OPTICAL: - Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_OPTICAL); - break; - } // switch() -} + if (Volume->VolBadgeImage == NULL) { + Volume->VolBadgeImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeBadge", 128); + } + + if (Volume->VolBadgeImage == NULL) { + switch (Volume->DiskKind) { + case DISK_KIND_INTERNAL: + Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_INTERNAL); + break; + case DISK_KIND_EXTERNAL: + Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_EXTERNAL); + break; + case DISK_KIND_OPTICAL: + Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_OPTICAL); + break; + } // switch() + } +} // VOID SetVolumeBadgeIcon() // Return a string representing the input size in IEEE-1541 units. // The calling function is responsible for freeing the allocated memory. @@ -834,9 +850,6 @@ VOID ScanVolume(REFIT_VOLUME *Volume) Volume->HasBootCode = FALSE; } - // default volume icon based on disk kind - ScanVolumeDefaultIcon(Volume); - // open the root directory of the volume Volume->RootDir = LibOpenRoot(Volume->DeviceHandle); if (Volume->RootDir == NULL) { @@ -848,9 +861,10 @@ VOID ScanVolume(REFIT_VOLUME *Volume) Volume->VolName = GetVolumeName(Volume); - // get custom volume icon if present - if (!Volume->VolBadgeImage) - Volume->VolBadgeImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeBadge", 32); + // Set volume icon based on .VolumeBadge icon or disk kind + SetVolumeBadgeIcon(Volume); + + // get custom volume icons if present if (!Volume->VolIconImage) Volume->VolIconImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeIcon", 128); } // ScanVolume() @@ -908,7 +922,7 @@ static VOID ScanExtendedPartition(REFIT_VOLUME *WholeDiskVolume, MBR_PARTITION_I if (!Bootable) Volume->HasBootCode = FALSE; - ScanVolumeDefaultIcon(Volume); + SetVolumeBadgeIcon(Volume); AddListElement((VOID ***) &Volumes, &VolumesCount, Volume); @@ -1429,7 +1443,7 @@ VOID MergeStrings(IN OUT CHAR16 **First, IN CHAR16 *Second, CHAR16 AddChar) { CHAR16 *FindExtension(IN CHAR16 *Path) { CHAR16 *Extension; BOOLEAN Found = FALSE, FoundSlash = FALSE; - UINTN i; + INTN i; Extension = AllocateZeroPool(sizeof(CHAR16)); if (Path) {