CloverBootloader/CloverApp/Clover/GengConfig.swift
vectorsigma72 e8a29b1a29 Clover.app v1.16 with clover-genconfig ability
The internal parser is  retro compatible with old Clover revisions since r3250. This is possible because a check for the existence of any variable inside SETTING_DATA structure is performed before the call. Variables are all accessed using the label property of the Mirror class, so as a string.
2020-03-01 15:16:28 +01:00

865 lines
33 KiB
Swift
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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..<data.count {
str += String(format:"%02x", data[i])
if str.count == 8
|| str.count == 13
|| str.count == 18
|| str.count == 23 {
str += "-"
}
}
return str
}
}
// MARK: SETTINGS_DATA_TYPE
enum SETTINGS_DATA_TYPE: Double {
case CHAR8String
case CHAR16String
case DataString
case HexString
case BOOLEAN
case INTEGER
case UUIDString
}
extension SETTINGS_DATA {
var labels: [String] {
return Mirror(reflecting: self).labels
}
func getDSDTFixes() -> [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..<FixesNew.count {
let fix = FixesNew[i]
Fixes[fix] = (FixDsdt & 1 << i) > 0
}
} else {
for i in 0..<FixesOld.count {
let fix = FixesOld[i]
Fixes[fix] = (FixDsdt & 1 << i) > 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..<dsms.count {
let fix = dsms[i]
dict[fix] = (DropOEM_DSM & 1 << i) > 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: "SerialNr", type: .CHAR8String)
SMBIOS["SerialNumber"] = s.value(for: "ReleaseDate", 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
}
}