Compare commits

..

No commits in common. "main" and "3.2.0" have entirely different histories.
main ... 3.2.0

96 changed files with 1727 additions and 3078 deletions

1
.gitignore vendored
View File

@ -4,4 +4,3 @@
.Trashes
ehthumbs.db
Thumbs.db
logs

4
.gitmodules vendored
View File

@ -1,4 +0,0 @@
[submodule "tools/GenSMBIOS"]
path = tools/GenSMBIOS
url = https://github.com/jaminmc/GenSMBIOS.git
branch = AddCli

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 KiB

View File

@ -1,163 +0,0 @@
[device "ehci"]
driver = "ich9-usb-ehci1"
multifunction = "on"
bus = "pcie.0"
addr = "1d.7"
[device "uhci-1"]
driver = "ich9-usb-uhci1"
multifunction = "on"
bus = "pcie.0"
addr = "1d.0"
masterbus = "ehci.0"
firstport = "0"
[device "uhci-2"]
driver = "ich9-usb-uhci2"
multifunction = "on"
bus = "pcie.0"
addr = "1d.1"
masterbus = "ehci.0"
firstport = "2"
[device "uhci-3"]
driver = "ich9-usb-uhci3"
multifunction = "on"
bus = "pcie.0"
addr = "1d.2"
masterbus = "ehci.0"
firstport = "4"
[device "ehci-2"]
driver = "ich9-usb-ehci2"
multifunction = "on"
bus = "pcie.0"
addr = "1a.7"
[device "uhci-4"]
driver = "ich9-usb-uhci4"
multifunction = "on"
bus = "pcie.0"
addr = "1a.0"
masterbus = "ehci-2.0"
firstport = "0"
[device "uhci-5"]
driver = "ich9-usb-uhci5"
multifunction = "on"
bus = "pcie.0"
addr = "1a.1"
masterbus = "ehci-2.0"
firstport = "2"
[device "uhci-6"]
driver = "ich9-usb-uhci6"
multifunction = "on"
bus = "pcie.0"
addr = "1a.2"
masterbus = "ehci-2.0"
firstport = "4"
# FIXME: Remove this audio0 device at the next possible time
# see: https://pve.proxmox.com/pipermail/pve-devel/2019-July/038417.html
# https://pve.proxmox.com/pipermail/pve-devel/2019-July/038428.html
[device "audio0"]
driver = "ich9-intel-hda"
bus = "pcie.0"
addr = "1b.0"
[device "ich9-pcie-port-1"]
driver = "pcie-root-port"
x-speed = "16"
x-width = "32"
multifunction = "on"
bus = "pcie.0"
addr = "1c.0"
port = "1"
chassis = "1"
[device "ich9-pcie-port-2"]
driver = "pcie-root-port"
x-speed = "16"
x-width = "32"
multifunction = "on"
bus = "pcie.0"
addr = "1c.1"
port = "2"
chassis = "2"
[device "ich9-pcie-port-3"]
driver = "pcie-root-port"
x-speed = "16"
x-width = "32"
multifunction = "on"
bus = "pcie.0"
addr = "1c.2"
port = "3"
chassis = "3"
[device "ich9-pcie-port-4"]
driver = "pcie-root-port"
x-speed = "16"
x-width = "32"
multifunction = "on"
bus = "pcie.0"
addr = "1c.3"
port = "4"
chassis = "4"
##
# Example PCIe switch with two downstream ports
#
#[device "pcie-switch-upstream-port-1"]
# driver = "x3130-upstream"
# bus = "ich9-pcie-port-4"
# addr = "00.0"
#
#[device "pcie-switch-downstream-port-1-1"]
# driver = "xio3130-downstream"
# multifunction = "on"
# bus = "pcie-switch-upstream-port-1"
# addr = "00.0"
# port = "1"
# chassis = "5"
#
#[device "pcie-switch-downstream-port-1-2"]
# driver = "xio3130-downstream"
# multifunction = "on"
# bus = "pcie-switch-upstream-port-1"
# addr = "00.1"
# port = "1"
# chassis = "6"
[device "pcidmi"]
driver = "i82801b11-bridge"
bus = "pcie.0"
addr = "1e.0"
[device "pci.0"]
driver = "pci-bridge"
bus = "pcidmi"
addr = "1.0"
chassis_nr = "1"
[device "pci.1"]
driver = "pci-bridge"
bus = "pcidmi"
addr = "2.0"
chassis_nr = "2"
[device "pci.2"]
driver = "pci-bridge"
bus = "pcidmi"
addr = "3.0"
chassis_nr = "3"
[device "pci.3"]
driver = "pci-bridge"
bus = "pcidmi"
addr = "4.0"
chassis_nr = "4"

View File

@ -1,78 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key># Patch for BCM/Bluetooth in Proxmox/Virtualization Environment</key>
<string></string>
<key># DISCORD: http://hackintosh.one/s/discord</key>
<string></string>
<key># BY: https://luchina.com.br</key>
<string></string>
<key>Kernel</key>
<dict>
<key>Patch</key>
<array>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>BCM/BT Patch for macOS in Virtual Environment - Sonoma and Sequoia - Part 1 - Universo Hackintosh</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>aGliZXJuYXRlaGlkcmVhZHkAaGliZXJuYXRlY291bnQA</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>23.0.0</string>
<key>Replace</key>
<data>aGliZXJuYXRlaGlkcmVhZHkAaHZfdm1tX3ByZXNlbnQA</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>BCM/BT Patch for macOS in Virtual Environment - Sonoma and Sequoia - Part 2 - Universo Hackintosh</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>Ym9vdCBzZXNzaW9uIFVVSUQAaHZfdm1tX3ByZXNlbnQA</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>23.0.0</string>
<key>Replace</key>
<data>Ym9vdCBzZXNzaW9uIFVVSUQAaGliZXJuYXRlY291bnQA</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
</array>
</dict>
</dict>
</plist>

View File

@ -1,18 +0,0 @@
macOS/VM Crash when try connect in WiFi [for BCM94360, in macOS Sonoma or Sequoia]
1. Run osx-setup and choose option '200 - Add Promox VE NO Subscription repository'
2. Install Kernel/PVE pve-kernel-5.15.53-1-pve
apt update
apt install pve-kernel-5.15.53-1-pve
3. Add in the proxmox-boot-tool and pin kernel version '5.15.53-1-pve'
proxmox-boot-tool kernel list
proxmox-boot-tool kernel add 5.15.53-1-pve
proxmox-boot-tool refresh
proxmox-boot-tool kernel pin 5.15.53-1-pve
proxmox-boot-tool kernel list
4. Reboot and try connect WiFi in macOS

View File

@ -1,58 +0,0 @@
CPU BrandString: Intel Core 2 Duo P9xxx (Penryn Class Core 2)
MicrocodeRevision: 0x00000001
Virtualization 1
CPUID 00010673 00040800 9EB83201 178BFBFF
ExtSigEcx 00000001
ExtSigEdx 20100800
Type 0x00
Family 0x06
Model 0x17
ExtModel 0x01
ExtFamily 0x00
Stepping 0x03
Features 0x9EB83201178BFBFF
ExtFeatures 0x0000000120100800
Signature 0x00010673
Brand 0x00
AppleProcessorType 0x0301
CstConfigLock 0
CpuGeneration 4
MaxId 0x0000000D
MaxExtId 0x80000008
PackageCount 1
CoreCount 4
ThreadCount 4
ExternalClock 1000
ARTFrequency 0
CPUFrequency 3400212000
CPUFrequencyFromTSC 0
CPUFrequencyFromART 0
TscAdjust 0
CPUFrequencyFromApple 0
CPUFrequencyFromVMT 3400212000
FSBFrequency 1000000000
CPU00:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU01:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU02:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU03:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8

View File

@ -1,68 +0,0 @@
1. Vendor ID: 0x8086, Device ID: 0x29C0, RevisionID: 0x00, ClassCode: 0x060000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
2. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
3. Vendor ID: 0x1022, Device ID: 0x1487, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD,
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
4. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
5. Vendor ID: 0x14E4, Device ID: 0x43A0, RevisionID: 0x03, ClassCode: 0x028000, SubsystemVendorID: 0x106B, SubsystemID: 0x0117,
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
6. Vendor ID: 0x8086, Device ID: 0x2937, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x0)
7. Vendor ID: 0x8086, Device ID: 0x2938, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x1)
8. Vendor ID: 0x8086, Device ID: 0x2939, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x2)
9. Vendor ID: 0x8086, Device ID: 0x293C, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x7)
10. Vendor ID: 0x8086, Device ID: 0x293E, RevisionID: 0x03, ClassCode: 0x040300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1B,0x0)
11. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
12. Vendor ID: 0x1002, Device ID: 0x73FF, RevisionID: 0xC3, ClassCode: 0x030000, SubsystemVendorID: 0x1002, SubsystemID: 0x0E36,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
13. Vendor ID: 0x1002, Device ID: 0xAB28, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1002, SubsystemID: 0xAB28,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
14. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
15. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x1486,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
16. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
17. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x148C,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
18. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
19. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1458, SubsystemID: 0x5007,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
20. Vendor ID: 0x8086, Device ID: 0x2934, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x0)
21. Vendor ID: 0x8086, Device ID: 0x2935, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x1)
22. Vendor ID: 0x8086, Device ID: 0x2936, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x2)
23. Vendor ID: 0x8086, Device ID: 0x293A, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x7)
24. Vendor ID: 0x8086, Device ID: 0x244E, RevisionID: 0x92, ClassCode: 0x060401,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
25. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
26. Vendor ID: 0x1AF4, Device ID: 0x1003, RevisionID: 0x00, ClassCode: 0x078000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
27. Vendor ID: 0x1AF4, Device ID: 0x1001, RevisionID: 0x00, ClassCode: 0x010000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
28. Vendor ID: 0x15AD, Device ID: 0x07B0, RevisionID: 0x01, ClassCode: 0x020000, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
29. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
30. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
31. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
32. Vendor ID: 0x8086, Device ID: 0x2918, RevisionID: 0x02, ClassCode: 0x060100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
33. Vendor ID: 0x8086, Device ID: 0x2922, RevisionID: 0x02, ClassCode: 0x010601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
34. Vendor ID: 0x8086, Device ID: 0x2930, RevisionID: 0x02, ClassCode: 0x0C0500, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)

