// // GengConfig.swift // Clover // // Created by vector sigma on 22/02/2020. // Copyright © 2020 CloverHackyColor. All rights reserved. // import Foundation extension Mirror { var data: Data { var d : Data = Data() for child in self.children { d.append(child.value as! UInt8) } return d } var dataString: String { var str : String = "" for child in self.children { str += String(format: "%02x", child.value as! UInt8) } return str } var CHAR16String: String? { var data : Data = Data() for child in self.children { let u16 = child.value as! UInt16 let u80 = UInt8(u16 >> 8) let u81 = UInt8(u16 & 0x00ff) if u80 != 0x00 { data.append(u80) } if u81 != 0x00 { data.append(u81) } } return String(data: data, encoding: .utf8) } var CHAR8String: String? { var chars : [Character] = [Character]() for child in self.children { if let byte = UInt8(exactly: child.value as! Int8) { if byte != 0x00 { let char = Character(UnicodeScalar(byte)) chars.append(char) } } } return String(chars) } var labels : [String] { var l : [String] = [String]() for child in self.children { if (child.label != nil) { l.append(child.label!) } } return l } } extension EFI_GUID { var uuidString: String? { var data : Data = Data() data.append(Data1.data) data.append(Data2.data) data.append(Data3.data) data.append(Mirror(reflecting: Data4).data) var str = "" for i in 0.. [String : Any]? { var Fixes = [String : Any]() /* FixDsdt is UINT32. FixesNew array indexes reflect bit field */ let FixesNew = ["AddDTGP", "FixDarwin", "FixShutdown", "AddMCHC", "FixHPET", "FakeLPC", "FixIPIC", "FixSBUS", "FixDisplay", "FixIDE", "FixSATA", "FixFirewire", "FixUSB", "FixLAN", "FixAirport", "FixHDA", "FixDarwin7", "FixRTC", "FixTMR", "AddIMEI", "FixIntelGfx", "FixWAK", "DeleteUnused", "FixADP1", "AddPNLF", "FixS3D", "FixACST", "AddHDMI", "FixRegions", "FixHeaders", "FixMutex"] let FixesOld = ["AddDTGP_0001", "FixDarwin_0002", "FixShutdown_0004", "AddMCHC_0008", "FixHPET_0010", "FakeLPC_0020", "FixIPIC_0040", "FixSBUS_0080", "FixDisplay_0100", "FixIDE_0200", "FixSATA_0400", "FixFirewire_0800", "FixUSB_1000", "FixLAN_2000", "FixAirport_4000", "FixHDA_8000", "FixHDA", "FixDarwin7_10000", "FIX_RTC_20000", "FIX_TMR_40000", "AddIMEI_80000", "FIX_INTELGFX_100000", "FIX_WAK_200000", "DeleteUnused_400000", "FIX_ADP1_800000", "AddPNLF_1000000", "FIX_S3D_2000000", "FIX_ACST_4000000", "AddHDMI_8000000", "FixRegions_10000000", "FixHeaders_20000000", "FixHeaders"] var found = false for child in Mirror(reflecting: self).children { if child.label != nil && child.label! == "FixDsdt" { found = true let FixDsdt : UINT32 = child.value as! UINT32 if AppSD.CloverRevision >= 4006 { for i in 0.. 0 } } else { for i in 0.. 0 } } break } } if !found { print("SETTINGS_DATA: label 'FixDsdt' not found.") return nil } return Fixes } func getDropOEM_DSM() -> [String : Any]? { var dict = [String : Any]() /* DropOEM_DSM is UINT16. dsms array indexes reflect bit field */ let dsms = ["ATI", "NVidia", "IntelGFX", "HDA", "HDMI", "LAN", "WIFI", "SATA", "IDE", "LPC", "SmBUS", "USB", "Firewire"] var found = false for child in Mirror(reflecting: self).children { if child.label != nil && child.label! == "DropOEM_DSM" { found = true let DropOEM_DSM : UINT16 = child.value as! UINT16 for i in 0.. 0 } break } } if !found { print("SETTINGS_DATA: label 'DropOEM_DSM' not found.") return nil } return dict } func kpValue(for label: String, type: SETTINGS_DATA_TYPE) -> Any? { var found = false var value : Any? = nil if self.labels.contains("KernelAndKextPatches") { for child in Mirror(reflecting: self.KernelAndKextPatches).children { if child.label != nil && child.label! == label { //print(child.label!) switch type { case .CHAR8String: value = Mirror(reflecting: child.value).CHAR8String case .CHAR16String: value = Mirror(reflecting: child.value).CHAR16String case .DataString: value = Mirror(reflecting: child.value).dataString case .UUIDString: if let eg = child.value as? EFI_GUID { value = eg.uuidString } case .HexString: value = NSNumber(value: Int("\(child.value)")!).hexString case .BOOLEAN: value = NSNumber(value: child.value as! BOOLEAN).boolValue case .INTEGER: value = Int("\(child.value)") } found = true break } } } if !found { print("KernelAndKextPatches: label '\(label)' not found.") return nil } if value == nil { print("KernelAndKextPatches: value for label '\(label)' is nil.") return nil } return value } func value(for label: String, type: SETTINGS_DATA_TYPE) -> Any? { var found = false var value : Any? = nil for child in Mirror(reflecting: self).children { if child.label != nil && child.label! == label { //print(child.label!) switch type { case .CHAR8String: value = Mirror(reflecting: child.value).CHAR8String case .CHAR16String: value = Mirror(reflecting: child.value).CHAR16String case .DataString: value = Mirror(reflecting: child.value).dataString case .UUIDString: if let eg = child.value as? EFI_GUID { value = eg.uuidString } case .HexString: value = NSNumber(value: Int("\(child.value)")!).hexString case .BOOLEAN: value = NSNumber(value: child.value as! BOOLEAN).boolValue case .INTEGER: if child.label! == "flagstate" { value = NSNumber(value: self.flagstate.0).intValue } else { value = Int("\(child.value)") } } found = true break } } if !found { print("SETTINGS_DATA: label '\(label)' not found.") return nil } if value == nil { print("SETTINGS_DATA: value for label '\(label)' is nil.") return nil } return value } } final class CloverConfig: NSObject { private var config = [String: Any]() func generateCloverConfig() -> [String: Any]? { if AppSD.CloverRevision <= 3250 { print("Clover gen Config: Clover Revision too old or just not Clover.") return nil } if let data = getCloverSettingsData() { var s : SETTINGS_DATA = SETTINGS_DATA() withUnsafeMutablePointer(to: &s) { pointer in let bound = pointer.withMemoryRebound(to: UInt8.self, capacity: data.count) { $0 } data.enumerated().forEach { (bound + $0.offset).pointee = $0.element } } self.config["ConfigName"] = s.value(for: "ConfigName", type: .CHAR16String) // MARK: ACPI var ACPI = [String : Any]() ACPI["ResetAddress"] = s.value(for: "ResetAddr", type: .HexString) ACPI["ResetValue"] = s.value(for: "ResetVal", type: .HexString) ACPI["HaltEnabler"] = s.value(for: "SlpSmiEnable", type: .BOOLEAN) ACPI["PatchAPIC"] = s.value(for: "PatchNMI", type: .BOOLEAN) ACPI["smartUPS"] = s.value(for: "smartUPS", type: .BOOLEAN) ACPI["AutoMerge"] = s.value(for: "AutoMerge", type: .BOOLEAN) ACPI["DisableASPM"] = s.value(for: "NoASPM", type: .BOOLEAN) ACPI["FixHeaders"] = s.value(for: "FixHeaders", type: .BOOLEAN) ACPI["FixMCFG"] = s.value(for: "FixMCFG", type: .BOOLEAN) // MARK: ACPI->DSDT var DSDT = [String : Any]() DSDT["Name"] = s.value(for: "DsdtName", type: .CHAR16String) DSDT["Debug"] = s.value(for: "DebugDSDT", type: .BOOLEAN) DSDT["ReuseFFFF"] = s.value(for: "ReuseFFFF", type: .BOOLEAN) DSDT["SuspendOverride"] = s.value(for: "SuspendOverride", type: .BOOLEAN) DSDT["Rtc8Allowed"] = s.value(for: "Rtc8Allowed", type: .BOOLEAN) DSDT["#Patches count"] = s.value(for: "PatchDsdtNum", type: .INTEGER) // MARK: ACPI->DSDT->Fixes DSDT["Fixes"] = s.getDSDTFixes() // MARK: ACPI->DSDT->Patches var Patches = [Any]() var PatchesDict1 = [String : Any]() PatchesDict1["Comment"] = "This is for sample" PatchesDict1["Disabled"] = true PatchesDict1["Find"] = "_NOT_SHOWN_" PatchesDict1["Replace"] = "_NOT_SHOWN_" Patches.append(PatchesDict1) DSDT["Patches"] = Patches // MARK: ACPI->DSDT->DropOEM_DSM DSDT["DropOEM_DSM"] = s.getDropOEM_DSM() ACPI["DSDT"] = DSDT // MARK: ACPI->SSDT var SSDT = [String : Any]() SSDT["DropOem"] = s.value(for: "DropSSDT", type: .BOOLEAN) SSDT["#DoubleFirstState"] = s.value(for: "DoubleFirstState", type: .BOOLEAN) SSDT["#MinMultiplier"] = s.value(for: "MinMultiplier", type: .INTEGER) SSDT["#MaxMultiplier"] = s.value(for: "MaxMultiplier", type: .INTEGER) SSDT["#PLimitDict"] = s.value(for: "PLimitDict", type: .INTEGER) SSDT["#UnderVoltStep"] = s.value(for: "UnderVoltStep", type: .INTEGER) SSDT["#PluginType"] = s.value(for: "PluginType", type: .INTEGER) SSDT["#UseSystemIO"] = s.value(for: "EnableISS", type: .BOOLEAN) SSDT["#EnableC2"] = s.value(for: "EnableC2", type: .BOOLEAN) SSDT["#EnableC4"] = s.value(for: "EnableC4", type: .BOOLEAN) SSDT["#EnableC6"] = s.value(for: "EnableC6", type: .BOOLEAN) SSDT["#EnableC7"] = s.value(for: "EnableC7", type: .BOOLEAN) SSDT["#C3Latency"] = s.value(for: "C3Latency", type: .INTEGER) SSDT["NoDynamicExtract"] = s.value(for: "NoDynamicExtract", type: .BOOLEAN) // MARK: ACPI->SSDT->Generate var Generate = [String : Any]() Generate["PStates"] = s.value(for: "GeneratePStates", type: .BOOLEAN) Generate["CStates"] = s.value(for: "GenerateCStates", type: .BOOLEAN) Generate["APSN"] = s.value(for: "GenerateAPSN", type: .BOOLEAN) Generate["APLF"] = s.value(for: "GenerateAPLF", type: .BOOLEAN) Generate["PluginType"] = s.value(for: "GeneratePluginType", type: .BOOLEAN) if Generate.keys.count > 0 { SSDT["Generate"] = Generate } ACPI["SSDT"] = SSDT // MARK: ACPI->DropTables var DropTables = [Any]() var DropTablesDict1 = [String : Any]() DropTablesDict1["#Signature"] = "_NOT_SHOWN_" DropTablesDict1["#TableId"] = "_NOT_SHOWN_" DropTablesDict1["#Length"] = 0 DropTables.append(DropTablesDict1) ACPI["DropTables"] = DropTables // MARK: ACPI->SortedOrder var SortedOrder = [Any]() SortedOrder.append("SSDT-1.aml") ACPI["#Sorted ACPI tables Count"] = s.value(for: "SortedACPICount", type: .INTEGER) ACPI["#SortedOrder"] = SortedOrder // MARK: ACPI->RenameDevices if AppSD.CloverRevision >= 4468 { var RenameDevices = [String : Any]() RenameDevices["#_SB.PCI0.RP01.PXSX"] = "ARPT" RenameDevices["_SB.PCI0.RP02.PXSX"] = "XHC2" ACPI["#RenameDevices"] = RenameDevices } self.config["ACPI"] = ACPI // MARK: Boot var Boot = [String: Any]() Boot["Arguments"] = s.value(for: "BootArgs", type: .CHAR8String) Boot["Legacy"] = s.value(for: "LegacyBoot", type: .CHAR16String) Boot["XMPDetection"] = s.value(for: "XMPDetection", type: .INTEGER) Boot["Debug"] = s.value(for: "Debug", type: .BOOLEAN) Boot["#Timeout"] = "_NOT_SHOWN_" Boot["Fast"] = false Boot["#CustomLogo"] = "_NOT_SHOWN_" Boot["#NeverHibernate"] = false Boot["#StrictHibernate"] = false Boot["#RtcHibernateAware"] = false Boot["NeverDoRecovery"] = s.value(for: "NeverDoRecovery", type: .BOOLEAN) Boot["SkipHibernateTimeout"] = s.value(for: "SkipHibernateTimeout", type: .BOOLEAN) Boot["DisableCloverHotkeys"] = s.value(for: "DisableCloverHotkeys", type: .BOOLEAN) Boot["LegacyBiosDefaultEntry"] = s.value(for: "LegacyBiosDefaultEntry", type: .INTEGER) if Boot.keys.count > 0 { self.config["Boot"] = Boot } // MARK: BootGraphics var BootGraphics = [String: Any]() BootGraphics["DefaultBackgroundColor"] = s.value(for: "DefaultBackgroundColor", type: .HexString) BootGraphics["UIScale"] = s.value(for: "UIScale", type: .INTEGER) BootGraphics["EFILoginHiDPI"] = s.value(for: "EFILoginHiDPI", type: .INTEGER) BootGraphics["flagstate"] = s.value(for: "flagstate", type: .INTEGER) if BootGraphics.keys.count > 0 { self.config["BootGraphics"] = BootGraphics } // MARK: CPU var CPU = [String: Any]() CPU["Type"] = s.value(for: "CpuType", type: .HexString) CPU["FrequencyMHz"] = s.value(for: "CpuFreqMHz", type: .INTEGER) CPU["#BusSpeedkHz"] = s.value(for: "BusSpeed", type: .INTEGER) CPU["QPI"] = s.value(for: "QPI", type: .INTEGER) CPU["SavingMode"] = s.value(for: "SavingMode", type: .INTEGER) CPU["#UseARTFrequency"] = s.value(for: "UseARTFreq", type: .BOOLEAN) CPU["#TurboDisable"] = s.value(for: "Turbo", type: .BOOLEAN) CPU["#HWPEnable"] = s.value(for: "HWP", type: .BOOLEAN) CPU["#HWPValue"] = s.value(for: "HWPValue", type: .INTEGER) CPU["EnabledCores"] = s.value(for: "EnabledCores", type: .INTEGER) CPU["#TDP"] = s.value(for: "TDP", type: .BOOLEAN) CPU["#QEMU"] = s.value(for: "QEMU", type: .BOOLEAN) if CPU.keys.count > 0 { self.config["CPU"] = CPU } // MARK: Devices var Devices = [String: Any]() Devices["#Inject"] = s.value(for: "StringInjector", type: .BOOLEAN) Devices["#Properties"] = "_NOT_SHOWN_" Devices["#NoDefaultProperties"] = s.value(for: "NoDefaultProperties", type: .BOOLEAN) Devices["UseIntelHDMI"] = s.value(for: "UseIntelHDMI", type: .BOOLEAN) Devices["ForceHPET"] = s.value(for: "ForceHPET", type: .BOOLEAN) Devices["#SetIntelBacklight"] = s.value(for: "IntelBacklight", type: .BOOLEAN) Devices["#SetIntelMaxBacklight"] = s.value(for: "IntelMaxBacklight", type: .BOOLEAN) Devices["#IntelMaxValue"] = s.value(for: "IntelMaxValue", type: .INTEGER) // MARK: Devices->AddProperties var AddProperties = [Any]() var AddPropertiesDict1 = [String: Any]() AddPropertiesDict1["#Device"] = "XXX" AddPropertiesDict1["#Disabled"] = true AddPropertiesDict1["#Key"] = "AAPL,XXX" AddPropertiesDict1["#Value"] = NSNumber(value: 0xFFFF).hexString AddProperties.append(AddPropertiesDict1) Devices["AddProperties"] = AddProperties // MARK: Devices->Properties if AppSD.CloverRevision >= 4466 { if let data = getDevicePropertiesData()?.toPointer() { var Properties = [String : Any]() let gfx : GFX_HEADER? = parse_binary(data).pointee var block = gfx?.blocks repeat { var entry = block?.pointee.entries if let dpath = ConvertDevicePathToAscii(block!.pointee.devpath, 1, 1) { let blockKey = String(cString: dpath) var blockDict = [String: Any]() repeat { if entry != nil { let key = String(cString: entry!.pointee.key) let count = Int(entry!.pointee.val_len) switch entry!.pointee.val_type { case DATA_INT8: fallthrough case DATA_INT16: fallthrough case DATA_INT32: fallthrough case DATA_BINARY: let data = Data(bytes: entry!.pointee.val, count: count) blockDict[key] = data case DATA_STRING: let str = String(cString: entry!.pointee.val) blockDict[key] = str default: // we should not be here as all the types are enumerated break } entry = entry!.pointee.next } } while (entry != nil) if blockDict.keys.count > 0 { Properties[blockKey] = blockDict } } block = block?.pointee.next } while (block != nil) Devices["Properties"] = Properties } } // MARK: Devices->FakeID var FakeID = [String : Any]() FakeID["ATI"] = s.value(for: "FakeATI", type: .HexString) FakeID["NVidia"] = s.value(for: "FakeNVidia", type: .HexString) FakeID["IntelGFX"] = s.value(for: "FakeIntel", type: .HexString) FakeID["LAN"] = s.value(for: "FakeLAN", type: .HexString) FakeID["WIFI"] = s.value(for: "FakeWIFI", type: .HexString) FakeID["SATA"] = s.value(for: "FakeSATA", type: .HexString) FakeID["XHCI"] = s.value(for: "FakeXHCI", type: .HexString) FakeID["IMEI"] = s.value(for: "FakeIMEI", type: .HexString) if FakeID.keys.count > 0 { Devices["FakeID"] = FakeID } // MARK: Devices->Audio var Audio = [String : Any]() if s.labels.contains("HDAInjection") && NSNumber(value: s.HDAInjection).boolValue { Audio["#Inject"] = s.value(for: "HDALayoutId", type: .INTEGER) } else { Audio["#Inject"] = s.value(for: "HDAInjection", type: .BOOLEAN) } Audio["#ResetHDA"] = s.value(for: "ResetHDA", type: .BOOLEAN) if Audio.keys.count > 0 { Devices["Audio"] = Audio } // MARK: Devices->USB var USB = [String : Any]() USB["Inject"] = s.value(for: "USBInjection", type: .BOOLEAN) USB["FixOwnership"] = s.value(for: "USBFixOwnership", type: .BOOLEAN) USB["AddClockID"] = s.value(for: "InjectClockID", type: .BOOLEAN) USB["HighCurrent"] = s.value(for: "HighCurrent", type: .BOOLEAN) if USB.keys.count > 0 { Devices["USB"] = USB } self.config["Devices"] = Devices // MARK: Graphics var Graphics = [String : Any]() Graphics["LoadVBios"] = s.value(for: "LoadVBios", type: .BOOLEAN) Graphics["PatchVBios"] = s.value(for: "PatchVBios", type: .BOOLEAN) Graphics["VideoPorts"] = s.value(for: "VideoPorts", type: .INTEGER) Graphics["VRAM"] = s.value(for: "VRAM", type: .INTEGER) Graphics["DualLink"] = s.value(for: "DualLink", type: .INTEGER) // MARK: Graphics (ATI specific) Graphics["FBName"] = s.value(for: "FBName", type: .CHAR16String) Graphics["RadeonDeInit"] = s.value(for: "DeInit", type: .BOOLEAN) // MARK: Graphics (NVIDIA specific) Graphics["display-cfg"] = s.value(for: "Dcfg", type: .DataString) Graphics["NVCAP"] = s.value(for: "NVCAP", type: .DataString) Graphics["NvidiaGeneric"] = s.value(for: "NvidiaGeneric", type: .BOOLEAN) Graphics["NvidiaNoEFI"] = s.value(for: "NvidiaNoEFI", type: .BOOLEAN) Graphics["NvidiaSingle"] = s.value(for: "NvidiaSingle", type: .BOOLEAN) // MARK: Graphics (NVIDIA Intel) Graphics["ig-platform-id"] = s.value(for: "IgPlatform", type: .HexString) Graphics["#PatchVBiosBytes Count"] = s.value(for: "PatchVBiosBytesCount", type: .INTEGER) // MARK: Graphics->Inject var Inject = [String : Any]() Inject["ATI"] = s.value(for: "InjectATI", type: .BOOLEAN) Inject["NVidia"] = s.value(for: "InjectNVidia", type: .BOOLEAN) Inject["Intel"] = s.value(for: "InjectIntel", type: .BOOLEAN) if Inject.keys.count > 0 { Graphics["Inject"] = Inject } // MARK: Graphics->PatchVBiosBytes var PatchVBiosBytes = [Any]() Graphics["#PatchVBiosBytes Count"] = s.value(for: "PatchVBiosBytesCount", type: .INTEGER) var PatchVBiosBytesDict1 = [String : Any]() PatchVBiosBytesDict1["#Find"] = "_NOT_SHOWN_" PatchVBiosBytesDict1["#Replace"] = "_NOT_SHOWN_" PatchVBiosBytes.append(PatchVBiosBytesDict1) Graphics["#PatchVBiosBytes"] = PatchVBiosBytes // MARK: Graphics->EDID if AppSD.CloverRevision >= 3737 { var EDID = [String : Any]() if AppSD.CloverRevision >= 4058 { EDID["Inject"] = s.value(for: "InjectEDID", type: .INTEGER) EDID["#VendorID"] = s.value(for: "VendorEDID", type: .HexString) EDID["#ProductID"] = s.value(for: "ProductEDID", type: .HexString) EDID["#Custom"] = "_NOT_SHOWN_" } else { EDID["InjectEDID"] = s.value(for: "InjectEDID", type: .BOOLEAN) EDID["#CustomEDID"] = "_NOT_SHOWN_" } if EDID.keys.count > 0 { Graphics["EDID"] = EDID } } if Graphics.keys.count > 0 { self.config["Graphics"] = Graphics } // MARK: GUI var GUI = [String: Any]() GUI["#Language"] = s.value(for: "Language", type: .CHAR8String) GUI["#Theme"] = "embedded" GUI["TextOnly"] = false GUI["CustomIcons"] = false // MARK: GUI->Mouse var Mouse = [String: Any]() Mouse["Enabled"] = s.value(for: "PointerEnabled", type: .BOOLEAN) Mouse["Speed"] = s.value(for: "PointerSpeed", type: .INTEGER) Mouse["Mirror"] = s.value(for: "PointerMirror", type: .BOOLEAN) if Mouse.keys.count > 0 { GUI["Mouse"] = Mouse } // MARK: GUI->Hide var Hide = [String]() Hide.append("VolumeName_NOT_SHOWN") Hide.append("VolumeUUID_NOT_SHOWN") Hide.append("EntryPath_NOT_SHOWN") GUI["Hide"] = Hide // MARK: GUI->Scan var Scan = [String: Any]() Scan["Comment"] = "These values wrong, they present for sample" Scan["#Entries"] = true Scan["#Tool"] = true Scan["#Legacy"] = true GUI["Scan"] = Scan // MARK: GUI->Custom var Custom = [String: Any]() Custom["Comment"] = "These values wrong, they present for sample" // MARK: GUI->Custom->Entries var Entries = [Any]() // MARK: GUI->Custom->Entries->example dict var EntriesDict1 = [String: Any]() EntriesDict1["Comment"] = "These values wrong, they present for sample" EntriesDict1["#Volume"] = "VolumeUUID_NOT_SHOWN" EntriesDict1["#Path"] = "_NOT_SHOWN_" EntriesDict1["#Type"] = "_NOT_SHOWN_" EntriesDict1["#Arguments"] = "_NOT_SHOWN_" EntriesDict1["#AddArguments"] = "-v" EntriesDict1["#Title"] = "_NOT_SHOWN_" EntriesDict1["#FullTitle"] = "_NOT_SHOWN_" EntriesDict1["#Image"] = "_NOT_SHOWN_" EntriesDict1["#Hotkey"] = "_NOT_SHOWN_" EntriesDict1["#Disabled"] = true EntriesDict1["#InjectKexts"] = true // EntriesDict1["#NoCaches"] = false // how to boot without cache??? EntriesDict1["#Hidden"] = true // MARK: GUI->Custom->Entries->example dict->SubEntries var SubEntries = [Any]() var SubEntriesDict1 = [String: Any]() SubEntriesDict1["#Title"] = "_NOT_SHOWN_" SubEntriesDict1["#AddArguments"] = "_NOT_SHOWN_" SubEntries.append(SubEntriesDict1) EntriesDict1["SubEntries"] = SubEntries Entries.append(EntriesDict1) Custom["Entries"] = Entries // MARK: GUI->Custom->Legacy var Legacy = [Any]() var LegacyDict1 = [String: Any]() LegacyDict1["#Volume"] = "VolumeUUID_NOT_SHOWN" LegacyDict1["#Type"] = "_NOT_SHOWN_" LegacyDict1["#Title"] = "_NOT_SHOWN_" LegacyDict1["#Hotkey"] = "_NOT_SHOWN_" LegacyDict1["#Disabled"] = true LegacyDict1["#Hidden"] = true Legacy.append(LegacyDict1) Custom["Legacy"] = Legacy // MARK: GUI->Custom->Tool var Tool = [Any]() var ToolDict1 = [String: Any]() ToolDict1["#Volume"] = "VolumeUUID_NOT_SHOWN" ToolDict1["#Path"] = "_NOT_SHOWN_" ToolDict1["#Type"] = "_NOT_SHOWN_" ToolDict1["#Title"] = "_NOT_SHOWN_" ToolDict1["#Arguments"] = "_NOT_SHOWN_" ToolDict1["#Hotkey"] = "_NOT_SHOWN_" ToolDict1["#Disabled"] = true ToolDict1["#Hidden"] = true Tool.append(ToolDict1) Custom["Tool"] = Tool GUI["Custom"] = Custom self.config["GUI"] = GUI // MARK: KernelAndKextPatches var KernelAndKextPatches = [String : Any]() KernelAndKextPatches["#Debug"] = s.kpValue(for: "KPDebug", type: .BOOLEAN) KernelAndKextPatches["KernelCpu"] = s.kpValue(for: "KPKernelCpu", type: .BOOLEAN) KernelAndKextPatches["KernelLapic"] = s.kpValue(for: "KPKernelLapic", type: .BOOLEAN) if AppSD.CloverRevision >= 4250 { KernelAndKextPatches["KernelXCPM"] = s.kpValue(for: "KPKernelXCPM", type: .BOOLEAN) } else { KernelAndKextPatches["KernelIvyXCPM"] = s.kpValue(for: "KernelIvyXCPM", type: .BOOLEAN) } KernelAndKextPatches["KernelPm"] = s.kpValue(for: "KPKernelPm", type: .BOOLEAN) if AppSD.CloverRevision >= 4152 { KernelAndKextPatches["AppleIntelCPUPM"] = s.kpValue(for: "KPAppleIntelCPUPM", type: .BOOLEAN) } else { KernelAndKextPatches["AsusAICPUPM"] = s.kpValue(for: "KPAsusAICPUPM", type: .BOOLEAN) } KernelAndKextPatches["AppleRTC"] = s.kpValue(for: "KPAppleRTC", type: .BOOLEAN) KernelAndKextPatches["DellSMBIOSPatch"] = s.kpValue(for: "KPDELLSMBIOS", type: .BOOLEAN) KernelAndKextPatches["#Number of KextsToPatch"] = s.kpValue(for: "NrKexts", type: .INTEGER) KernelAndKextPatches["#Number of Patchs To Kernel"] = s.kpValue(for: "NrKernels", type: .INTEGER) KernelAndKextPatches["#FakeCPUID"] = s.kpValue(for: "FakeCPUID", type: .HexString) // MARK: KernelAndKextPatches->KextsToPatch var KextsToPatch = [Any]() var KextsToPatchDict1 = [String : Any]() KextsToPatchDict1["Comment"] = "this is a sample" KextsToPatchDict1["#Name"] = "AppleUSBXHCIPCI" KextsToPatchDict1["#Find"] = "_NOT_SHOWN_" KextsToPatchDict1["#Replace"] = "_NOT_SHOWN_" if AppSD.CloverRevision >= 3327 { KextsToPatchDict1["#Disabled"] = true } if AppSD.CloverRevision >= 3580 { KextsToPatchDict1["#MatchOS"] = "10.11.6,10.12.x" } if AppSD.CloverRevision >= 3920 { KextsToPatchDict1["#MatchBuild"] = "16D1111" } KextsToPatch.append(KextsToPatchDict1) KernelAndKextPatches["#KextsToPatch"] = KextsToPatch self.config["KernelAndKextPatches"] = KernelAndKextPatches // MARK: RtVariables if AppSD.CloverRevision >= 3250 { var RtVariables = [String : Any]() RtVariables["#ROM"] = "UseMacAddr0" RtVariables["#MLB"] = s.value(for: "BoardSerialNumber", type: .CHAR8String) RtVariables["CsrActiveConfig"] = s.value(for: "CsrActiveConfig", type: .HexString) RtVariables["BooterConfig"] = s.value(for: "BooterConfig", type: .HexString) self.config["RtVariables"] = RtVariables } // MARK: SMBIOS var SMBIOS = [String: Any]() // SMBIOS TYPE0 SMBIOS["BiosVendor"] = s.value(for: "VendorName", type: .CHAR8String) SMBIOS["BiosVersion"] = s.value(for: "RomVersion", type: .CHAR8String) SMBIOS["BiosReleaseDate"] = s.value(for: "ReleaseDate", type: .CHAR8String) // SMBIOS TYPE1 SMBIOS["Manufacturer"] = s.value(for: "ManufactureName", type: .CHAR8String) SMBIOS["ProductName"] = s.value(for: "ProductName", type: .CHAR8String) SMBIOS["Version"] = s.value(for: "VersionNr", type: .CHAR8String) SMBIOS["SerialNumber"] = s.value(for: "SerialNr", type: .CHAR8String) SMBIOS["SmUUID"] = s.value(for: "SmUUID", type: .UUIDString) SMBIOS["Family"] = s.value(for: "FamilyName", type: .CHAR8String) // SMBIOS TYPE2 SMBIOS["BoardManufacturer"] = s.value(for: "BoardManufactureName", type: .CHAR8String) SMBIOS["BoardSerialNumber"] = s.value(for: "BoardSerialNumber", type: .CHAR8String) SMBIOS["Board-ID"] = s.value(for: "BoardNumber", type: .CHAR8String) SMBIOS["BoardVersion"] = s.value(for: "BoardVersion", type: .CHAR8String) SMBIOS["BoardType"] = s.value(for: "BoardType", type: .INTEGER) SMBIOS["LocationInChassis"] = s.value(for: "LocationInChassis", type: .CHAR8String) SMBIOS["ChassisManufacturer"] = s.value(for: "ChassisManufacturer", type: .CHAR8String) SMBIOS["ChassisAssetTag"] = s.value(for: "ChassisAssetTag", type: .CHAR8String) SMBIOS["ChassisType"] = s.value(for: "ChassisType", type: .HexString) SMBIOS["Mobile"] = s.value(for: "Mobile", type: .BOOLEAN) // SMBIOS TYPE17 SMBIOS["Trust"] = s.value(for: "TrustSMBIOS", type: .BOOLEAN) SMBIOS["OEMProduct"] = s.value(for: "OEMProduct", type: .CHAR8String) SMBIOS["OEMVendor"] = s.value(for: "OEMVendor", type: .CHAR8String) SMBIOS["OEMBoard"] = s.value(for: "OEMBoard", type: .CHAR8String) if AppSD.CloverRevision >= 3368 { if (s.PlatformFeature != 0xFFFF) { SMBIOS["PlatformFeature"] = s.value(for: "PlatformFeature", type: .HexString) } } if s.labels.contains("InjectMemoryTables") && NSNumber(value: s.InjectMemoryTables).boolValue { // MARK: SMBIOS->Memory var Memory = [String: Any]() Memory["Comment"] = "there are no real data here" Memory["#SlotCount"] = 0 Memory["#Channels"] = 0 // MARK: SMBIOS->Memory->Modules var Modules = [Any]() var ModulesDict1 = [String: Any]() ModulesDict1["#Slot"] = 0 ModulesDict1["#Size"] = 0 ModulesDict1["#Vendor"] = s.value(for: "MemoryManufacturer", type: .CHAR8String) ModulesDict1["#Serial"] = s.value(for: "MemorySerialNumber", type: .CHAR8String) ModulesDict1["#Part"] = s.value(for: "MemoryPartNumber", type: .CHAR8String) ModulesDict1["#Frequency"] = s.value(for: "MemorySpeed", type: .CHAR8String) ModulesDict1["#Type"] = "DDRx" Modules.append(ModulesDict1) Memory["Modules"] = Modules SMBIOS["Memory"] = Memory } // MARK: SMBIOS->Slots var Slots = [Any]() var SlotsDict1 = [String: Any]() SlotsDict1["Comment"] = "there is a sample" SlotsDict1["Device"] = "WIFI" SlotsDict1["ID"] = 5 SlotsDict1["Type"] = 1 SlotsDict1["Name"] = "Airport" Slots.append(SlotsDict1) SMBIOS["Slots"] = Slots self.config["SMBIOS"] = SMBIOS // MARK: SystemParameters var SystemParameters = [String: Any]() SystemParameters["CustomUUID"] = s.value(for: "CustomUuid", type: .CHAR16String) SystemParameters["InjectSystemID"] = s.value(for: "InjectSystemID", type: .BOOLEAN) SystemParameters["BacklightLevel"] = s.value(for: "BacklightLevel", type: .HexString) SystemParameters["NvidiaWeb"] = s.value(for: "NvidiaWeb", type: .BOOLEAN) SystemParameters["#InjectKexts"] = "Detect" self.config["SystemParameters"] = SystemParameters return self.config } return nil } }