#ifdef __cplusplus
extern "C" {
#endif


typedef struct {
  INTN      Width;
  INTN      Height;
  EG_PIXEL    *PixelData;
  BOOLEAN     HasAlpha;   //moved here to avoid alignment issue
} EG_IMAGE;

typedef enum {
  BoolValue,
  Decimal,
  Hex,
  ASString,
  UNIString,
  RadioSwitch,
  CheckBit,
  
} ITEM_TYPE;

typedef struct {
  ITEM_TYPE ItemType; //string, value, boolean
  BOOLEAN Valid;
  BOOLEAN BValue;
  UINT8   Pad8;
  UINT32  IValue;
  //  UINT64  UValue;
  //  CHAR8*  AValue;
  CHAR16* SValue; // Max Size (see below) so the field can be edit by the GUI
  UINTN   LineShift;
} INPUT_ITEM;

typedef enum {
  kTagTypeNone,
  kTagTypeDict,
  kTagTypeKey,
  kTagTypeString,
  kTagTypeInteger,
  kTagTypeData,
  kTagTypeDate,
  kTagTypeFalse,
  kTagTypeTrue,
  kTagTypeArray
} TAG_TYPE;

typedef struct _DEV_PROPERTY DEV_PROPERTY; //yyyy
struct _DEV_PROPERTY {
  UINT32        Device;
  EFI_DEVICE_PATH_PROTOCOL* DevicePath;
  CHAR8         *Key;
  UINT8         *Value;
  UINTN         ValueLen;
  DEV_PROPERTY  *Next;   //next device or next property
  DEV_PROPERTY  *Child;  // property list of the device
  CHAR8         *Label;
  INPUT_ITEM    MenuItem;
  TAG_TYPE      ValueType;
};

typedef struct _KEXT_PATCH KEXT_PATCH;
struct _KEXT_PATCH
{
  CHAR8       *Name;
  CHAR8       *Label;
  BOOLEAN     IsPlistPatch;
  CHAR8       align[7];
  INT64        DataLen;
  UINT8       *Data;
  UINT8       *Patch;
  UINT8       *MaskFind;
  UINT8       *MaskReplace;
  CHAR8       *MatchOS;
  CHAR8       *MatchBuild;
  INPUT_ITEM  MenuItem;
};

typedef struct {
  CHAR8       *Label;
  INTN        DataLen;
  UINT8       *Data;
  UINT8       *Patch;
  UINT8       *MaskFind;
  UINT8       *MaskReplace;
  INTN        Count;
  CHAR8       *MatchOS;
  CHAR8       *MatchBuild;
  INPUT_ITEM  MenuItem;
} KERNEL_PATCH;

typedef struct KERNEL_AND_KEXT_PATCHES
{
  BOOLEAN KPDebug;
  BOOLEAN KPKernelCpu;
  BOOLEAN KPKernelLapic;
  BOOLEAN KPKernelXCPM;
  BOOLEAN KPKernelPm;
  BOOLEAN KPAppleIntelCPUPM;
  BOOLEAN KPAppleRTC;
  BOOLEAN KPDELLSMBIOS;  // Dell SMBIOS patch
  BOOLEAN KPPanicNoKextDump;
  UINT8   pad[3];
  UINT32  FakeCPUID;
  //  UINT32  align0;
  CHAR16  *KPATIConnectorsController;
#if defined(MDE_CPU_IA32)
  UINT32  align1;
#endif
  
  UINT8   *KPATIConnectorsData;
#if defined(MDE_CPU_IA32)
  UINT32  align2;
#endif
  
  UINTN   KPATIConnectorsDataLen;
#if defined(MDE_CPU_IA32)
  UINT32  align3;
#endif
  UINT8   *KPATIConnectorsPatch;
#if defined(MDE_CPU_IA32)
  UINT32  align4;
#endif
  
  INT32   NrKexts;
  UINT32  align40;
  KEXT_PATCH *KextPatches;   //zzzz
#if defined(MDE_CPU_IA32)
  UINT32  align5;
#endif
  
  INT32    NrForceKexts;
  UINT32  align50;
  CHAR16 **ForceKexts;
#if defined(MDE_CPU_IA32)
  UINT32 align6;
#endif
  INT32   NrKernels;
  KERNEL_PATCH *KernelPatches;
  INT32   NrBoots;
  KERNEL_PATCH *BootPatches;
  
} KERNEL_AND_KEXT_PATCHES;

typedef struct _ACPI_NAME_LIST ACPI_NAME_LIST;
struct _ACPI_NAME_LIST {
  ACPI_NAME_LIST *Next;
  CHAR8          *Name;
};

typedef struct _ACPI_DROP_TABLE ACPI_DROP_TABLE;
struct _ACPI_DROP_TABLE
{
  ACPI_DROP_TABLE *Next;
  UINT32          Signature;
  UINT32          Length;
  UINT64          TableId;
  INPUT_ITEM      MenuItem;
};

typedef struct _RT_VARIABLES RT_VARIABLES;
struct _RT_VARIABLES {
  //  BOOLEAN  Disabled;
  CHAR16   *Name;
  EFI_GUID VarGuid;
};

typedef struct _CUSTOM_LOADER_ENTRY CUSTOM_LOADER_ENTRY;
struct _CUSTOM_LOADER_ENTRY {
  CUSTOM_LOADER_ENTRY     *Next;
  CUSTOM_LOADER_ENTRY     *SubEntries;
  EG_IMAGE                *Image;
  EG_IMAGE                *DriveImage;
  CONST CHAR16                  *ImagePath;
  CONST CHAR16                  *DriveImagePath;
  CONST CHAR16                  *Volume;
  CONST CHAR16                  *Path;
  CONST CHAR16                  *Options;
  CONST CHAR16                  *FullTitle;
  CONST CHAR16                  *Title;
  CONST CHAR16                  *Settings;
  CHAR16                  Hotkey;
  BOOLEAN                 CommonSettings;
  UINT8                   Flags;
  UINT8                   Type;
  UINT8                   VolumeType;
  UINT8                   KernelScan;
  UINT8                   CustomBoot;
  EG_IMAGE                *CustomLogo;
  EG_PIXEL                *BootBgColor;
  KERNEL_AND_KEXT_PATCHES KernelAndKextPatches; //zzzz
};

typedef struct _CUSTOM_LEGACY_ENTRY CUSTOM_LEGACY_ENTRY;
struct _CUSTOM_LEGACY_ENTRY {
  CUSTOM_LEGACY_ENTRY *Next;
  EG_IMAGE            *Image;
  EG_IMAGE            *DriveImage;
  CONST CHAR16              *ImagePath;
  CONST CHAR16              *DriveImagePath;
  CONST CHAR16              *Volume;
  CONST CHAR16              *FullTitle;
  CONST CHAR16              *Title;
  CHAR16              Hotkey;
  UINT8               Flags;
  UINT8               Type;
  UINT8               VolumeType;
};

typedef struct _CUSTOM_TOOL_ENTRY CUSTOM_TOOL_ENTRY;
struct _CUSTOM_TOOL_ENTRY {
  CUSTOM_TOOL_ENTRY *Next;
  EG_IMAGE          *Image;
  CHAR16            *ImagePath;
  CHAR16            *Volume;
  CHAR16            *Path;
  CHAR16            *Options;
  CHAR16            *FullTitle;
  CHAR16            *Title;
  CHAR16            Hotkey;
  UINT8             Flags;
  UINT8             VolumeType;
};

// Set of Search & replace bytes for VideoBiosPatchBytes().
typedef struct _VBIOS_PATCH_BYTES {
  VOID    *Find;
  VOID    *Replace;
  UINTN   NumberOfBytes;
} VBIOS_PATCH_BYTES;

typedef struct {
  
  // SMBIOS TYPE0
  CHAR8                   VendorName[64];
  CHAR8                   RomVersion[64];
  CHAR8                   EfiVersion[64];
  CHAR8                   ReleaseDate[64];
  // SMBIOS TYPE1
  CHAR8                   ManufactureName[64];
  CHAR8                   ProductName[64];
  CHAR8                   VersionNr[64];
  CHAR8                   SerialNr[64];
  EFI_GUID                SmUUID;
  BOOLEAN                 SmUUIDConfig;
  CHAR8                   pad0[7];
  //CHAR8                    Uuid[64];
  //CHAR8                    SKUNumber[64];
  CHAR8                   FamilyName[64];
  CHAR8                   OEMProduct[64];
  CHAR8                   OEMVendor[64];
  // SMBIOS TYPE2
  CHAR8                   BoardManufactureName[64];
  CHAR8                   BoardSerialNumber[64];
  CHAR8                   BoardNumber[64]; //Board-ID
  CHAR8                   LocationInChassis[64];
  CHAR8                   BoardVersion[64];
  CHAR8                   OEMBoard[64];
  UINT8                   BoardType;
  UINT8                   Pad1;
  // SMBIOS TYPE3
  BOOLEAN                 Mobile;
  UINT8                   ChassisType;
  CHAR8                   ChassisManufacturer[64];
  CHAR8                   ChassisAssetTag[64];
  // SMBIOS TYPE4
  UINT32                  CpuFreqMHz;
  UINT32                  BusSpeed; //in kHz
  BOOLEAN                 Turbo;
  UINT8                   EnabledCores;
  BOOLEAN                 UserChange;
  BOOLEAN                 QEMU;
  // SMBIOS TYPE17
  UINT16                  SmbiosVersion;
  INT8                    Attribute;
  INT8                    Pad17[1];
  CHAR8                   MemoryManufacturer[64];
  CHAR8                   MemorySerialNumber[64];
  CHAR8                   MemoryPartNumber[64];
  CHAR8                   MemorySpeed[64];
  // SMBIOS TYPE131
  UINT16                  CpuType;
  // SMBIOS TYPE132
  UINT16                  QPI;
  BOOLEAN                 SetTable132;
  BOOLEAN                 TrustSMBIOS;
  BOOLEAN                 InjectMemoryTables;
  INT8                    XMPDetection;
  BOOLEAN                 UseARTFreq;
  // SMBIOS TYPE133
  UINT64                  PlatformFeature;
  
  // PatchTableType11
  BOOLEAN                 NoRomInfo;
  
  // OS parameters
  CHAR8                   Language[16];
  CHAR8                   BootArgs[256];
  CHAR16                  CustomUuid[40];
  
  CHAR16                  *DefaultVolume;
  CHAR16                  *DefaultLoader;
  //Boot
  BOOLEAN                 LastBootedVolume;
  BOOLEAN                 SkipHibernateTimeout;
  //Monitor
  BOOLEAN                 IntelMaxBacklight;
  //  UINT8                   Pad21[1];
  UINT16                  VendorEDID;
  UINT16                  ProductEDID;
  UINT16                  BacklightLevel;
  BOOLEAN                 BacklightLevelConfig;
  BOOLEAN                 IntelBacklight;
  //Boot options
  BOOLEAN                 MemoryFix;
  BOOLEAN                 WithKexts;
  BOOLEAN                 WithKextsIfNoFakeSMC;
  BOOLEAN                 FakeSMCFound;
  BOOLEAN                 NoCaches;
  
  // GUI parameters
  BOOLEAN                 Debug;
  BOOLEAN                 Proportional;
  //  UINT8                   Pad22[1];
  UINT32                  DefaultBackgroundColor;
  
  //ACPI
  UINT64                  ResetAddr;
  UINT8                   ResetVal;
  BOOLEAN                 NoASPM;
  BOOLEAN                 DropSSDT;
  BOOLEAN                 NoOemTableId;
  BOOLEAN                 NoDynamicExtract;
  BOOLEAN                 AutoMerge;
  BOOLEAN                 GeneratePStates;
  BOOLEAN                 GenerateCStates;
  BOOLEAN                 GenerateAPSN;
  BOOLEAN                 GenerateAPLF;
  BOOLEAN                 GeneratePluginType;
  UINT8                   PLimitDict;
  UINT8                   UnderVoltStep;
  BOOLEAN                 DoubleFirstState;
  BOOLEAN                 SuspendOverride;
  BOOLEAN                 EnableC2;
  BOOLEAN                 EnableC4;
  BOOLEAN                 EnableC6;
  BOOLEAN                 EnableISS;
  BOOLEAN                 SlpSmiEnable;
  BOOLEAN                 FixHeaders;
  UINT16                  C3Latency;
  BOOLEAN                 smartUPS;
  BOOLEAN                 PatchNMI;
  BOOLEAN                 EnableC7;
  UINT8                   SavingMode;
  
  CHAR16                  DsdtName[28];
  UINT32                  FixDsdt;
  UINT8                   MinMultiplier;
  UINT8                   MaxMultiplier;
  UINT8                   PluginType;
  //  BOOLEAN                 DropMCFG;
  BOOLEAN                 FixMCFG;
  
  UINT32                  DeviceRenameCount;
  ACPI_NAME_LIST          *DeviceRename;
  //Injections
  BOOLEAN                 StringInjector;
  BOOLEAN                 InjectSystemID;
  BOOLEAN                 NoDefaultProperties;
  
  BOOLEAN                 ReuseFFFF;
  
  //PCI devices
  UINT32                  FakeATI;    //97
  UINT32                  FakeNVidia;
  UINT32                  FakeIntel;
  UINT32                  FakeLAN;   //100
  UINT32                  FakeWIFI;
  UINT32                  FakeSATA;
  UINT32                  FakeXHCI;  //103
  UINT32                  FakeIMEI;  //106
  
  //Graphics
  //  UINT16                  PCIRootUID;
  BOOLEAN                 GraphicsInjector;
  BOOLEAN                 InjectIntel;
  BOOLEAN                 InjectATI;
  BOOLEAN                 InjectNVidia;
  BOOLEAN                 DeInit;
  BOOLEAN                 LoadVBios;
  BOOLEAN                 PatchVBios;
  VBIOS_PATCH_BYTES       *PatchVBiosBytes;
  UINTN                   PatchVBiosBytesCount;
  BOOLEAN                 InjectEDID;
  BOOLEAN                 LpcTune;
  UINT16                  DropOEM_DSM; // vacant (unused in 0b7eed38f14400c8501228a30dcc023e1132cec3 r5017+)
  UINT8                   *CustomEDID;
  UINT16                  CustomEDIDsize;
  UINT16                  EdidFixHorizontalSyncPulseWidth;
  UINT8                   EdidFixVideoInputSignal;
  
  CHAR16                  FBName[16];
  UINT16                  VideoPorts;
  BOOLEAN                 NvidiaGeneric;
  BOOLEAN                 NvidiaNoEFI;
  BOOLEAN                 NvidiaSingle;
  UINT64                  VRAM;
  UINT8                   Dcfg[8];
  UINT8                   NVCAP[20];
  INT8                    BootDisplay;
  BOOLEAN                 NvidiaWeb;
  UINT8                   pad41[2];
  UINT32                  DualLink;
  UINT32                  IgPlatform;
  
  // Secure boot white/black list
  UINT32                  SecureBootWhiteListCount;
  UINT32                  SecureBootBlackListCount;
  CHAR16                  **SecureBootWhiteList;
  
  CHAR16                  **SecureBootBlackList;
  
  // Secure boot
  UINT8                   SecureBoot;
  UINT8                   SecureBootSetupMode;
  UINT8                   SecureBootPolicy;
  
  // HDA
  BOOLEAN                 HDAInjection;
  INT32                   HDALayoutId;
  
  // USB DeviceTree injection
  BOOLEAN                 USBInjection;
  BOOLEAN                 USBFixOwnership;
  BOOLEAN                 InjectClockID;
  BOOLEAN                 HighCurrent;
  BOOLEAN                 NameEH00;
  BOOLEAN                 NameXH00;
  
  BOOLEAN                 LANInjection;
  BOOLEAN                 HDMIInjection;
  
  // UINT8                   pad61[2];
  
  // LegacyBoot
  CHAR16                  LegacyBoot[32];
  UINT16                  LegacyBiosDefaultEntry;
  
  //SkyLake
  BOOLEAN                 HWP;
  UINT8                   TDP;
  UINT32                  HWPValue;
  
  //Volumes hiding
  CHAR16                  **HVHideStrings;
  
  INTN                    HVCount;
  
  // KernelAndKextPatches
  KERNEL_AND_KEXT_PATCHES KernelAndKextPatches;  //zzzz
  BOOLEAN                 KextPatchesAllowed;
  BOOLEAN                 KernelPatchesAllowed; //From GUI: Only for user patches, not internal Clover
  
  CHAR8                   AirportBridgeDeviceName[5];
  
  // Pre-language
  BOOLEAN                 KbdPrevLang;
  
  //Pointer
  BOOLEAN                 PointerEnabled;
  INTN                    PointerSpeed;
  UINT64                  DoubleClickTime;
  BOOLEAN                 PointerMirror;
  
  //  UINT8                   pad7[6];
  UINT8                   CustomBoot;
  EG_IMAGE                *CustomLogo;
  
  UINT32                  RefCLK;
  
  // SysVariables
  CHAR8                   *RtMLB;
  UINT8                   *RtROM;
  UINTN                   RtROMLen;
  
  UINT32                  CsrActiveConfig;
  UINT16                  BooterConfig;
  CHAR8                   BooterCfgStr[64];
  BOOLEAN                 DisableCloverHotkeys;
  BOOLEAN                 NeverDoRecovery;
  
  // Multi-config
  CHAR16                  ConfigName[30];
  CHAR16                  *MainConfigName;
  
  //Drivers
  INTN                    BlackListCount;
  CHAR16                  **BlackList;
  
  //SMC keys
  CHAR8                   RPlt[8];
  CHAR8                   RBr[8];
  UINT8                   EPCI[4];
  UINT8                   REV[6];
  
  //other devices
  BOOLEAN                 Rtc8Allowed;
  BOOLEAN                 ForceHPET;
  BOOLEAN                 ResetHDA;
  BOOLEAN                 PlayAsync;
  UINT32                  DisableFunctions;
  
  //Patch DSDT arbitrary
  UINT32                  PatchDsdtNum;
  UINT8                   **PatchDsdtFind;
  UINT32 *LenToFind;
  UINT8  **PatchDsdtReplace;
  
  UINT32 *LenToReplace;
  BOOLEAN                 DebugDSDT;
  BOOLEAN                 SlpWak;
  BOOLEAN                 UseIntelHDMI;
  UINT8                   AFGLowPowerState;
  UINT8                   PNLF_UID;
  //  UINT8                   pad83[4];
  
  
  // Table dropping
  ACPI_DROP_TABLE         *ACPIDropTables;
  
  // Custom entries
  BOOLEAN                 DisableEntryScan;
  BOOLEAN                 DisableToolScan;
  BOOLEAN                 ShowHiddenEntries;
  UINT8                   KernelScan;
  BOOLEAN                 LinuxScan;
  //  UINT8                   pad84[3];
  CUSTOM_LOADER_ENTRY     *CustomEntries;
  CUSTOM_LEGACY_ENTRY     *CustomLegacy;
  CUSTOM_TOOL_ENTRY       *CustomTool;
  
  //Add custom properties
  UINTN                   NrAddProperties;
  DEV_PROPERTY            *AddProperties;
  
  //BlackListed kexts
  CHAR16                  BlockKexts[64];
  
  // Disable inject kexts
  //  UINT32                  DisableInjectKextCount;
  //  CHAR16                  **DisabledInjectKext;
  //  INPUT_ITEM              *InjectKextMenuItem;
  
  //ACPI tables
  UINTN                   SortedACPICount;
  CHAR16                  **SortedACPI;
  
  // ACPI/PATCHED/AML
  UINT32                  DisabledAMLCount;
  CHAR16                  **DisabledAML;
  CHAR8                   **PatchDsdtLabel; //yyyy
  CHAR8                   **PatchDsdtTgt;
  INPUT_ITEM              *PatchDsdtMenuItem;
  
  //other
  UINT32                  IntelMaxValue;
  //  UINT32                  AudioVolume;
  
  // boot.efi
  UINT32 OptionsBits;
  UINT32 FlagsBits;
  UINT32 UIScale;
  UINT32 EFILoginHiDPI;
  UINT8  flagstate[32];
  
  DEV_PROPERTY            *ArbProperties;
  
} SETTINGS_DATA;

#ifdef __cplusplus
}
#endif