View File

@ -1,130 +0,0 @@
CPU BrandString: Intel Core 2 Duo P9xxx (Penryn Class Core 2)
MicrocodeRevision: 0x00000001
Virtualization 1
CPUID 00010673 00100800 9EB83201 178BFBFF
ExtSigEcx 00000001
ExtSigEdx 20100800
Type 0x00
Family 0x06
Model 0x17
ExtModel 0x01
ExtFamily 0x00
Stepping 0x03
Features 0x9EB83201178BFBFF
ExtFeatures 0x0000000120100800
Signature 0x00010673
Brand 0x00
AppleProcessorType 0x0301
CstConfigLock 0
CpuGeneration 3
MaxId 0x0000000D
MaxExtId 0x80000008
PackageCount 1
CoreCount 16
ThreadCount 16
ExternalClock 1000
ARTFrequency 0
CPUFrequency 3400205000
CPUFrequencyFromTSC 0
CPUFrequencyFromART 0
TscAdjust 0
CPUFrequencyFromApple 0
CPUFrequencyFromVMT 3400205000
FSBFrequency 1000000000
CPU00:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU01:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU02:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU03:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU04:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU05:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU06:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU07:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU08:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU09:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU10:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU11:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU12:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU13:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU14:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU15:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8

View File

@ -1,52 +0,0 @@
1. Vendor ID: 0x8086, Device ID: 0x29C0, RevisionID: 0x00, ClassCode: 0x060000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
2. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
3. Vendor ID: 0x14E4, Device ID: 0x43A0, RevisionID: 0x03, ClassCode: 0x028000, SubsystemVendorID: 0x106B, SubsystemID: 0x0117,
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
4. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
5. Vendor ID: 0x1022, Device ID: 0x1487, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD,
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
6. Vendor ID: 0x8086, Device ID: 0x293E, RevisionID: 0x03, ClassCode: 0x040300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1B,0x0)
7. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
8. Vendor ID: 0x1002, Device ID: 0x73BF, RevisionID: 0xC0, ClassCode: 0x030000, SubsystemVendorID: 0x1DA2, SubsystemID: 0x440E,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
9. Vendor ID: 0x1002, Device ID: 0xAB28, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1002, SubsystemID: 0xAB28,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
10. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
11. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x1486,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
12. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
13. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x148C,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
14. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
15. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1458, SubsystemID: 0x5007,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
16. Vendor ID: 0x8086, Device ID: 0x244E, RevisionID: 0x92, ClassCode: 0x060401,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
17. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
18. Vendor ID: 0x1AF4, Device ID: 0x1003, RevisionID: 0x00, ClassCode: 0x078000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
19. Vendor ID: 0x1AF4, Device ID: 0x1001, RevisionID: 0x00, ClassCode: 0x010000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
20. Vendor ID: 0x15AD, Device ID: 0x07B0, RevisionID: 0x01, ClassCode: 0x020000, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
21. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
22. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
23. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
24. Vendor ID: 0x8086, Device ID: 0x2918, RevisionID: 0x02, ClassCode: 0x060100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
25. Vendor ID: 0x8086, Device ID: 0x2922, RevisionID: 0x02, ClassCode: 0x010601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
26. Vendor ID: 0x8086, Device ID: 0x2930, RevisionID: 0x02, ClassCode: 0x0C0500, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)

View File

@ -1,58 +0,0 @@
CPU BrandString: Intel Core 2 Duo P9xxx (Penryn Class Core 2)
MicrocodeRevision: 0x00000001
Virtualization 1
CPUID 00010673 00040800 9EB83201 178BFBFF
ExtSigEcx 00000001
ExtSigEdx 20100800
Type 0x00
Family 0x06
Model 0x17
ExtModel 0x01
ExtFamily 0x00
Stepping 0x03
Features 0x9EB83201178BFBFF
ExtFeatures 0x0000000120100800
Signature 0x00010673
Brand 0x00
AppleProcessorType 0x0301
CstConfigLock 0
CpuGeneration 4
MaxId 0x0000000D
MaxExtId 0x80000008
PackageCount 1
CoreCount 4
ThreadCount 4
ExternalClock 1000
ARTFrequency 0
CPUFrequency 3400193000
CPUFrequencyFromTSC 0
CPUFrequencyFromART 0
TscAdjust 0
CPUFrequencyFromApple 0
CPUFrequencyFromVMT 3400193000
FSBFrequency 1000000000
CPU00:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU01:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU02:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8
CPU03:
MSR_IA32_MISC_ENABLE: 0x1
MSR_IA32_EXT_CONFIG: 0x0
MSR_FSB_FREQ: 0x3
MSR_IA32_PERF_STATUS: 0x400000003E8

View File

@ -1,68 +0,0 @@
1. Vendor ID: 0x8086, Device ID: 0x29C0, RevisionID: 0x00, ClassCode: 0x060000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
2. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
3. Vendor ID: 0x1022, Device ID: 0x1487, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD,
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
4. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
5. Vendor ID: 0x14E4, Device ID: 0x43A0, RevisionID: 0x03, ClassCode: 0x028000, SubsystemVendorID: 0x106B, SubsystemID: 0x0117,
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
6. Vendor ID: 0x8086, Device ID: 0x2937, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x0)
7. Vendor ID: 0x8086, Device ID: 0x2938, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x1)
8. Vendor ID: 0x8086, Device ID: 0x2939, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x2)
9. Vendor ID: 0x8086, Device ID: 0x293C, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1A,0x7)
10. Vendor ID: 0x8086, Device ID: 0x293E, RevisionID: 0x03, ClassCode: 0x040300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1B,0x0)
11. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
12. Vendor ID: 0x1002, Device ID: 0x73FF, RevisionID: 0xC3, ClassCode: 0x030000, SubsystemVendorID: 0x1002, SubsystemID: 0x0E36,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
13. Vendor ID: 0x1002, Device ID: 0xAB28, RevisionID: 0x00, ClassCode: 0x040300, SubsystemVendorID: 0x1002, SubsystemID: 0xAB28,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
14. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
15. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x1486,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
16. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
17. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1022, SubsystemID: 0x148C,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
18. Vendor ID: 0x1B36, Device ID: 0x000C, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
19. Vendor ID: 0x1022, Device ID: 0x149C, RevisionID: 0x00, ClassCode: 0x0C0330, SubsystemVendorID: 0x1458, SubsystemID: 0x5007,
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
20. Vendor ID: 0x8086, Device ID: 0x2934, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x0)
21. Vendor ID: 0x8086, Device ID: 0x2935, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x1)
22. Vendor ID: 0x8086, Device ID: 0x2936, RevisionID: 0x03, ClassCode: 0x0C0300, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x2)
23. Vendor ID: 0x8086, Device ID: 0x293A, RevisionID: 0x03, ClassCode: 0x0C0320, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1D,0x7)
24. Vendor ID: 0x8086, Device ID: 0x244E, RevisionID: 0x92, ClassCode: 0x060401,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
25. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
26. Vendor ID: 0x1AF4, Device ID: 0x1003, RevisionID: 0x00, ClassCode: 0x078000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
27. Vendor ID: 0x1AF4, Device ID: 0x1001, RevisionID: 0x00, ClassCode: 0x010000, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
28. Vendor ID: 0x15AD, Device ID: 0x07B0, RevisionID: 0x01, ClassCode: 0x020000, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
29. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
30. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
31. Vendor ID: 0x1B36, Device ID: 0x0001, RevisionID: 0x00, ClassCode: 0x060400,
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
32. Vendor ID: 0x8086, Device ID: 0x2918, RevisionID: 0x02, ClassCode: 0x060100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
33. Vendor ID: 0x8086, Device ID: 0x2922, RevisionID: 0x02, ClassCode: 0x010601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
34. Vendor ID: 0x8086, Device ID: 0x2930, RevisionID: 0x02, ClassCode: 0x0C0500, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100,
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)

View File

@ -1,42 +0,0 @@
CPU BrandString: Intel Xeon Processor (Cascadelake)
MicrocodeRevision: 0x00000001
Virtualization 1
CPUID 00050656 00040800 FFF83203 178BFBFF
ExtSigEcx 00000121
ExtSigEdx 2C100800
Type 0x00
Family 0x06
Model 0x55
ExtModel 0x05
ExtFamily 0x00
Stepping 0x06
Features 0xFFF83203178BFBFF
ExtFeatures 0x000001212C100800
Signature 0x00050656
Brand 0x00
AppleProcessorType 0x0501
CstConfigLock 0
CpuGeneration 14
MaxId 0x0000000D
MaxExtId 0x80000008
PackageCount 1
CoreCount 4
ThreadCount 4
ExternalClock 1000
ARTFrequency 0
CPUFrequency 3400203000
CPUFrequencyFromTSC 0
CPUFrequencyFromART 0
TscAdjust 0
CPUFrequencyFromApple 0
CPUFrequencyFromVMT 3400203000
FSBFrequency 1000000000
CPU00:
CPU01:
CPU02:
CPU03:

View File

@ -1,57 +0,0 @@
PCI Bus Driver
Virtio PCI Driver
Virtio 1.0 PCI Driver
Virtio Block Driver
Virtio SCSI Host Driver
Virtio Random Number Generator Driver
PVSCSI Host Driver
Platform Console Management Driver
Console Splitter Driver
Graphics Console Driver
Serial Terminal Driver
Generic Disk I/O Driver
Partition Driver(MBR/GPT/El Torito)
SCSI Bus Driver
Scsi Disk Driver
Sata Controller Init Driver
AtaAtapiPassThru Driver
ATA Bus Driver
NVM Express Driver
OVMF Sio Bus Driver
PCI SIO Serial Driver
PS/2 Keyboard Driver
FAT File System Driver
UDF File System Driver
Virtio Filesystem Driver
Simple Network Protocol Driver
VLAN Configuration Driver
MNP Network Service Driver
ARP Network Service Driver
DHCP Protocol Driver
IP4 Network Service Driver
UDP Network Service Driver
MTFTP4 Network Service
DHCP6 Protocol Driver
IP6 Network Service Driver
UDP6 Network Service Driver
MTFTP6 Network Service Driver
TCP Network Service Driver
UEFI PXE Base Code Driver
DNS Network Service Driver
HttpDxe
UEFI HTTP Boot Driver
iSCSI Driver
Virtio Network Driver
Usb Uhci Driver
Usb Ehci Driver
Usb Xhci Driver
Usb Bus Driver
Usb Keyboard Driver
Usb Mass Storage Driver
QEMU Video Driver
Virtio GPU Driver
AMD GOP X64 Release Driver Rev.1.65.0.15.50.Sep 28 2017.15:11:11
15ad07b0.efidrv
HFS File System Driver
Usb Mouse Driver
APFS

