/* * refit/lib.h * General header file * * Copyright (c) 2006-2009 Christoph Pfisterer * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * * Neither the name of Christoph Pfisterer nor the names of the * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __REFITLIB_STANDARD_H__ #define __REFITLIB_STANDARD_H__ /* - ADVLOG: Thu Aug 4 18:14:19 2016 Add log routine line separator. - LODEPNG: Thu Aug 4 18:14:19 2016 Size matter, screenshot as PNG instead of BMP. - ANDX86: Mon Aug 8 04:07:13 2016 Scan grubx64 (Remix, Phoenix, & Chrome OS). Tested with 64bit only & live USB. Build with "-D ANDX86". http://www.jide.com/remixos http://www.phoenixos.com https://www.chromium.org/chromium-os */ // Experimental <-- #include "../libeg/libeg.h" #ifdef __cplusplus #include "../cpp_foundation/XObjArray.h" #include "../cpp_foundation/XString.h" #include "../libeg/XTheme.h" extern XTheme ThemeX; //global variable defined in lib.cpp #endif #define REFIT_DEBUG (2) #ifdef __cplusplus extern "C" { #endif #include #ifdef __cplusplus } #endif // // lib module // #define DISK_KIND_INTERNAL (0) #define DISK_KIND_EXTERNAL (1) #define DISK_KIND_OPTICAL (2) #define DISK_KIND_FIREWIRE (3) #define DISK_KIND_NODISK (4) #define DISK_KIND_BOOTER (5) #define BOOTING_BY_BOOTLOADER (1) #define BOOTING_BY_EFI (2) #define BOOTING_BY_BOOTEFI (3) #define BOOTING_BY_MBR (4) #define BOOTING_BY_PBR (5) #define BOOTING_BY_CD (6) #define OSTYPE_OSX (1) #define OSTYPE_WIN (2) #define OSTYPE_VAR (3) #define OSTYPE_LIN (4) #define OSTYPE_LINEFI (5) #define OSTYPE_EFI (6) #define OSTYPE_WINEFI (7) //#define OSTYPE_BOOT_OSX (9) #define OSTYPE_RECOVERY (10) #define OSTYPE_OSX_INSTALLER (11) /*#define OSTYPE_TIGER (14) #define OSTYPE_LEO (15) #define OSTYPE_SNOW (16) #define OSTYPE_LION (17) #define OSTYPE_ML (18) #define OSTYPE_MAV (19)*/ #define OSTYPE_OTHER (99) //#define OSTYPE_HIDE (100) #define OSTYPE_IS_OSX(type) ((type == OSTYPE_OSX) /*|| (type == OSTYPE_BOOT_OSX) || ((type >= OSTYPE_TIGER) && (type <= OSTYPE_MAV))*/ || (type == OSTYPE_VAR)) #define OSTYPE_IS_OSX_RECOVERY(type) ((type == OSTYPE_RECOVERY) /*|| ((type >= OSTYPE_TIGER) && (type <= OSTYPE_MAV))*/ || (type == OSTYPE_VAR)) #define OSTYPE_IS_OSX_INSTALLER(type) ((type == OSTYPE_OSX_INSTALLER) /*|| ((type >= OSTYPE_TIGER) && (type <= OSTYPE_MAV))*/ || (type == OSTYPE_VAR)) #define OSTYPE_IS_WINDOWS(type) ((type == OSTYPE_WIN) || (type == OSTYPE_WINEFI) || (type == OSTYPE_EFI) || (type == OSTYPE_VAR)) #define OSTYPE_IS_LINUX(type) ((type == OSTYPE_LIN) || (type == OSTYPE_EFI) || (type == OSTYPE_VAR)) #define OSTYPE_IS_OTHER(type) ((type == OSTYPE_OTHER) || (type == OSTYPE_EFI) || (type == OSTYPE_VAR)) #define OSTYPE_COMPARE_IMP(comparator, type1, type2) (comparator(type1) && comparator(type2)) #define OSTYPE_COMPARE(type1, type2) (OSTYPE_COMPARE_IMP(OSTYPE_IS_OSX, type1, type2) || OSTYPE_COMPARE_IMP(OSTYPE_IS_OSX_RECOVERY, type1, type2) || \ OSTYPE_COMPARE_IMP(OSTYPE_IS_OSX_INSTALLER, type1, type2) || OSTYPE_COMPARE_IMP(OSTYPE_IS_WINDOWS, type1, type2) || \ OSTYPE_COMPARE_IMP(OSTYPE_IS_LINUX, type1, type2) || OSTYPE_COMPARE_IMP(OSTYPE_IS_OTHER, type1, type2)) #define OSFLAG_ISSET(flags, flag) ((flags & flag) == flag) #define OSFLAG_ISUNSET(flags, flag) ((flags & flag) != flag) #define OSFLAG_SET(flags, flag) (flags | flag) #define OSFLAG_UNSET(flags, flag) (flags & (~flag)) #define OSFLAG_TOGGLE(flags, flag) (flags ^ flag) #define OSFLAG_USEGRAPHICS (1 << 0) #define OSFLAG_WITHKEXTS (1 << 1) #define OSFLAG_CHECKFAKESMC (1 << 2) #define OSFLAG_NOCACHES (1 << 3) #define OSFLAG_NODEFAULTARGS (1 << 4) #define OSFLAG_NODEFAULTMENU (1 << 5) #define OSFLAG_HIDDEN (1 << 6) #define OSFLAG_DISABLED (1 << 7) #define OSFLAG_HIBERNATED (1 << 8) #define OSFLAG_NOSIP (1 << 9) #define CUSTOM_BOOT_DISABLED 0 #define CUSTOM_BOOT_USER_DISABLED 1 #define CUSTOM_BOOT_NONE 2 #define CUSTOM_BOOT_APPLE 3 #define CUSTOM_BOOT_ALT_APPLE 4 #define CUSTOM_BOOT_THEME 5 #define CUSTOM_BOOT_USER 6 #define OPT_I386 (1 << 0) #define OPT_X64 (1 << 1) #define OPT_VERBOSE (1 << 2) #define OPT_NOCACHES (1 << 3) #define OPT_SINGLE_USER (1 << 4) #define OPT_SAFE (1 << 5) #define OPT_NVDISABLE (1 << 6) #define OPT_SLIDE (1 << 7) #define OPT_POWERNAPOFF (1 << 8) #define OPT_XCPM (1 << 9) #define OPT_GNOIDLE (1 << 10) #define OPT_GNOSLEEP (1 << 11) #define OPT_GNOMSI (1 << 12) #define OPT_EHCUSB (1 << 13) #define OPT_KEEPSYMS (1 << 14) #define OPT_DEBUG (1 << 15) #define OPT_KEXTLOG (1 << 16) #define OPT_APPLEALC (1 << 17) #define OPT_SHIKI (1 << 18) #define INX_NVWEBON 19 #define OPT_NVWEBON (1 << INX_NVWEBON) #define NUM_OPT 20 //extern CHAR16* ArgOptional[]; #define AsciiPageSize 0xC0 #define IS_EXTENDED_PART_TYPE(type) ((type) == 0x05 || (type) == 0x0f || (type) == 0x85) //mouse types /* typedef enum { NoEvents, Move, LeftClick, RightClick, DoubleClick, ScrollClick, ScrollDown, ScrollUp, LeftMouseDown, RightMouseDown, MouseMove } MOUSE_EVENT; */ //GUI types // Allow for 255 unicode characters + 2 byte unicode null terminator. #define SVALUE_MAX_SIZE 512 #define SCREEN_UNKNOWN 0 #define SCREEN_MAIN 1 #define SCREEN_ABOUT 2 #define SCREEN_HELP 3 #define SCREEN_OPTIONS 4 #define SCREEN_GRAPHICS 5 #define SCREEN_CPU 6 #define SCREEN_BINARIES 7 #define SCREEN_DSDT 8 #define SCREEN_BOOT 9 #define SCREEN_SMBIOS 10 #define SCREEN_TABLES 11 #define SCREEN_RC_SCRIPTS 12 #define SCREEN_USB 13 #define SCREEN_THEME 14 #define SCREEN_SYSVARS 15 #define SCREEN_CSR 16 #define SCREEN_BLC 17 #define SCREEN_DSM 18 #define SCREEN_ACPI 19 #define SCREEN_GUI 20 #define SCREEN_SYSTEM 21 #define SCREEN_AUDIO 22 #define SCREEN_KEXTS 23 #define SCREEN_KERNELS 24 #define SCREEN_DSDT_PATCHES 25 #define SCREEN_DEVICES 26 #define SCREEN_BOOTER 27 #define SCREEN_KEXT_INJECT 28 #define SCREEN_KEXTS_MAN 29 #define SCREEN_AUDIOPORTS 30 #define SCREEN_QUIRKS 31 #define MAX_ANIME 41 #define QUIRK_DEFRAG bit(0) #define QUIRK_MMIO bit(1) #define QUIRK_SU bit(2) #define QUIRK_VAR bit(3) #define QUIRK_HIBER bit(4) #define QUIRK_SAFE bit(5) #define QUIRK_UNPROT bit(6) #define QUIRK_EXIT bit(7) #define QUIRK_REGION bit(8) #define QUIRK_SECURE bit(9) #define QUIRK_UEFI bit(10) #define QUIRK_CUSTOM bit(11) #define QUIRK_MAP bit(12) #define QUIRK_VIRT bit(13) #define QUIRK_OS bit(14) #define QUIRK_PERM bit(15) //some unreal values #define FILM_CENTRE 40000 //#define FILM_LEFT 50000 //#define FILM_TOP 50000 //#define FILM_RIGHT 60000 //#define FILM_BOTTOM 60000 //#define FILM_PERCENT 100000 #define INITVALUE 40000 #define VOLTYPE_INTERNAL (0x0001) #define VOLTYPE_EXTERNAL (0x0002) #define VOLTYPE_OPTICAL (0x0004) #define VOLTYPE_FIREWIRE (0x0008) #define HIDEUI_FLAG_SHELL (0x0010) #define HIDEUI_FLAG_TOOLS (0x0020) #define HIDEUI_FLAG_SINGLEUSER (0x0040) #define HIDEUI_FLAG_HWTEST (0x0080) #define HIDEUI_FLAG_BANNER (0x0100) #define HIDEUI_FLAG_FUNCS (0x0200) #define HIDEUI_FLAG_LABEL (0x0400) #define HIDEUI_FLAG_REVISION (0x0800) #define HIDEUI_FLAG_MENU_TITLE (0x1000) #define HIDEUI_FLAG_MENU_TITLE_IMAGE (0x2000) #define HIDEUI_FLAG_HELP (0x4000) #define HIDEUI_FLAG_ROW1 (0x8000) #define HIDEUI_ALL (0xffff & (~VOLTYPE_INTERNAL)) #define HDBADGES_SWAP (1<<0) #define HDBADGES_SHOW (1<<1) #define HDBADGES_INLINE (1<<2) // types #define ANIME_INFINITE ((UINTN)-1) //some unreal values #define SCREEN_EDGE_LEFT 50000 #define SCREEN_EDGE_TOP 60000 #define SCREEN_EDGE_RIGHT 70000 #define SCREEN_EDGE_BOTTOM 80000 extern EFI_HANDLE SelfImageHandle; extern EFI_HANDLE SelfDeviceHandle; extern EFI_LOADED_IMAGE *SelfLoadedImage; extern EFI_FILE *SelfRootDir; extern EFI_FILE *SelfDir; extern CHAR16 *SelfDirPath; extern EFI_DEVICE_PATH *SelfDevicePath; extern EFI_DEVICE_PATH *SelfFullDevicePath; extern CHAR16 *ThemePath; extern EFI_FILE *OEMDir; extern CHAR16 *OEMPath; extern EFI_FILE *OemThemeDir; extern REFIT_VOLUME *SelfVolume; #ifdef __cplusplus extern XObjArray Volumes; #endif //extern UINTN VolumesCount; extern BOOLEAN gThemeChanged; //extern BOOLEAN gBootArgsChanged; extern BOOLEAN gBootChanged; extern BOOLEAN gThemeOptionsChanged; //extern POINTERS gPointer; //extern EFI_GUID gEfiAppleBootGuid; EFI_STATUS InitRefitLib(IN EFI_HANDLE ImageHandle); EFI_STATUS GetRootFromPath(IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, OUT EFI_FILE **Root); VOID UninitRefitLib(VOID); EFI_STATUS ReinitRefitLib(VOID); EFI_STATUS ReinitSelfLib(VOID); //extern EFI_STATUS FinishInitRefitLib(VOID); -- static BOOLEAN IsEmbeddedTheme(VOID); //VOID CreateList(OUT VOID ***ListPtr, OUT UINTN *ElementCount, IN UINTN InitialElementCount); //VOID AddListElement(IN OUT VOID ***ListPtr, IN OUT UINTN *ElementCount, IN VOID *NewElement); //VOID FreeList(IN OUT VOID ***ListPtr, IN OUT UINTN *ElementCount /*, IN Callback*/); EFI_STATUS ExtractLegacyLoaderPaths(EFI_DEVICE_PATH **PathList, UINTN MaxPaths, EFI_DEVICE_PATH **HardcodedPathList); VOID ScanVolumes(VOID); REFIT_VOLUME *FindVolumeByName(IN CHAR16 *VolName); BOOLEAN FileExists(IN CONST EFI_FILE *BaseDir, IN CONST CHAR16 *RelativePath); BOOLEAN FileExists(IN CONST EFI_FILE *BaseDir, IN CONST XStringW& RelativePath); inline EFI_DEVICE_PATH_PROTOCOL* FileDevicePath (IN EFI_HANDLE Device, IN CONST XStringW& FileName) { return FileDevicePath(Device, FileName.wc_str()); } BOOLEAN DeleteFile(IN EFI_FILE *Root, IN CONST CHAR16 *RelativePath); EFI_STATUS DirNextEntry(IN EFI_FILE *Directory, IN OUT EFI_FILE_INFO **DirEntry, IN UINTN FilterMode); VOID DirIterOpen(IN EFI_FILE *BaseDir, IN CONST CHAR16 *RelativePath OPTIONAL, OUT REFIT_DIR_ITER *DirIter); BOOLEAN DirIterNext(IN OUT REFIT_DIR_ITER *DirIter, IN UINTN FilterMode, IN CONST CHAR16 *FilePattern OPTIONAL, OUT EFI_FILE_INFO **DirEntry); EFI_STATUS DirIterClose(IN OUT REFIT_DIR_ITER *DirIter); CONST CHAR16 * Basename(IN CONST CHAR16 *Path); VOID ReplaceExtension(IN OUT CHAR16 *Path, IN CHAR16 *Extension); CHAR16 * egFindExtension(IN CHAR16 *FileName); INTN FindMem(IN CONST VOID *Buffer, IN UINTN BufferLength, IN CONST VOID *SearchString, IN UINTN SearchStringLength); //CHAR16 *FileDevicePathToStr(IN EFI_DEVICE_PATH_PROTOCOL *DevPath); CHAR16 *FileDevicePathFileToStr(IN EFI_DEVICE_PATH_PROTOCOL *DevPath); //UINTN FileDevicePathNameLen(IN CONST FILEPATH_DEVICE_PATH *FilePath); EFI_STATUS InitializeUnicodeCollationProtocol (VOID); // // screen module // #define ATTR_BASIC (EFI_LIGHTGRAY | EFI_BACKGROUND_BLACK) #define ATTR_ERROR (EFI_RED | EFI_BACKGROUND_BLACK) #define ATTR_BANNER (EFI_WHITE | EFI_BACKGROUND_BLACK) #define ATTR_CHOICE_BASIC ATTR_BASIC #define ATTR_CHOICE_CURRENT (EFI_WHITE | EFI_BACKGROUND_LIGHTGRAY) #define ATTR_SCROLLARROW (EFI_LIGHTGREEN | EFI_BACKGROUND_BLACK) #define LAYOUT_TEXT_WIDTH (500) #define LAYOUT_TOTAL_HEIGHT (376) #define LAYOUT_BANNER_HEIGHT (32) #define LAYOUT_BANNER_YOFFSET (LAYOUT_BANNER_HEIGHT + 32) #define LAYOUT_Y_EDGE (20) #define LAYOUT_X_EDGE (20) #define BAR_WIDTH (16) // local variables //extern INTN FontWidth; //extern INTN FontHeight; extern const INTN BCSMargin; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL StdBackgroundPixel; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL MenuBackgroundPixel; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL InputBackgroundPixel; extern EFI_GRAPHICS_OUTPUT_BLT_PIXEL BlueBackgroundPixel; //extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL DarkBackgroundPixel; extern EFI_GRAPHICS_OUTPUT_BLT_PIXEL SelectionBackgroundPixel; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL DarkEmbeddedBackgroundPixel; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL DarkSelectionPixel; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL WhitePixel; extern const EFI_GRAPHICS_OUTPUT_BLT_PIXEL BlackPixel; extern UINTN ConWidth; extern UINTN ConHeight; extern CHAR16 *BlankLine; extern INTN UGAWidth; extern INTN UGAHeight; extern BOOLEAN AllowGraphicsMode; #if REFIT_DEBUG > 0 VOID DebugPause(VOID); #else #define DebugPause() #endif #define BUILTIN_ICON_FUNC_ABOUT (0) #define BUILTIN_ICON_FUNC_OPTIONS (1) #define BUILTIN_ICON_FUNC_CLOVER (2) #define BUILTIN_ICON_FUNC_SECURE_BOOT (3) #define BUILTIN_ICON_FUNC_SECURE_BOOT_CONFIG (4) #define BUILTIN_ICON_FUNC_RESET (5) #define BUILTIN_ICON_FUNC_EXIT (6) #define BUILTIN_ICON_FUNC_HELP (7) #define BUILTIN_ICON_TOOL_SHELL (8) #define BUILTIN_ICON_TOOL_PART (9) #define BUILTIN_ICON_TOOL_RESCUE (10) #define BUILTIN_ICON_POINTER (11) #define BUILTIN_ICON_VOL_INTERNAL (12) #define BUILTIN_ICON_VOL_EXTERNAL (13) #define BUILTIN_ICON_VOL_OPTICAL (14) #define BUILTIN_ICON_VOL_FIREWIRE (15) #define BUILTIN_ICON_VOL_BOOTER (16) #define BUILTIN_ICON_VOL_INTERNAL_HFS (17) #define BUILTIN_ICON_VOL_INTERNAL_APFS (18) #define BUILTIN_ICON_VOL_INTERNAL_NTFS (19) #define BUILTIN_ICON_VOL_INTERNAL_EXT3 (20) #define BUILTIN_ICON_VOL_INTERNAL_REC (21) #define BUILTIN_ICON_BANNER (22) #define BUILTIN_SELECTION_SMALL (23) #define BUILTIN_SELECTION_BIG (24) #define BUILTIN_ICON_COUNT (25) #define BUILTIN_RADIO_BUTTON (45) #define BUILTIN_RADIO_BUTTON_SELECTED (46) #define BUILTIN_CHECKBOX (47) #define BUILTIN_CHECKBOX_CHECKED (48) #define ICON_OTHER_OS (51) #define ICON_CLOVER (52) #define ICON_BIGSUR (53) #define BUILTIN_ICON_BACKGROUND (100) #define BUILTIN_ICON_SELECTION (101) #define BUILTIN_ICON_ANIME (102) // // menu module // #define MENU_EXIT_ENTER ((ACTION)(1)) #define MENU_EXIT_ESCAPE (2) #define MENU_EXIT_DETAILS (3) #define MENU_EXIT_TIMEOUT (4) #define MENU_EXIT_OPTIONS (5) #define MENU_EXIT_EJECT (6) #define MENU_EXIT_HELP (7) #define MENU_EXIT_HIDE_TOGGLE (8) #define X_IS_LEFT 64 #define X_IS_RIGHT 0 #define X_IS_CENTER 1 #define BADGE_DIMENSION 64 // IconFormat #define ICON_FORMAT_DEF (0) #define ICON_FORMAT_ICNS (1) #define ICON_FORMAT_PNG (2) #define ICON_FORMAT_BMP (3) #ifdef _cplusplus extern XObjArray Volumes; #endif // // BmLib // extern BOOLEAN DumpVariable(CHAR16* Name, EFI_GUID* Guid, INTN DevicePathAt); //VOID FilterKextPatches(IN LOADER_ENTRY *Entry); #define KERNEL_MAX_SIZE 40000000 VOID ReinitVolumes(VOID); VOID DbgHeader(CONST CHAR8 *str); UINTN NodeParser (UINT8 *DevPath, UINTN PathSize, UINT8 Type); #endif