View File

@ -1,7 +0,0 @@
GOP INFO 2560(2560)x1440 fmt 1
GOP FB 0x800000000[0xE10000]
GOP BPP 4 - Success
GOP FBS 0xE10000 - Success
MTRR supported PAT supported
PAT 0x0007040600070406 (default)
0x800000000~0x800000000 MTRR 0=UC PTE1 bits 0x0000000800000083 PAT@0->6=WB

View File

@ -1,100 +0,0 @@
01. Bridge device - Host bridge
Vendor ID: 0x0001, Device ID: 0x8086, RevisionID: 0x29C0, ClassCode: 0x000600, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
DevicePath: PciRoot(0x0)/Pci(0x0,0x0)
02. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0002, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)
03. Multimedia controller - High definition audio device
Vendor ID: 0x0003, Device ID: 0x1022, RevisionID: 0x1487, ClassCode: 0x000403, SubsystemVendorID: 0x1458, SubsystemID: 0xA0CD
DevicePath: PciRoot(0x0)/Pci(0x10,0x0)/Pci(0x0,0x0)
04. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0004, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)
05. Network controller - Other network controller
Vendor ID: 0x0005, Device ID: 0x14E4, RevisionID: 0x43A0, ClassCode: 0x030280, SubsystemVendorID: 0x106B, SubsystemID: 0x0111
DevicePath: PciRoot(0x0)/Pci(0x10,0x1)/Pci(0x0,0x0)
06. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0006, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)
07. Display controller - VGA-compatible controller
Vendor ID: 0x0007, Device ID: 0x1002, RevisionID: 0x67DF, ClassCode: 0xE70300, SubsystemVendorID: 0x1849, SubsystemID: 0x5001
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)
08. Multimedia controller - High definition audio device
Vendor ID: 0x0008, Device ID: 0x1002, RevisionID: 0xAAF0, ClassCode: 0x000403, SubsystemVendorID: 0x1849, SubsystemID: 0xAAF0
DevicePath: PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x1)
09. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0009, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)
10. Serial bus controller - Universal Serial Bus xHCI controller
Vendor ID: 0x000A, Device ID: 0x1022, RevisionID: 0x149C, ClassCode: 0x000C03, SubsystemVendorID: 0x1022, SubsystemID: 0x1486
DevicePath: PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)
11. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x000B, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)
12. Serial bus controller - Universal Serial Bus xHCI controller
Vendor ID: 0x000C, Device ID: 0x1022, RevisionID: 0x149C, ClassCode: 0x000C03, SubsystemVendorID: 0x1022, SubsystemID: 0x148C
DevicePath: PciRoot(0x0)/Pci(0x1C,0x2)/Pci(0x0,0x0)
13. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x000D, Device ID: 0x1B36, RevisionID: 0x0C, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)
14. Serial bus controller - Universal Serial Bus xHCI controller
Vendor ID: 0x000E, Device ID: 0x1022, RevisionID: 0x149C, ClassCode: 0x000C03, SubsystemVendorID: 0x1458, SubsystemID: 0x5007
DevicePath: PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)
15. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x000F, Device ID: 0x8086, RevisionID: 0x244E, ClassCode: 0x920604
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)
16. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0010, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)
17. Simple communications controller - Other communications device
Vendor ID: 0x0011, Device ID: 0x1AF4, RevisionID: 0x1003, ClassCode: 0x000780, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0003
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x8,0x0)
18. Mass storage controller - SCSI controller
Vendor ID: 0x0012, Device ID: 0x1AF4, RevisionID: 0x1001, ClassCode: 0x000100, SubsystemVendorID: 0x1AF4, SubsystemID: 0x0002
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0xA,0x0)
19. Network controller - Ethernet controller
Vendor ID: 0x0013, Device ID: 0x15AD, RevisionID: 0x7B0, ClassCode: 0x010200, SubsystemVendorID: 0x15AD, SubsystemID: 0x07B0
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x1,0x0)/Pci(0x12,0x0)
20. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0014, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x2,0x0)
21. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0015, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x3,0x0)
22. Bridge device - PCI-to-PCI bridge
Vendor ID: 0x0016, Device ID: 0x1B36, RevisionID: 0x01, ClassCode: 0x000604
DevicePath: PciRoot(0x0)/Pci(0x1E,0x0)/Pci(0x4,0x0)
23. Bridge device - ISA bridge
Vendor ID: 0x0017, Device ID: 0x8086, RevisionID: 0x2918, ClassCode: 0x020601, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
DevicePath: PciRoot(0x0)/Pci(0x1F,0x0)
24. Mass storage controller - Serial ATA controller using AHCI
Vendor ID: 0x0018, Device ID: 0x8086, RevisionID: 0x2922, ClassCode: 0x020106, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
DevicePath: PciRoot(0x0)/Pci(0x1F,0x2)
25. Serial bus controller - SMBus controller
Vendor ID: 0x0019, Device ID: 0x8086, RevisionID: 0x2930, ClassCode: 0x020C05, SubsystemVendorID: 0x1AF4, SubsystemID: 0x1100
DevicePath: PciRoot(0x0)/Pci(0x1F,0x3)

View File

@ -1,9 +1,6 @@
OpenCore Changelog
==================
#### Latest versions
- Check history of commits
#### v3.2.0
- Open SOURCE CODE of BINARY \o/

Binary file not shown.

180
README.md
View File

@ -1,166 +1,54 @@
<div align="center">
# 🚀 OSX-PROXMOX - Run macOS on ANY Computer (AMD & Intel)
# OSX-PROXMOX - Run macOS on ANY Computer - AMD & Intel
![GitHub stars](https://img.shields.io/github/stars/luchina-gabriel/osx-proxmox?style=flat-square)
![GitHub forks](https://img.shields.io/github/forks/luchina-gabriel/OSX-PROXMOX?style=flat-square)
![GitHub license](https://img.shields.io/github/license/luchina-gabriel/osx-proxmox?style=flat-square)
![GitHub issues](https://img.shields.io/github/issues/luchina-gabriel/osx-proxmox?style=flat-square)
Install `** FRESH/CLEAN **` Proxmox VE v7.XX - Next, Next & Finish (NNF).
</div>
Open Proxmox Web Console -> Datacenter > NAME OF YOUR HOST > Shell.
![v15 - Sequoia](https://github.com/user-attachments/assets/4efd8874-dbc8-48b6-a485-73f7c38a5e06)
Easily install macOS on Proxmox VE with just a few steps! This guide provides the simplest and most effective way to set up macOS on Proxmox, whether you're using AMD or Intel hardware.
Copy, paste and execute (code below).
---
Voilà, install macOS! This is really and magic **easiest way**!
## 🛠 Installation Guide
## COPY & PASTE - in shell of Proxmox (for Install or Update this solution)
1. Install a **FRESH/CLEAN** version of Proxmox VE (v7.0.XX ~ 8.4.XX) - just follow the Next, Next & Finish (NNF) approach.
* Preliminary support for Proxmox VE V9.0.0 BETA.
2. Open the **Proxmox Web Console** → Navigate to `Datacenter > YOUR_HOST_NAME > Shell`.
3. Copy, paste, and execute the command below:
```bash
```
/bin/bash -c "$(curl -fsSL https://install.osx-proxmox.com)"
```
🎉 Voilà! You can now install macOS!
![osx-terminal](https://github.com/user-attachments/assets/ea81b920-f3e2-422e-b1ff-0d9045adc55e)
---
## Versions of macOS Supported
* macOS High Sierra - 10.13
* macOS Mojave - 10.14
* macOS Catalina - 10.15
* macOS Big Sur - 11
* macOS Monterey - 12
## 🔧 Additional Configuration
## Versions of Proxmox VE Supported
* 7.XX
### Install EFI Package in macOS (Disable Gatekeeper First)
## Opencore version
* January/2022 - 0.7.7 with SIP Enabled, DMG only signed by Apple and all features of securities.
```bash
sudo spctl --master-disable
```
## Cloud Support (Yes, install your Hackintosh in Cloud Environment)
- [VultR](https://www.vultr.com/?ref=9035565-8H)
- [Vídeo/Tutorial](https://youtu.be/8QsMyL-PNrM), please activate captions!
---
## Disclaimer
## 🍏 macOS Versions Supported
✅ macOS High Sierra - 10.13
✅ macOS Mojave - 10.14
✅ macOS Catalina - 10.15
✅ macOS Big Sur - 11
✅ macOS Monterey - 12
✅ macOS Ventura - 13
✅ macOS Sonoma - 14
✅ macOS Sequoia - 15
- FOR DEV/STUDENT/TEST ONLY PURPOSES.
- I'm not responsible for any problem and/or equipment damage or loss of files.
- Always back up everything before any changes to your computer.
---
## Demonstration (in Portuguese/Brazil)
## 🖥 Proxmox VE Versions Supported
✅ v7.0.XX ~ 8.4.XX
https://youtu.be/G51z390XYMA
### 🔄 OpenCore Version
- **April/2025 - 1.0.4** → with SIP Enabled, DMG only signed by Apple and all features of securities
\* Please use CC with Auto Translate to English for your convenience.
---
## Credits
## ☁️ Cloud Support (Run Hackintosh in the Cloud!)
- [🌍 VultR](https://www.vultr.com/?ref=9035565-8H)
- [📺 Video Tutorial](https://youtu.be/8QsMyL-PNrM) (Enable captions for better understanding)
- Now has configurable bridges, and can add as many bridges and specify the subnet for them.
---
## ⚠️ Disclaimer
🚨 **FOR DEVELOPMENT, STUDENT, AND TESTING PURPOSES ONLY.**
I am **not responsible** for any issues, damage, or data loss. Always back up your system before making any changes.
---
## 📌 Requirements
Since macOS Monterey, your host must have a **working TSC (timestamp counter)**. Otherwise, if you assign multiple cores to the VM, macOS may **crash due to time inconsistencies**. To check if your host is compatible, run the following command in Proxmox:
```bash
dmesg | grep -i -e tsc -e clocksource
```
### ✅ Expected Output (for working hosts):
```
clocksource: Switched to clocksource tsc
```
### ❌ Problematic Output (for broken hosts):
```
tsc: Marking TSC unstable due to check_tsc_sync_source failed
clocksource: Switched to clocksource hpet
```
### 🛠 Possible Fixes
1. Disable "ErP mode" and **all C-state power-saving modes** in your BIOS. Then power off your machine completely and restart.
2. Try forcing TSC in GRUB:
- Edit `/etc/default/grub` and add:
```bash
clocksource=tsc tsc=reliable
```
- Run `update-grub` and reboot (This may cause instability).
3. Verify the TSC clock source:
```bash
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
```
The output **must be `tsc`**.
[Read More](https://www.nicksherlock.com/2022/10/installing-macos-13-ventura-on-proxmox/comment-page-1/#comment-55532)
---
## 🔍 Troubleshooting
### ❌ High Sierra & Below - *Recovery Server Could Not Be Contacted*
If you encounter this error, you need to switch from **HTTPS** to **HTTP** in the installation URL:
1. When the error appears, leave the window open.
2. Open **Installer Log** (`Window > Installer Log`).
3. Search for "Failed to load catalog" → Copy the log entry.
4. Close the error message and return to `macOS Utilities`.
5. Open **Terminal**, paste the copied data, and **remove everything except the URL** (e.g., `https://example.sucatalog`).
6. Change `https://` to `http://`.
7. Run the command:
```bash
nvram IASUCatalogURL="http://your-http-url.sucatalog"
```
8. Quit Terminal and restart the installation.
[Reference & More Details](https://mrmacintosh.com/how-to-fix-the-recovery-server-could-not-be-contacted-error-high-sierra-recovery-is-still-online-but-broken/)
### ❌ Problem for GPU Passthrough
If you see an Apple logo and the bar doesnt move on your external display, you need to disable “above 4g decoding” in the motherboards BIOS.
In some environments it is necessary to segment the IOMMU Groups to be able to pass the GPU to the VM.
1. Add the content `pcie_acs_override=downstream,multifunction pci=nommconf` in the file `/etc/default/grub` at the end of the line `GRUB_CMDLINE_LINUX_DEFAULT`;
2. After changing the grub file, run the command `update-grub` and reboot your PVE.
---
## 🎥 Demonstration (in Portuguese)
📽️ [Watch on YouTube](https://youtu.be/dil6iRWiun0)
*(Enable auto-translate captions for English subtitles!)*
---
## 🎖 Credits
- **OpenCore/Acidanthera Team** - Open-source bootloader
- **Corpnewt** - Tools (ProperTree, GenSMBIOS, etc.)
- **Apple** - macOS
- **Proxmox** - Fantastic virtualization platform & documentation
---
## 🌎 Join Our Community - Universo Hackintosh Discord
💬 [**Join Here!**](https://discord.universohackintosh.com.br)
- Opencore/Acidanthera Team
- Corpnewt for Applications (ProperTree, genSMBIOS, etc)
- Apple for macOS
- Proxmox - Excelent and better documentation for Virtualization
## Discord - Universo Hackintosh
- [Discord](https://discord.universohackintosh.com.br)

View File

@ -3,82 +3,42 @@
#########################################################################################################################
#
# Script: install
# Purpose: Install OSX-PROXMOX
# Source: https://luchina.com.br
#
# https://luchina.com.br
#
#########################################################################################################################
# Exit on any error
set -e
# Check if running as root
if [ "$EUID" -ne 0 ]; then
echo "This script must be run as root."
exit 1
fi
# Define log file
LOG_FILE="/root/install-osx-proxmox.log"
# Function to log messages
log_message() {
echo "$1" | tee -a "$LOG_FILE"
}
# Function to check command success
check_status() {
if [ $? -ne 0 ]; then
log_message "Error: $1"
exit 1
fi
}
# Clear screen
clear
# Clean up existing files
log_message "Cleaning up existing files..."
[ -d "/root/OSX-PROXMOX" ] && rm -rf "/root/OSX-PROXMOX"
[ -f "/etc/apt/sources.list.d/pve-enterprise.list" ] && rm -f "/etc/apt/sources.list.d/pve-enterprise.list"
[ -f "/etc/apt/sources.list.d/ceph.list" ] && rm -f "/etc/apt/sources.list.d/ceph.list"
[ -f "/etc/apt/sources.list.d/pve-enterprise.sources" ] && rm -f "/etc/apt/sources.list.d/pve-enterprise.sources"
[ -f "/etc/apt/sources.list.d/ceph.sources" ] && rm -f "/etc/apt/sources.list.d/ceph.sources"
if [ -e /root/OSX-PROXMOX ]; then rm -rf /root/OSX-PROXMOX; fi;
if [ -e /etc/apt/sources.list.d/pve-enterprise.list ]; then rm -rf /etc/apt/sources.list.d/pve-enterprise.list; fi;
log_message "Preparing to install OSX-PROXMOX..."
echo "Waiting install OSX-PROXMOX..."
echo " "
# Update package lists
log_message "Updating package lists..."
apt-get update >> "$LOG_FILE" 2>&1
if [ $? -ne 0 ]; then
log_message "Initial apt-get update failed. Attempting to fix sources..."
# Use main Debian mirror instead of country-specific
sed -i 's/ftp\.[a-z]\{2\}\.debian\.org/ftp.debian.org/g' /etc/apt/sources.list
log_message "Retrying apt-get update..."
apt-get update >> "$LOG_FILE" 2>&1
check_status "Failed to update package lists after source modification"
apt update > /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
if [ $? -ne 0 ]
then
echo " "
echo "Error with 'apt-get update' ..."
echo "Trying to change /etc/apt/sources.list"
echo " "
sed -i 's/ftp.br.debian.org/ftp.debian.org/g' /etc/apt/sources.list
echo "Retrying 'apt-get update' ..."
echo " "
apt-get update >> /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
if [ $? -ne 0 ]; then echo "Error with 'apt-get update' ..."; exit; fi
fi
# Install git
log_message "Installing git..."
apt-get install -y git >> "$LOG_FILE" 2>&1
check_status "Failed to install git"
apt install git -y >> /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
# Clone repository
log_message "Cloning OSX-PROXMOX repository..."
git clone --recurse-submodules https://github.com/luchina-gabriel/OSX-PROXMOX.git /root/OSX-PROXMOX >> "$LOG_FILE" 2>&1
check_status "Failed to clone repository"
git clone https://github.com/luchina-gabriel/OSX-PROXMOX.git >> /tmp/install-osx-proxmox.log 2>> /tmp/install-osx-proxmox.log
# Ensure directory exists and setup is executable
if [ -f "/root/OSX-PROXMOX/setup" ]; then
chmod +x "/root/OSX-PROXMOX/setup"
log_message "Running setup script..."
/root/OSX-PROXMOX/setup 2>&1 | tee -a "$LOG_FILE"
check_status "Failed to run setup script"
else
log_message "Error: Setup script not found in /root/OSX-PROXMOX"
exit 1
fi
if [ ! -e /root/OSX-PROXMOX ]; then mkdir -p /root/OSX-PROXMOX; fi;
log_message "Installation completed successfully"
/root/OSX-PROXMOX/setup

2631
setup

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,16 @@
#!/bin/bash
#
# Script: check-iommu-enabled.sh
# Goal: Check if IOMMU is enabled on your system
# Goal: Check if IOMMU are Enabled in your system
#
# Author: Gabriel Luchina
# https://luchina.com.br
# 20220128T1112
# Check for IOMMU or DMAR messages in dmesg
iommu_check=$(dmesg | grep -E 'DMAR|IOMMU')
if [ -n "$iommu_check" ]; then
if [ `dmesg | grep -e DMAR -e IOMMU | wc -l` -gt 0 ]
then
echo "IOMMU Enabled"
else
echo "IOMMU NOT Enabled"
echo "Ensure 'intel_iommu=on' or 'amd_iommu=on' is present in the 'GRUB_CMDLINE_LINUX_DEFAULT' line of /etc/default/grub"
exit 1
echo "Check file /etc/default/grub contains 'intel_iommu=on' in 'GRUB_CMDLINE_LINUX_DEFAULT' line"
fi

View File

@ -7,8 +7,6 @@
# https://luchina.com.br
# 20211116T2245
set -e
clear
echo -e "\nAutomate script for create \"ISO\" file of macOS Install in Proxmox VE Environament"
@ -16,27 +14,21 @@ echo -e "BY: https://luchina.com.br"
echo -e "SUPPORT: https://osx-proxmox.com"
echo -n -e "\nPath to temporary files (work dir): "
read -r TEMPDIR
read TEMPDIR
echo -n -e "Path to macOS Installation (.app) file: "
read -r APPOSX
read APPOSX
echo " "
## Core
if [ -d "$TEMPDIR" ]; then
cd "$TEMPDIR" || exit 1
rm -rf macOS-install* > /dev/null 2> /dev/null
hdiutil create -o macOS-install -size 16g -layout GPTSPUD -fs HFS+J > /dev/null 2> /dev/null
hdiutil attach -noverify -mountpoint /Volumes/install_build macOS-install.dmg > /dev/null 2> /dev/null
sudo "${APPOSX}/Contents/Resources/createinstallmedia" --volume /Volumes/install_build --nointeraction
hdiutil detach -force "/Volumes/Install macOS"* > /dev/null 2> /dev/null && sleep 3s > /dev/null 2> /dev/null
hdiutil detach -force "/Volumes/Shared Support"* > /dev/null 2> /dev/null
mv macOS-install.dmg macOS-install.iso > /dev/null 2> /dev/null
else
echo "The temporary directory does not exist!"
exit 1
fi
cd ${TEMPDIR} > /dev/null 2> /dev/null
rm -rf macOS-install* > /dev/null 2> /dev/null
hdiutil create -o macOS-install -size 14g -layout GPTSPUD -fs HFS+J > /dev/null 2> /dev/null
hdiutil attach -noverify -mountpoint /Volumes/install_build macOS-install.dmg > /dev/null 2> /dev/null
sudo "${APPOSX}/Contents/Resources/createinstallmedia" --volume /Volumes/install_build --nointeraction
hdiutil detach -force "/Volumes/Install macOS"* > /dev/null 2> /dev/null && sleep 3s > /dev/null 2> /dev/null
hdiutil detach -force "/Volumes/Shared Support"* > /dev/null 2> /dev/null
mv macOS-install.dmg macOS-install.iso > /dev/null 2> /dev/null
echo " "

@ -1 +0,0 @@
Subproject commit 573f5fc375cb52688ccac4312de8422ae263dcf2

View File

@ -5,15 +5,15 @@
#
# Author: Gabriel Luchina
# https://luchina.com.br
# 20250627T2331
# 20211118T0010
#!/bin/bash
shopt -s nullglob
for iommu_group in $(ls /sys/kernel/iommu_groups/ | sort -V); do
echo "IOMMU Group ${iommu_group}:"
for pci_device in /sys/kernel/iommu_groups/$iommu_group/devices/*; do
echo -e "\t$(lspci -nns ${pci_device##*/})"
for group in `ls /sys/kernel/iommu_groups/ | sort -V`
do
echo "IOMMU Group ${group##*/}:"
for device in /sys/kernel/iommu_groups/$group/devices/*
do
echo -e "\t$(lspci -nns ${device##*/})"
done
done

View File

@ -2,7 +2,4 @@
macrecovery is a tool that helps to automate recovery interaction. It can be used to download diagnostics and recovery as well as analyse MLB.
Requires python3 to run. Run with `-h` argument to see all available arguments.
To create a disk image for a virtual machine installation use `build-image.sh`.
Requires python to run. Run with `-h` argument to see all available arguments.

View File

@ -1,79 +1,79 @@
{
"Mac-EE2EBD4B90B839A8": "13.7",
"Mac-BE0E8AC46FE800CC": "11.7.10",
"Mac-9AE82516C7C6B903": "12.7.6",
"Mac-942452F5819B1C1B": "10.13.6",
"Mac-942C5DF58193131B": "10.13.6",
"Mac-C08A6BB70A942AC2": "10.13.6",
"Mac-742912EFDBEE19B3": "10.13.6",
"Mac-66F35F19FE2A0D05": "10.15.7",
"Mac-2E6FAB96566FE58C": "10.15.7",
"Mac-35C1E88140C3E6CF": "11.7.10",
"Mac-7DF21CB3ED6977E5": "11.7.10",
"Mac-9F18E312C5C2BF0B": "12.7.6",
"Mac-937CB26E2E02BB01": "12.7.6",
"Mac-827FAC58A8FDFA22": "14.7",
"Mac-226CB3C6A851A671": "14.7",
"Mac-0CFF9C7C2B63DF8D": "latest",
"Mac-C3EC7CD22292981F": "10.15.7",
"Mac-AFD8A9D944EA4843": "10.15.7",
"Mac-189A3D4F975D5FFC": "11.7.10",
"Mac-3CBD00234E554E41": "11.7.10",
"Mac-2BD1B31983FE1663": "11.7.10",
"Mac-06F11FD93F0323C5": "12.7.6",
"Mac-06F11F11946D27C5": "12.7.6",
"Mac-E43C1C25D4880AD6": "12.7.6",
"Mac-473D31EABEB93F9B": "12.7.6",
"Mac-66E35819EE2D0D05": "12.7.6",
"Mac-A5C67F76ED83108C": "12.7.6",
"Mac-B4831CEBD52A0C4C": "13.7",
"Mac-CAD6701F7CEA0921": "13.7",
"Mac-551B86E5744E2388": "13.7",
"Mac-937A206F2EE63C01": "latest",
"Mac-827FB448E656EC26": "latest",
"Mac-1E7E29AD0135F9BC": "latest",
"Mac-53FDB3D8DB8CA971": "latest",
"Mac-E1008331FDC96864": "latest",
"Mac-5F9802EFE386AA28": "latest",
"Mac-E7203C0F68AA0004": "latest",
"Mac-A61BADE1FDAD7B05": "latest",
"Mac-F22589C8": "10.13.6",
"Mac-94245B3640C91C81": "10.13.6",
"Mac-94245A3940C91C80": "10.13.6",
"Mac-942459F5819B171B": "10.13.6",
"Mac-4B7AC7E43945597E": "10.15.7",
"Mac-6F01561E16C75D06": "10.15.7",
"Mac-F60DEB81FF30ACF6": "12.7.6",
"Mac-27AD2F918AE68F61": "latest",
"Mac-F2208EC8": "10.13.6",
"Mac-8ED6AF5B48C039E1": "10.13.6",
"Mac-4BC72D62AD45599E": "10.13.6",
"Mac-7BA5B2794B2CDB12": "10.13.6",
"Mac-031AEE4D24BFF0B1": "10.15.7",
"Mac-F65AE981FFA204ED": "10.15.7",
"Mac-35C5E08120C7EEAF": "12.7.6",
"Mac-7BA5B2DFE22DDD8C": "latest",
"Mac-942B5BF58194151B": "10.13.6",
"Mac-942B59F58194171B": "10.13.6",
"Mac-00BE6ED71E35EB86": "10.15.7",
"Mac-FC02E91DDD3FA6A4": "10.15.7",
"Mac-7DF2A3B5E5D671ED": "10.15.7",
"Mac-031B6874CF7F642A": "10.15.7",
"Mac-27ADBB7B4CEE8E61": "10.15.7",
"Mac-77EB7D7DAF985301": "10.15.7",
"Mac-81E3E92DD6088272": "11.7.10",
"Mac-42FD25EABCABB274": "11.7.10",
"Mac-A369DDC4E67F1C45": "12.7.6",
"Mac-FFE5EF870D7BA81A": "12.7.6",
"Mac-DB15BD556843C820": "12.7.6",
"Mac-65CE76090165799A": "12.7.6",
"Mac-B809C3757DA9BB8D": "12.7.6",
"Mac-4B682C642B45593E": "13.7",
"Mac-77F17D7DA9285301": "13.7",
"Mac-BE088AF8C5EB4FA2": "13.7",
"Mac-AA95B1DDAB278B95": "latest",
"Mac-63001698E7A34814": "latest",
"Mac-CFF7D910A743CAAF": "latest",
"Mac-AF89B6D9451A490B": "latest",
"Mac-7BA5B2D9E42DDD94": "latest"
"Mac-226CB3C6A851A671": "latest",
"Mac-031B6874CF7F642A": "10.15.7",
"Mac-27AD2F918AE68F61": "latest",
"Mac-AA95B1DDAB278B95": "latest",
"Mac-66E35819EE2D0D05": "latest",
"Mac-7BA5B2D9E42DDD94": "latest",
"Mac-7BA5B2794B2CDB12": "10.13.6",
"Mac-06F11F11946D27C5": "latest",
"Mac-AFD8A9D944EA4843": "10.15.7",
"Mac-942B59F58194171B": "10.13.6",
"Mac-B809C3757DA9BB8D": "latest",
"Mac-7DF2A3B5E5D671ED": "10.15.7",
"Mac-35C1E88140C3E6CF": "11.6.2",
"Mac-942459F5819B171B": "10.13.6",
"Mac-77EB7D7DAF985301": "10.15.7",
"Mac-827FB448E656EC26": "latest",
"Mac-7BA5B2DFE22DDD8C": "latest",
"Mac-2E6FAB96566FE58C": "10.15.7",
"Mac-F2208EC8": "10.13.6",
"Mac-BE0E8AC46FE800CC": "11.6.2",
"Mac-00BE6ED71E35EB86": "10.15.7",
"Mac-4B7AC7E43945597E": "10.15.7",
"Mac-CAD6701F7CEA0921": "latest",
"Mac-63001698E7A34814": "latest",
"Mac-937CB26E2E02BB01": "latest",
"Mac-FFE5EF870D7BA81A": "latest",
"Mac-53FDB3D8DB8CA971": "latest",
"Mac-A61BADE1FDAD7B05": "latest",
"Mac-42FD25EABCABB274": "11.6.2",
"Mac-827FAC58A8FDFA22": "latest",
"Mac-1E7E29AD0135F9BC": "latest",
"Mac-3CBD00234E554E41": "11.6.2",
"Mac-66F35F19FE2A0D05": "10.15.7",
"Mac-189A3D4F975D5FFC": "11.6.2",
"Mac-B4831CEBD52A0C4C": "latest",
"Mac-C08A6BB70A942AC2": "10.13.6",
"Mac-8ED6AF5B48C039E1": "10.13.6",
"Mac-FC02E91DDD3FA6A4": "10.15.7",
"Mac-06F11FD93F0323C5": "latest",
"Mac-9AE82516C7C6B903": "latest",
"Mac-6F01561E16C75D06": "10.15.7",
"Mac-F60DEB81FF30ACF6": "latest",
"Mac-473D31EABEB93F9B": "latest",
"Mac-F22589C8": "10.13.6",
"Mac-0CFF9C7C2B63DF8D": "latest",
"Mac-CFF7D910A743CAAF": "latest",
"Mac-942C5DF58193131B": "10.13.6",
"Mac-77F17D7DA9285301": "latest",
"Mac-9F18E312C5C2BF0B": "latest",
"Mac-E1008331FDC96864": "latest",
"Mac-E7203C0F68AA0004": "latest",
"Mac-742912EFDBEE19B3": "10.13.6",
"Mac-27ADBB7B4CEE8E61": "10.15.7",
"Mac-F65AE981FFA204ED": "10.15.7",
"Mac-031AEE4D24BFF0B1": "10.15.7",
"Mac-4B682C642B45593E": "latest",
"Mac-DB15BD556843C820": "latest",
"Mac-937A206F2EE63C01": "latest",
"Mac-81E3E92DD6088272": "11.6.2",
"Mac-E43C1C25D4880AD6": "latest",
"Mac-942452F5819B1C1B": "10.13.6",
"Mac-65CE76090165799A": "latest",
"Mac-551B86E5744E2388": "latest",
"Mac-BE088AF8C5EB4FA2": "latest",
"Mac-A5C67F76ED83108C": "latest",
"Mac-5F9802EFE386AA28": "latest",
"Mac-AF89B6D9451A490B": "latest",
"Mac-94245B3640C91C81": "10.13.6",
"Mac-EE2EBD4B90B839A8": "latest",
"Mac-4BC72D62AD45599E": "10.13.6",
"Mac-2BD1B31983FE1663": "11.6.2",
"Mac-7DF21CB3ED6977E5": "11.6.2",
"Mac-A369DDC4E67F1C45": "latest",
"Mac-94245A3940C91C80": "10.13.6",
"Mac-C3EC7CD22292981F": "10.15.7",
"Mac-35C5E08120C7EEAF": "latest",
"Mac-942B5BF58194151B": "10.13.6"
}

View File

@ -1,18 +0,0 @@
#!/bin/bash -e
rm -rf Recovery.RO.dmg Recovery.RO.raw Recovery.dmg.sparseimage
hdiutil create -size 800m -layout "UNIVERSAL HD" -type SPARSE -o Recovery.dmg
newDevice=$(hdiutil attach -nomount Recovery.dmg.sparseimage | head -n 1 | awk '{print $1}')
echo newdevice "$newDevice"
diskutil partitionDisk "${newDevice}" 1 MBR fat32 RECOVERY R
N=$(echo "$newDevice" | tr -dc '0-9')
diskutil mount disk"${N}"s1
MOUNT="$(diskutil info disk"${N}"s1 | sed -n 's/.*Mount Point: *//p')"
mkdir -p "$MOUNT/com.apple.recovery.boot"
cp ./*.dmg ./*.chunklist "$MOUNT/com.apple.recovery.boot/"
diskutil umount disk"${N}"s1
hdiutil detach "$newDevice"
hdiutil convert -format UDZO Recovery.dmg.sparseimage -o Recovery.RO.dmg
rm Recovery.dmg.sparseimage
qemu-img convert -f dmg -O raw Recovery.RO.dmg Recovery.raw
rm Recovery.RO.dmg

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python3
#!/usr/bin/env python
"""
Gather recovery information for Macs.
@ -6,78 +6,87 @@ Gather recovery information for Macs.
Copyright (c) 2019, vit9696
"""
from __future__ import print_function
import argparse
import binascii
import datetime
import hashlib
import json
import linecache
import os
import random
import struct
import string
import sys
import textwrap
import time
try:
from urllib.request import Request, HTTPError, urlopen
from urllib.parse import urlparse
from urllib.request import Request,HTTPError,urlopen
from urllib.parse import urlencode,urlparse
except ImportError:
print('ERROR: Python 2 is not supported, please use Python 3')
sys.exit(1)
from urllib2 import Request,HTTPError,urlopen
from urllib import urlencode
from urlparse import urlparse
SELF_DIR = os.path.dirname(os.path.realpath(__file__))
# MacPro7,1
RECENT_MAC = 'Mac-27AD2F918AE68F61'
MLB_ZERO = '00000000000000000'
MLB_VALID = 'F5K105303J9K3F71M'
MLB_PRODUCT = 'F5K00000000K3F700'
RECENT_MAC = 'Mac-7BA5B2D9E42DDD94'
MLB_ZERO = '00000000000000000'
MLB_VALID = 'C02749200YGJ803AX'
MLB_PRODUCT = '00000000000J80300'
TYPE_SID = 16
TYPE_K = 64
TYPE_FG = 64
TYPE_K = 64
TYPE_FG = 64
INFO_PRODUCT = 'AP'
INFO_PRODUCT = 'AP'
INFO_IMAGE_LINK = 'AU'
INFO_IMAGE_HASH = 'AH'
INFO_IMAGE_SESS = 'AT'
INFO_SIGN_LINK = 'CU'
INFO_SIGN_HASH = 'CH'
INFO_SIGN_SESS = 'CT'
INFO_REQURED = [INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS, INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS]
# Use -2 for better resize stability on Windows
TERMINAL_MARGIN = 2
INFO_SIGN_LINK = 'CU'
INFO_SIGN_HASH = 'CH'
INFO_SIGN_SESS = 'CT'
INFO_REQURED = [ INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS,
INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS ]
def run_query(url, headers, post=None, raw=False):
if post is not None:
data = '\n'.join(entry + '=' + post[entry] for entry in post).encode()
else:
data = None
req = Request(url=url, headers=headers, data=data)
try:
response = urlopen(req)
if raw:
return response
return dict(response.info()), response.read()
except HTTPError as e:
print(f'ERROR: "{e}" when connecting to {url}')
sys.exit(1)
if post is not None:
data = '\n'.join([entry + '=' + post[entry] for entry in post])
if sys.version_info[0] >= 3:
data = data.encode('utf-8')
else:
data = None
req = Request(url=url, headers=headers, data=data)
try:
response = urlopen(req)
if raw: return response
return dict(response.info()), response.read()
except HTTPError as e:
print('ERROR: "{}" when connecting to {}'.format(e, url))
sys.exit(1)
def generate_id(id_type, id_value=None):
return id_value or ''.join(random.choices(string.hexdigits[:16].upper(), k=id_type))
def generate_id(type, id=None):
valid_chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
if id is None:
return ''.join(random.choice(valid_chars) for i in range(type))
return id
def product_mlb(mlb):
return '00000000000' + mlb[11:15] + '00'
return '00000000000' + mlb[11] + mlb[12] + mlb[13] + mlb[14] + '00'
def mlb_from_eeee(eeee):
if len(eeee) != 4:
print('ERROR: Invalid EEEE code length!')
sys.exit(1)
if len(eeee) != 4:
print('ERROR: Invalid EEEE code length!')
sys.exit(1)
return f'00000000000{eeee}00'
return '00000000000' + eeee + '00'
def int_from_unsigned_bytes(bytes, byteorder):
if byteorder == 'little': bytes = bytes[::-1]
encoded = binascii.hexlify(bytes)
return int(encoded, 16)
# zhangyoufu https://gist.github.com/MCJack123/943eaca762730ca4b7ae460b731b68e7#gistcomment-3061078 2021-10-08
Apple_EFI_ROM_public_key_1 = 0xC3E748CAD9CD384329E10E25A91E43E1A762FF529ADE578C935BDDF9B13F2179D4855E6FC89E9E29CA12517D17DFA1EDCE0BEBF0EA7B461FFE61D94E2BDF72C196F89ACD3536B644064014DAE25A15DB6BB0852ECBD120916318D1CCDEA3C84C92ED743FC176D0BACA920D3FCF3158AFF731F88CE0623182A8ED67E650515F75745909F07D415F55FC15A35654D118C55A462D37A3ACDA08612F3F3F6571761EFCCBCC299AEE99B3A4FD6212CCFFF5EF37A2C334E871191F7E1C31960E010A54E86FA3F62E6D6905E1CD57732410A3EB0C6B4DEFDABE9F59BF1618758C751CD56CEF851D1C0EAA1C558E37AC108DA9089863D20E2E7E4BF475EC66FE6B3EFDCF
@ -88,7 +97,6 @@ assert ChunkListHeader.size == 0x24
Chunk = struct.Struct('<I32s')
assert Chunk.size == 0x24
def verify_chunklist(cnkpath):
with open(cnkpath, 'rb') as f:
hash_ctx = hashlib.sha256()
@ -103,7 +111,7 @@ def verify_chunklist(cnkpath):
assert chunk_count > 0
assert chunk_offset == 0x24
assert signature_offset == chunk_offset + Chunk.size * chunk_count
for _ in range(chunk_count):
for i in range(chunk_count):
data = f.read(Chunk.size)
hash_ctx.update(data)
chunk_size, chunk_sha256 = Chunk.unpack(data)
@ -112,8 +120,8 @@ def verify_chunklist(cnkpath):
if signature_method == 1:
data = f.read(256)
assert len(data) == 256
signature = int.from_bytes(data, 'little')
plaintext = int(f'0x1{"f"*404}003031300d060960864801650304020105000420{"0"*64}', 16) | int.from_bytes(digest, 'big')
signature = int_from_unsigned_bytes(data, 'little')
plaintext = 0x1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003031300d0609608648016503040201050004200000000000000000000000000000000000000000000000000000000000000000 | int_from_unsigned_bytes(digest, 'big')
assert pow(signature, 0x10001, Apple_EFI_ROM_public_key_1) == plaintext
elif signature_method == 2:
data = f.read(32)
@ -123,394 +131,388 @@ def verify_chunklist(cnkpath):
raise NotImplementedError
assert f.read(1) == b''
def get_session(args):
headers = {
'Host': 'osrecovery.apple.com',
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
}
headers = {
'Host' : 'osrecovery.apple.com',
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
}
headers, _ = run_query('http://osrecovery.apple.com/', headers)
if args.verbose:
print('Session headers:')
for header in headers:
print(f'{header}: {headers[header]}')
headers, output = run_query('http://osrecovery.apple.com/', headers)
if args.verbose:
print('Session headers:')
for header in headers:
if header.lower() == 'set-cookie':
cookies = headers[header].split('; ')
for cookie in cookies:
return cookie if cookie.startswith('session=') else ...
print('{}: {}'.format(header, headers[header]))
raise RuntimeError('No session in headers ' + str(headers))
for header in headers:
if header.lower() == 'set-cookie':
cookies = headers[header].split('; ')
for cookie in cookies:
if cookie.startswith('session='):
return cookie
raise RuntimeError('No session in headers ' + str(headers))
def get_image_info(session, bid, mlb=MLB_ZERO, diag=False, os_type='default', cid=None):
headers = {
'Host': 'osrecovery.apple.com',
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
'Cookie': session,
'Content-Type': 'text/plain',
}
def get_image_info(session, bid, mlb=MLB_ZERO, diag = False, os_type = 'default', cid=None):
headers = {
'Host' : 'osrecovery.apple.com',
'Connection' : 'close',
'User-Agent' : 'InternetRecovery/1.0',
'Cookie' : session,
'Content-Type': 'text/plain',
}
post = {
'cid': generate_id(TYPE_SID, cid),
'sn': mlb,
'bid': bid,
'k': generate_id(TYPE_K),
'fg': generate_id(TYPE_FG)
}
post = {
'cid': generate_id(TYPE_SID, cid),
'sn' : mlb,
'bid': bid,
'k' : generate_id(TYPE_K),
'fg' : generate_id(TYPE_FG)
}
if diag:
url = 'http://osrecovery.apple.com/InstallationPayload/Diagnostics'
else:
url = 'http://osrecovery.apple.com/InstallationPayload/RecoveryImage'
post['os'] = os_type
if diag:
url = 'http://osrecovery.apple.com/InstallationPayload/Diagnostics'
else:
url = 'http://osrecovery.apple.com/InstallationPayload/RecoveryImage'
post['os'] = os_type
headers, output = run_query(url, headers, post)
headers, output = run_query(url, headers, post)
if sys.version_info[0] >= 3:
output = output.decode('utf-8')
info = {}
for line in output.split('\n'):
try:
key, value = line.split(': ')
info[key] = value
except KeyError:
continue
except ValueError:
continue
for k in INFO_REQURED:
if k not in info:
raise RuntimeError(f'Missing key {k}')
info = {}
for line in output.split('\n'):
try:
key, value = line.split(': ')
info[key] = value
except:
continue
return info
for k in INFO_REQURED:
if k not in info:
raise RuntimeError('Missing key ' + k)
return info
def save_image(url, sess, filename='', directory=''):
purl = urlparse(url)
headers = {
'Host': purl.hostname,
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
'Cookie': '='.join(['AssetToken', sess])
}
def save_image(url, sess, filename='', dir=''):
purl = urlparse(url)
headers = {
'Host' : purl.hostname,
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
'Cookie' : '='.join(['AssetToken', sess])
}
if not os.path.exists(directory):
os.makedirs(directory)
if filename == '':
filename = os.path.basename(purl.path)
if filename.find('/') >= 0 or filename == '':
raise RuntimeError('Invalid save path ' + filename)
if filename == '':
filename = os.path.basename(purl.path)
if filename.find(os.sep) >= 0 or filename == '':
raise RuntimeError('Invalid save path ' + filename)
print('Saving ' + url + ' to ' + filename + '...')
print(f'Saving {url} to {directory}{os.sep}{filename}...')
with open(os.path.join(directory, filename), 'wb') as fh:
response = run_query(url, headers, raw=True)
headers = dict(response.headers)
totalsize = -1
for header in headers:
if header.lower() == 'content-length':
totalsize = int(headers[header])
break
size = 0
oldterminalsize = 0
while True:
chunk = response.read(2**20)
if not chunk:
break
fh.write(chunk)
size += len(chunk)
terminalsize = 80
if oldterminalsize != terminalsize:
print(f'\r{"":<{terminalsize}}', end='')
oldterminalsize = terminalsize
if totalsize > 0:
progress = size / totalsize
barwidth = terminalsize // 3
print(f'\r{size / (2**20):.1f}/{totalsize / (2**20):.1f} MB ', end='')
if terminalsize > 55:
print(f'|{"=" * int(barwidth * progress):<{barwidth}}|', end='')
print(f' {progress*100:.1f}% downloaded', end='')
else:
# Fallback if Content-Length isn't available
print(f'\r{size / (2**20)} MB downloaded...', end='')
sys.stdout.flush()
print('\nDownload complete!')
return os.path.join(directory, os.path.basename(filename))
with open (os.path.join(dir, filename), 'wb') as fh:
response = run_query(url, headers, raw=True)
size = 0
while True:
chunk = response.read(2**20)
if not chunk:
break
fh.write(chunk)
size += len(chunk)
print('\r{} MBs downloaded...'.format(size / (2**20)), end='')
sys.stdout.flush()
print('\rDownload complete! ')
return os.path.join(dir, os.path.basename(filename))
def verify_image(dmgpath, cnkpath):
print('Verifying image with chunklist...')
with open(dmgpath, 'rb') as dmgf:
for cnkcount, (cnksize, cnkhash) in enumerate(verify_chunklist(cnkpath), 1):
terminalsize = 80
print(f'\r{f"Chunk {cnkcount} ({cnksize} bytes)":<{terminalsize}}', end='')
sys.stdout.flush()
cnk = dmgf.read(cnksize)
if len(cnk) != cnksize:
raise RuntimeError(f'Invalid chunk {cnkcount} size: expected {cnksize}, read {len(cnk)}')
if hashlib.sha256(cnk).digest() != cnkhash:
raise RuntimeError(f'Invalid chunk {cnkcount}: hash mismatch')
if dmgf.read(1) != b'':
raise RuntimeError('Invalid image: larger than chunklist')
print('\nImage verification complete!')
print('Verifying image with chunklist...')
with open (dmgpath, 'rb') as dmgf:
cnkcount = 0
for cnksize, cnkhash in verify_chunklist(cnkpath):
cnkcount += 1
print('\rChunk {} ({} bytes)'.format(cnkcount, cnksize), end='')
sys.stdout.flush()
cnk = dmgf.read(cnksize)
if len(cnk) != cnksize:
raise RuntimeError('Invalid chunk {} size: expected {}, read {}'.format(cnkcount, cnksize, len(cnk)))
if hashlib.sha256(cnk).digest() != cnkhash:
raise RuntimeError('Invalid chunk {}: hash mismatch'.format(cnkcount))
if dmgf.read(1) != b'':
raise RuntimeError('Invalid image: larger than chunklist')
print('\rImage verification complete! ')
def action_download(args):
"""
Reference information for queries:
"""
Reference information for queries:
Recovery latest:
cid=3076CE439155BA14
sn=...
bid=Mac-E43C1C25D4880AD6
k=4BE523BB136EB12B1758C70DB43BDD485EBCB6A457854245F9E9FF0587FB790C
os=latest
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
Recovery latest:
cid=3076CE439155BA14
sn=...
bid=Mac-E43C1C25D4880AD6
k=4BE523BB136EB12B1758C70DB43BDD485EBCB6A457854245F9E9FF0587FB790C
os=latest
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
Recovery default:
cid=4A35CB95FF396EE7
sn=...
bid=Mac-E43C1C25D4880AD6
k=0A385E6FFC3DDD990A8A1F4EC8B98C92CA5E19C9FF1DD26508C54936D8523121
os=default
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
Recovery default:
cid=4A35CB95FF396EE7
sn=...
bid=Mac-E43C1C25D4880AD6
k=0A385E6FFC3DDD990A8A1F4EC8B98C92CA5E19C9FF1DD26508C54936D8523121
os=default
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
Diagnostics:
cid=050C59B51497CEC8
sn=...
bid=Mac-E43C1C25D4880AD6
k=37D42A8282FE04A12A7D946304F403E56A2155B9622B385F3EB959A2FBAB8C93
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
"""
session = get_session(args)
info = get_image_info(session, bid=args.board_id, mlb=args.mlb, diag=args.diagnostics, os_type=args.os_type)
if args.verbose:
print(info)
print(f'Downloading {info[INFO_PRODUCT]}...')
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
cnkpath = save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
dmgname = '' if args.basename == '' else args.basename + '.dmg'
dmgpath = save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
try:
verify_image(dmgpath, cnkpath)
return 0
except Exception as err:
if isinstance(err, AssertionError) and str(err) == '':
try:
tb = sys.exc_info()[2]
while tb.tb_next:
tb = tb.tb_next
err = linecache.getline(tb.tb_frame.f_code.co_filename, tb.tb_lineno, tb.tb_frame.f_globals).strip()
except Exception:
err = "Invalid chunklist"
print(f'\rImage verification failed. ({err})')
return 1
Diagnostics:
cid=050C59B51497CEC8
sn=...
bid=Mac-E43C1C25D4880AD6
k=37D42A8282FE04A12A7D946304F403E56A2155B9622B385F3EB959A2FBAB8C93
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
"""
session = get_session(args)
info = get_image_info(session, bid=args.board_id, mlb=args.mlb,
diag=args.diagnostics, os_type=args.os_type)
if args.verbose:
print(info)
print('Downloading ' + info[INFO_PRODUCT] + '...')
dmgname = '' if args.basename == '' else args.basename + '.dmg'
dmgpath = save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
cnkpath = save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
try:
verify_image(dmgpath, cnkpath)
return 0
except Exception as err:
if isinstance(err, AssertionError) and str(err)=='':
try:
tb = sys.exc_info()[2]
while tb.tb_next:
tb = tb.tb_next
err = linecache.getline(tb.tb_frame.f_code.co_filename, tb.tb_lineno, tb.tb_frame.f_globals).strip()
except:
err = "Invalid chunklist"
print('\rImage verification failed. ({})'.format(err))
return 1
def action_selfcheck(args):
"""
Sanity check server logic for recovery:
"""
Sanity check server logic for recovery:
if not valid(bid):
return error()
ppp = get_ppp(sn)
if not valid(ppp):
return latest_recovery(bid = bid) # Returns newest for bid.
if valid(sn):
if os == 'default':
return default_recovery(sn = sn, ppp = ppp) # Returns oldest for sn.
else:
return latest_recovery(sn = sn, ppp = ppp) # Returns newest for sn.
return default_recovery(ppp = ppp) # Returns oldest.
"""
if not valid(bid):
return error()
ppp = get_ppp(sn)
if not valid(ppp):
return latest_recovery(bid = bid) # Returns newest for bid.
if valid(sn):
if os == 'default':
return default_recovery(sn = sn, ppp = ppp) # Returns oldest for sn.
else:
return latest_recovery(sn = sn, ppp = ppp) # Returns newest for sn.
return default_recovery(ppp = ppp) # Returns oldest.
"""
session = get_session(args)
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID, diag=False, os_type='default')
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID, diag=False, os_type='latest')
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT, diag=False, os_type='default')
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT, diag=False, os_type='latest')
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='default')
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='latest')
session = get_session(args)
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
diag=False, os_type='default')
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
diag=False, os_type='latest')
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
diag=False, os_type='default')
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
diag=False, os_type='latest')
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='default')
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='latest')
if args.verbose:
print(valid_default)
print(valid_latest)
print(product_default)
print(product_latest)
print(generic_default)
print(generic_latest)
if args.verbose:
print(valid_default)
print(valid_latest)
print(product_default)
print(product_latest)
print(generic_default)
print(generic_latest)
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
# Valid MLB must give different default and latest if this is not a too new product.
print(f'ERROR: Cannot determine any previous product, got {valid_default[INFO_PRODUCT]}')
return 1
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
# Valid MLB must give different default and latest if this is not a too new product.
print('ERROR: Cannot determine any previous product, got {}'.format(valid_default[INFO_PRODUCT]))
return 1
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
# Product-only MLB must give the same value for default and latest.
print(f'ERROR: Latest and default do not match for product MLB, got {product_default[INFO_PRODUCT]} and {product_latest[INFO_PRODUCT]}')
return 1
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
# Product-only MLB must give the same value for default and latest.
print('ERROR: Latest and default do not match for product MLB, got {} and {}'.format(
product_default[INFO_PRODUCT], product_latest[INFO_PRODUCT]))
return 1
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
# Zero MLB always give the same value for default and latest.
print(f'ERROR: Generic MLB gives different product, got {generic_default[INFO_PRODUCT]} and {generic_latest[INFO_PRODUCT]}')
return 1
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
# Zero MLB always give the same value for default and latest.
print('ERROR: Generic MLB gives different product, got {} and {}'.format(
generic_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
return 1
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
# Valid MLB must always equal generic MLB.
print(f'ERROR: Cannot determine unified latest product, got {valid_latest[INFO_PRODUCT]} and {generic_latest[INFO_PRODUCT]}')
return 1
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
# Valid MLB must always equal generic MLB.
print('ERROR: Cannot determine unified latest product, got {} and {}'.format(
valid_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
return 1
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
# Product-only MLB can give the same value with valid default MLB.
# This is not an error for all models, but for our chosen code it is.
print(f'ERROR: Valid and product MLB give mismatch, got {product_default[INFO_PRODUCT]} and {valid_default[INFO_PRODUCT]}')
return 1
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
return 0
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
# Product-only MLB can give the same value with valid default MLB.
# This is not an error for all models, but for our chosen code it is.
print('ERROR: Valid and product MLB give mismatch, got {} and {}'.format(
product_default[INFO_PRODUCT], valid_default[INFO_PRODUCT]))
return 1
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
return 0
def action_verify(args):
"""
Try to verify MLB serial number.
"""
session = get_session(args)
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='latest')
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb, diag=False, os_type='default')
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb, diag=False, os_type='latest')
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb), diag=False, os_type='default')
"""
Try to verify MLB serial number.
"""
session = get_session(args)
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='latest')
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb,
diag=False, os_type='default')
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb,
diag=False, os_type='latest')
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb),
diag=False, os_type='default')
if args.verbose:
print(generic_latest)
print(uvalid_default)
print(uvalid_latest)
print(uproduct_default)
if args.verbose:
print(generic_latest)
print(uvalid_default)
print(uvalid_latest)
print(uproduct_default)
# Verify our MLB number.
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
print(f'SUCCESS: {args.mlb} MLB looks valid and supported!' if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT] else f'SUCCESS: {args.mlb} MLB looks valid, but probably unsupported!')
return 0
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
# Here we have matching default and latest products. This can only be true for very
# new models. These models get either latest or special builds.
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
print(f'UNKNOWN: {args.mlb} MLB can be valid if very new!')
return 0
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
print(f'UNKNOWN: {args.mlb} MLB looks invalid, other models use product {uproduct_default[INFO_PRODUCT]} instead of {uvalid_default[INFO_PRODUCT]}!')
return 0
print(f'UNKNOWN: {args.mlb} MLB can be valid if very new and using special builds!')
# Verify our MLB number.
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
print('SUCCESS: {} MLB looks valid and supported!'.format(args.mlb))
else:
print('SUCCESS: {} MLB looks valid, but probably unsupported!'.format(args.mlb))
return 0
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
# Here we have matching default and latest products. This can only be true for very
# new models. These models get either latest or special builds.
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
print('UNKNOWN: {} MLB can be valid if very new!'.format(args.mlb))
return 0
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
print('UNKNOWN: {} MLB looks invalid, other models use product {} instead of {}!'.format(
args.mlb, uproduct_default[INFO_PRODUCT], uvalid_default[INFO_PRODUCT]))
return 0
print('UNKNOWN: {} MLB can be valid if very new and using special builds!'.format(args.mlb))
return 0
def action_guess(args):
"""
Attempt to guess which model does this MLB belong.
"""
"""
Attempt to guess which model does this MLB belong.
"""
mlb = args.mlb
anon = mlb.startswith('000')
mlb = args.mlb
anon = mlb.startswith('000')
with open(args.board_db, 'r', encoding='utf-8') as fh:
db = json.load(fh)
with open(args.board_db, 'r') as fh:
db = json.load(fh)
supported = {}
supported = {}
session = get_session(args)
session = get_session(args)
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO, diag=False, os_type='latest')
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='latest')
for model in db:
try:
if anon:
# For anonymous lookup check when given model does not match latest.
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO, diag=False, os_type='latest')
for model in db:
try:
if anon:
# For anonymous lookup check when given model does not match latest.
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO,
diag=False, os_type='latest')
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
if db[model] == 'current':
print(f'WARN: Skipped {model} due to using latest product {model_latest[INFO_PRODUCT]} instead of {generic_latest[INFO_PRODUCT]}')
continue
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
if db[model] == 'current':
print('WARN: Skipped {} due to using latest product {} instead of {}'.format(
model, model_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
continue
user_default = get_image_info(session, bid=model, mlb=mlb, diag=False, os_type='default')
user_default = get_image_info(session, bid=model, mlb=mlb,
diag=False, os_type='default')
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
else:
# For normal lookup check when given model has mismatching normal and latest.
user_latest = get_image_info(session, bid=model, mlb=mlb, diag=False, os_type='latest')
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
else:
# For normal lookup check when given model has mismatching normal and latest.
user_latest = get_image_info(session, bid=model, mlb=mlb,
diag=False, os_type='latest')
user_default = get_image_info(session, bid=model, mlb=mlb, diag=False, os_type='default')
user_default = get_image_info(session, bid=model, mlb=mlb,
diag=False, os_type='default')
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
except Exception as e:
print(f'WARN: Failed to check {model}, exception: {e}')
except Exception as e:
print('WARN: Failed to check {}, exception: {}'.format(model, str(e)))
if len(supported) > 0:
print(f'SUCCESS: MLB {mlb} looks supported for:')
for model in supported.items():
print(f'- {model}, up to {supported[model][0]}, default: {supported[model][1]}, latest: {supported[model][2]}')
return 0
print(f'UNKNOWN: Failed to determine supported models for MLB {mlb}!')
return None
if len(supported) > 0:
print('SUCCESS: MLB {} looks supported for:'.format(mlb))
for model in supported:
print('- {}, up to {}, default: {}, latest: {}'.format(model, supported[model][0],
supported[model][1], supported[model][2]))
return 0
print('UNKNOWN: Failed to determine supported models for MLB {}!'.format(mlb))
def main():
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
parser.add_argument('action', choices=['download', 'selfcheck', 'verify', 'guess'],
help='Action to perform: "download" - performs recovery downloading,'
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
parser.add_argument('-o', '--outdir', type=str, default='com.apple.recovery.boot',
help='customise output directory for downloading, defaults to com.apple.recovery.boot')
parser.add_argument('-n', '--basename', type=str, default='',
help='customise base name for downloading, defaults to remote name')
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
help=f'use specified board identifier for downloading, defaults to {RECENT_MAC}')
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
help=f'use specified logic board serial for downloading, defaults to {MLB_ZERO}')
parser.add_argument('-e', '--code', type=str, default='',
help='generate product logic board serial with specified product EEEE code')
parser.add_argument('-os', '--os-type', type=str, default='default', choices=['default', 'latest'],
help=f'use specified os type, defaults to default {MLB_ZERO}')
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
help='use custom board list for checking, defaults to boards.json')
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
parser.add_argument('action', choices = ['download', 'selfcheck', 'verify', 'guess'],
help='Action to perform: "download" - performs recovery downloading,'
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
parser.add_argument('-o', '--outdir', type=str, default=os.getcwd(),
help='customise output directory for downloading, defaults to current directory')
parser.add_argument('-n', '--basename', type=str, default='',
help='customise base name for downloading, defaults to remote name')
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
help='use specified board identifier for downloading, defaults to ' + RECENT_MAC)
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
help='use specified logic board serial for downloading, defaults to ' + MLB_ZERO)
parser.add_argument('-e', '--code', type=str, default='',
help='generate product logic board serial with specified product EEEE code')
parser.add_argument('-os', '--os-type', type=str, default='default', choices = ['default', 'latest'],
help='use specified os type, defaults to default ' + MLB_ZERO)
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
help='use custom board list for checking, defaults to boards.json')
args = parser.parse_args()
args = parser.parse_args()
if args.code != '':
args.mlb = mlb_from_eeee(args.code)
if args.code != '':
args.mlb = mlb_from_eeee(args.code)
if len(args.mlb) != 17:
print('ERROR: Cannot use MLBs in non 17 character format!')
sys.exit(1)
if args.action == 'download':
return action_download(args)
if args.action == 'selfcheck':
return action_selfcheck(args)
if args.action == 'verify':
return action_verify(args)
if args.action == 'guess':
return action_guess(args)
assert False
if len(args.mlb) != 17:
print('ERROR: Cannot use MLBs in non 17 character format!')
sys.exit(1)
if args.action == 'download':
return action_download(args)
elif args.action == 'selfcheck':
return action_selfcheck(args)
elif args.action == 'verify':
return action_verify(args)
elif args.action == 'guess':
return action_guess(args)
else:
assert(False)
if __name__ == '__main__':
sys.exit(main())
sys.exit(main())

View File

@ -31,24 +31,15 @@ Catalina
Big Sur
./macrecovery.py -b Mac-2BD1B31983FE1663 -m 00000000000000000
Monterey
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000
Ventura
./macrecovery.py -b Mac-B4831CEBD52A0C4C -m 00000000000000000
Sonoma
./macrecovery.py -b Mac-827FAC58A8FDFA22 -m 00000000000000000
Diagnostics
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000000000 -diag
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000JG3600 -diag
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 <real MLB> -diag
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 -diag
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVQ00 -diag
./macrecovery.py -b Mac-E43C1C25D4880AD6 <real MLB> -diag
Default version
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000JG3600 (oldest)
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m <real MLB> -os default (newer)
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000GDVQ00 (oldest)
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m <real MLB> -os default (newer)
Latest version
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m 00000000000000000 -os latest
./macrecovery.py -b Mac-7BA5B2D9E42DDD94 -m <real MLB> -os latest
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m 00000000000000000 -os latest
./macrecovery.py -b Mac-E43C1C25D4880AD6 -m <real MLB> -os latest