mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-04-20 18:54:30 +10:00
Compare commits
109 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5db862d38b | ||
|
|
139f94aae1 | ||
|
|
432736eb98 | ||
|
|
6e40a80650 | ||
|
|
21e1b73a4e | ||
|
|
d9676afe43 | ||
|
|
525c7c3173 | ||
|
|
51ef3fe719 | ||
|
|
c6f5ceacfd | ||
|
|
55801e80bd | ||
|
|
4196a7b5f2 | ||
|
|
f0d6faab9a | ||
|
|
6b00caf883 | ||
|
|
d98a653082 | ||
|
|
6d026290ac | ||
|
|
39e58b3927 | ||
|
|
8cfc33e704 | ||
|
|
2b1beff6dc | ||
|
|
d23e483542 | ||
|
|
d57a758c73 | ||
|
|
16b2f1ff55 | ||
|
|
ba0a676ca0 | ||
|
|
2ff132cb04 | ||
|
|
613748488c | ||
|
|
f23c9268f9 | ||
|
|
7160f34a85 | ||
|
|
6767f58047 | ||
|
|
1e781dccb3 | ||
|
|
7e7a5d0f35 | ||
|
|
f91c817fce | ||
|
|
173f77cc31 | ||
|
|
94f870ef5b | ||
|
|
1641e2522b | ||
|
|
60f403d4b4 | ||
|
|
a8a6e609f4 | ||
|
|
de7d024c8f | ||
|
|
253b8b40a0 | ||
|
|
331d5c7b49 | ||
|
|
edbfa951c8 | ||
|
|
3f828d0d69 | ||
|
|
e6a33ed26b | ||
|
|
59e9ddfe3e | ||
|
|
c27998a881 | ||
|
|
faa6b1e770 | ||
|
|
c8b02a8e28 | ||
|
|
03713c3f7b | ||
|
|
64cab85704 | ||
|
|
957dd4b9ff | ||
|
|
d83f8ee381 | ||
|
|
14e5772b44 | ||
|
|
23ee732078 | ||
|
|
457615a161 | ||
|
|
2ec63ce006 | ||
|
|
7c23220416 | ||
|
|
1aee2e5dfa | ||
|
|
760db35d15 | ||
|
|
af57596559 | ||
|
|
51954d3b6a | ||
|
|
9e485a5997 | ||
|
|
379eb56eb5 | ||
|
|
a483e713ae | ||
|
|
0877d4b4be | ||
|
|
b5a876ffd7 | ||
|
|
5924ab507c | ||
|
|
f4a8cbbea9 | ||
|
|
86ce62a7d6 | ||
|
|
8aace2d2c9 | ||
|
|
815eb8f270 | ||
|
|
c7471fc64b | ||
|
|
f968a493b9 | ||
|
|
5e61f0c61f | ||
|
|
38188a5ccb | ||
|
|
ba88b5be82 | ||
|
|
a41bbb8267 | ||
|
|
2c428aa3dd | ||
|
|
4429b5cb4b | ||
|
|
526594a90d | ||
|
|
04a2e55d24 | ||
|
|
7aff1794c6 | ||
|
|
e8f8f1bd93 | ||
|
|
cba33c1e82 | ||
|
|
a26120a376 | ||
|
|
9982d43d5a | ||
|
|
b72ff16f55 | ||
|
|
54c56e2988 | ||
|
|
8718c620d3 | ||
|
|
8a6a9ec054 | ||
|
|
e56beb5f4e | ||
|
|
9038aaf906 | ||
|
|
8a287e7cc2 | ||
|
|
8f7606aaf2 | ||
|
|
1319a23c77 | ||
|
|
5774f0c402 | ||
|
|
ce70d87555 | ||
|
|
859b002240 | ||
|
|
00d29e8422 | ||
|
|
6fcdd5fa99 | ||
|
|
4f1cb2d753 | ||
|
|
c9ace128a1 | ||
|
|
e6149046b3 | ||
|
|
82eec8e343 | ||
|
|
c4063840e9 | ||
|
|
aa7be2163f | ||
|
|
67b00f34be | ||
|
|
3bf92c3587 | ||
|
|
ce0928ba38 | ||
|
|
25f5ea2457 | ||
|
|
0ba93a8a2b | ||
|
|
3e0c329e53 |
@@ -236,11 +236,10 @@ class CreateBinary:
|
|||||||
"Kexts",
|
"Kexts",
|
||||||
"OpenCore",
|
"OpenCore",
|
||||||
"Tools",
|
"Tools",
|
||||||
|
"Launch Services",
|
||||||
]
|
]
|
||||||
|
|
||||||
whitelist_files = [
|
whitelist_files = [
|
||||||
"com.dortania.opencore-legacy-patcher.auto-patch.plist",
|
|
||||||
"com.dortania.opencore-legacy-patcher.rsr-monitor.plist",
|
|
||||||
"entitlements.plist",
|
"entitlements.plist",
|
||||||
"launcher.sh",
|
"launcher.sh",
|
||||||
"OC-Patcher-TUI.icns",
|
"OC-Patcher-TUI.icns",
|
||||||
|
|||||||
69
CHANGELOG.md
69
CHANGELOG.md
@@ -1,5 +1,73 @@
|
|||||||
# OpenCore Legacy Patcher changelog
|
# OpenCore Legacy Patcher changelog
|
||||||
|
|
||||||
|
## 1.2.0
|
||||||
|
- Resolve application not existing if user dismisses an update instead of installing
|
||||||
|
- Resolve lldb crashes on extracted binaries
|
||||||
|
- Remove MH_DYLIB_IN_CACHE flag from binaries extracted with DSCE
|
||||||
|
- Add support for detecting T1 Security Chips in DFU mode
|
||||||
|
- Resolve macOS 14.2 coreauthd crashes on T1 Macs
|
||||||
|
- Resolve missing NFC firmware on T1 Macs
|
||||||
|
- Update non-Metal Binaries for macOS Sonoma:
|
||||||
|
- Resolve Photos app crash
|
||||||
|
- Resolve loginwindow crashes
|
||||||
|
- Workaround tile window popup freezing apps by disabling the feature
|
||||||
|
- Workaround monochrome desktop widgets rendering issues by enforcing full color (can be disabled in OCLP settings)
|
||||||
|
- Add new arguments:
|
||||||
|
- `--cache_os`: Cache necessary patcher files for OS to be installed (ex. KDKs)
|
||||||
|
- `--prepare_for_update`: Clean up patcher files for OS to be installed (ex. /Library/Extensions)
|
||||||
|
- Add new Launch Daemons for handling macOS updates:
|
||||||
|
- `macos-update.plist`:
|
||||||
|
- Resolves KDKless Macs failing to boot after updating from 14.0 to 14.x
|
||||||
|
- Adds support for KDK caching for OS to be installed
|
||||||
|
- Invoked when update is staged
|
||||||
|
- `/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.macos-update.plist`
|
||||||
|
- `os-caching.plist`
|
||||||
|
- Resolves unsupported/old KDKs from being used post-update
|
||||||
|
- Invoked when update is downloading
|
||||||
|
- `/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.os-caching.plist`
|
||||||
|
- Load UI icons from local path
|
||||||
|
- Resolves macOS downloader crash on slower machines
|
||||||
|
- Resolve iMac18,2 internal 4K display support
|
||||||
|
- Remove News Widget removal from Control Centre
|
||||||
|
- News Widget no longer crashes on 3802-based GPUs
|
||||||
|
- Resolve i210 NIC support for macOS Sonoma
|
||||||
|
- Increment Binaries:
|
||||||
|
- PatcherSupportPkg 1.4.5 - release
|
||||||
|
- OpenCorePkg 0.9.6 - release
|
||||||
|
|
||||||
|
## 1.1.0
|
||||||
|
- Resolve rendering issues on Intel Broadwell iGPUs
|
||||||
|
- Update non-Metal Binaries for macOS Sonoma:
|
||||||
|
- Resolve unresponsive Weather app
|
||||||
|
- Resolve full screen menubar covering the app toolbar
|
||||||
|
- Resolve unfocused password windows
|
||||||
|
- Resolve USB 1.1 kernel panics on macOS 14.1
|
||||||
|
- Resolve PCIe FaceTime camera support on macOS 14.1
|
||||||
|
- Resolve T1 Security Chip support on macOS 14
|
||||||
|
- Applicable for MacBookPro13,2, MacBookPro13,3, MacBookPro14,2, MacBookPro14,3
|
||||||
|
- Add support for stand alone OpenCore Vaulting without Xcode Command Line Tools (Jazzzny)
|
||||||
|
- Re-allow NVMeFix for macOS 14
|
||||||
|
- Remove `-lilubetaall` argument for machines without AppleALC
|
||||||
|
- Increment Binaries:
|
||||||
|
- PatcherSupportPkg 1.4.2 - release
|
||||||
|
- AirportBrcmFixup 2.1.8 - release
|
||||||
|
- BlueToolFixup 2.6.8 - release
|
||||||
|
- RestrictEvents 1.1.3 - release
|
||||||
|
- AMFIPass 1.4.0 - release
|
||||||
|
|
||||||
|
## 1.0.1
|
||||||
|
- Resolve rendering issues on Intel Ivy Bridge iGPUs
|
||||||
|
- Update non-Metal Binaries for macOS Sonoma:
|
||||||
|
- Resolve unresponsive Catalyst buttons
|
||||||
|
- Resolve window unfocusing issues
|
||||||
|
- Resolve menu bar fonts not changing color automatically with Beta Menu Bar enabled
|
||||||
|
- Improve Lock Screen clock transparency
|
||||||
|
- Prevent random WiFiAgent crashes
|
||||||
|
- Add error handling for corrupted patcher settings
|
||||||
|
- Remove CoreImage patch for 3802 GPUs on Ventura
|
||||||
|
- Avoid listing PCIe FaceTime camera patch on pre-Sonoma OSes
|
||||||
|
- Only cosmetic in Root Patching UI, however it has been removed to avoid confusion
|
||||||
|
|
||||||
## 1.0.0
|
## 1.0.0
|
||||||
- Resolve BCM2046 and BCM2070 support on macOS 13.3 and newer
|
- Resolve BCM2046 and BCM2070 support on macOS 13.3 and newer
|
||||||
- Workaround 13.3+ Kernel Panic on AMD GCN GPUs playing DRM content
|
- Workaround 13.3+ Kernel Panic on AMD GCN GPUs playing DRM content
|
||||||
@@ -39,6 +107,7 @@
|
|||||||
- CPUFriend 1.2.7 - release
|
- CPUFriend 1.2.7 - release
|
||||||
- BlueToolFixup 2.6.8 - rolling (2305aaa)
|
- BlueToolFixup 2.6.8 - rolling (2305aaa)
|
||||||
- CryptexFixup 1.0.2 - release
|
- CryptexFixup 1.0.2 - release
|
||||||
|
- NVMeFix 1.1.1 - release
|
||||||
- PatcherSupportPkg 1.3.2 - release
|
- PatcherSupportPkg 1.3.2 - release
|
||||||
- Build Server Changes:
|
- Build Server Changes:
|
||||||
- Upgrade Python backend to 3.11.5
|
- Upgrade Python backend to 3.11.5
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ Our project's main goal is to breathe new life into Macs no longer supported by
|
|||||||
|
|
||||||
Noteworthy features of OpenCore Legacy Patcher:
|
Noteworthy features of OpenCore Legacy Patcher:
|
||||||
|
|
||||||
* Support for macOS Big Sur, Monterey and Ventura
|
* Support for macOS Big Sur, Monterey, Ventura, and Sonoma
|
||||||
* Native Over the Air (OTA) System Updates
|
* Native Over the Air (OTA) System Updates
|
||||||
* Supports Penryn and newer Macs
|
* Supports Penryn and newer Macs
|
||||||
* Full support for WPA Wi-Fi and Personal Hotspot on BCM943224 and newer wireless chipsets
|
* Full support for WPA Wi-Fi and Personal Hotspot on BCM943224 and newer wireless chipsets
|
||||||
@@ -32,7 +32,7 @@ Note: Only clean-installs and upgrades are supported. macOS Big Sur installs alr
|
|||||||
|
|
||||||
* You can, however, reinstall macOS with this patcher and retain your original data
|
* You can, however, reinstall macOS with this patcher and retain your original data
|
||||||
|
|
||||||
Note 2: Currently, OpenCore Legacy Patcher officially supports patching to run macOS Big Sur through Ventura installs. For older OSes, OpenCore may function; however, support is currently not provided from Dortania.
|
Note 2: Currently, OpenCore Legacy Patcher officially supports patching to run macOS Big Sur through Sonoma installs. For older OSes, OpenCore may function; however, support is currently not provided from Dortania.
|
||||||
|
|
||||||
* For macOS Mojave and Catalina support, we recommend the use of [dosdude1's patchers](http://dosdude1.com)
|
* For macOS Mojave and Catalina support, we recommend the use of [dosdude1's patchers](http://dosdude1.com)
|
||||||
|
|
||||||
@@ -100,6 +100,7 @@ To run the project from source, see here: [Build and run from source](./SOURCE.m
|
|||||||
* Pre-Ivy Bridge Aquantia Ethernet Patch
|
* Pre-Ivy Bridge Aquantia Ethernet Patch
|
||||||
* Non-Metal Photo Booth Patch for Monterey+
|
* Non-Metal Photo Booth Patch for Monterey+
|
||||||
* GUI and Backend Development
|
* GUI and Backend Development
|
||||||
|
* Vaulting implementation
|
||||||
* Amazing users who've graciously donate hardware:
|
* Amazing users who've graciously donate hardware:
|
||||||
* [JohnD](https://forums.macrumors.com/members/johnd.53633/) - 2013 Mac Pro
|
* [JohnD](https://forums.macrumors.com/members/johnd.53633/) - 2013 Mac Pro
|
||||||
* [SpiGAndromeda](https://github.com/SpiGAndromeda) - AMD Vega 64
|
* [SpiGAndromeda](https://github.com/SpiGAndromeda) - AMD Vega 64
|
||||||
|
|||||||
@@ -2363,7 +2363,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Haswell,
|
device_probe.Intel.Archs.Haswell,
|
||||||
device_probe.AMD.Archs.Legacy_GCN_7000,
|
device_probe.AMD.Archs.Legacy_GCN_7000,
|
||||||
@@ -2382,7 +2382,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Haswell,
|
device_probe.Intel.Archs.Haswell,
|
||||||
device_probe.AMD.Archs.Legacy_GCN_7000,
|
device_probe.AMD.Archs.Legacy_GCN_7000,
|
||||||
@@ -2438,7 +2438,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Skylake,
|
device_probe.Intel.Archs.Skylake,
|
||||||
device_probe.AMD.Archs.Legacy_GCN_8000,
|
device_probe.AMD.Archs.Legacy_GCN_8000,
|
||||||
@@ -2458,7 +2458,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Skylake,
|
device_probe.Intel.Archs.Skylake,
|
||||||
device_probe.AMD.Archs.Legacy_GCN_8000,
|
device_probe.AMD.Archs.Legacy_GCN_8000,
|
||||||
@@ -2478,7 +2478,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20702_v2,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Skylake,
|
device_probe.Intel.Archs.Skylake,
|
||||||
device_probe.AMD.Archs.Legacy_GCN_8000,
|
device_probe.AMD.Archs.Legacy_GCN_8000,
|
||||||
@@ -2517,6 +2517,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20703,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20703,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Kaby_Lake,
|
device_probe.Intel.Archs.Kaby_Lake,
|
||||||
device_probe.AMD.Archs.Polaris,
|
device_probe.AMD.Archs.Polaris,
|
||||||
@@ -2536,7 +2537,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AirportBrcmNIC,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20703,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM20703,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Kaby_Lake,
|
device_probe.Intel.Archs.Kaby_Lake,
|
||||||
device_probe.AMD.Archs.Polaris,
|
device_probe.AMD.Archs.Polaris,
|
||||||
@@ -2556,7 +2557,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Coffee_Lake,
|
device_probe.Intel.Archs.Coffee_Lake,
|
||||||
device_probe.AMD.Archs.Polaris,
|
device_probe.AMD.Archs.Polaris,
|
||||||
@@ -2577,7 +2578,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Coffee_Lake,
|
device_probe.Intel.Archs.Coffee_Lake,
|
||||||
device_probe.AMD.Archs.Polaris,
|
device_probe.AMD.Archs.Polaris,
|
||||||
@@ -2598,6 +2599,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Coffee_Lake,
|
device_probe.Intel.Archs.Coffee_Lake,
|
||||||
device_probe.AMD.Archs.Polaris,
|
device_probe.AMD.Archs.Polaris,
|
||||||
@@ -2618,7 +2620,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Comet_Lake,
|
device_probe.Intel.Archs.Comet_Lake,
|
||||||
device_probe.AMD.Archs.Navi,
|
device_probe.AMD.Archs.Navi,
|
||||||
@@ -2637,7 +2639,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
||||||
"Ethernet Chipset": "Broadcom",
|
"Ethernet Chipset": "Broadcom",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.Intel.Archs.Comet_Lake,
|
device_probe.Intel.Archs.Comet_Lake,
|
||||||
device_probe.AMD.Archs.Navi,
|
device_probe.AMD.Archs.Navi,
|
||||||
@@ -2684,7 +2686,7 @@ smbios_dictionary = {
|
|||||||
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
|
||||||
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
|
||||||
"Ethernet Chipset": "Aquantia",
|
"Ethernet Chipset": "Aquantia",
|
||||||
"5K Display": True,
|
"Dual DisplayPort Display": True,
|
||||||
"Stock GPUs": [
|
"Stock GPUs": [
|
||||||
device_probe.AMD.Archs.Vega,
|
device_probe.AMD.Archs.Vega,
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class SystemPatchDictionary():
|
|||||||
|
|
||||||
|
|
||||||
Patchset Schema:
|
Patchset Schema:
|
||||||
Supports 6 types of higher level keys:
|
Supports following types of higher level keys:
|
||||||
- OS Support: Supported OSes by patches
|
- OS Support: Supported OSes by patches
|
||||||
- Minimum OS Support: Minimum supported OS version
|
- Minimum OS Support: Minimum supported OS version
|
||||||
- OS Major: Major XNU Kernel version
|
- OS Major: Major XNU Kernel version
|
||||||
@@ -30,6 +30,9 @@ class SystemPatchDictionary():
|
|||||||
- Remove: Files to remove
|
- Remove: Files to remove
|
||||||
- Location:
|
- Location:
|
||||||
- File (array: [ "File" ])
|
- File (array: [ "File" ])
|
||||||
|
- Remove Non-Root: Files to remove from data partition
|
||||||
|
- Location:
|
||||||
|
- File (array: [ "File" ])
|
||||||
- Processes: Additional processes to run
|
- Processes: Additional processes to run
|
||||||
- Process (dict: { "Process": "Requires Root" })
|
- Process (dict: { "Process": "Requires Root" })
|
||||||
- Display Name: User-friendly name (string, "" if user-friendly name is not required)
|
- Display Name: User-friendly name (string, "" if user-friendly name is not required)
|
||||||
@@ -67,6 +70,7 @@ class SystemPatchDictionary():
|
|||||||
self.macOS_12_4: float = 21.5
|
self.macOS_12_4: float = 21.5
|
||||||
self.macOS_12_5: float = 21.6
|
self.macOS_12_5: float = 21.6
|
||||||
self.macOS_13_3: float = 22.4
|
self.macOS_13_3: float = 22.4
|
||||||
|
self.macOS_14_1: float = 23.1
|
||||||
|
|
||||||
self._generate_sys_patch_dict()
|
self._generate_sys_patch_dict()
|
||||||
|
|
||||||
@@ -151,6 +155,7 @@ class SystemPatchDictionary():
|
|||||||
"defaults write /Library/Preferences/.GlobalPreferences.plist WebKitExperimentalUseGPUProcessForCanvasRenderingEnabled -bool false": True,
|
"defaults write /Library/Preferences/.GlobalPreferences.plist WebKitExperimentalUseGPUProcessForCanvasRenderingEnabled -bool false": True,
|
||||||
**({"defaults write /Library/Preferences/.GlobalPreferences.plist WebKitPreferences.acceleratedDrawingEnabled -bool false": True} if self.os_major >= os_data.os_data.sonoma else {}),
|
**({"defaults write /Library/Preferences/.GlobalPreferences.plist WebKitPreferences.acceleratedDrawingEnabled -bool false": True} if self.os_major >= os_data.os_data.sonoma else {}),
|
||||||
**({"defaults write /Library/Preferences/.GlobalPreferences.plist NSEnableAppKitMenus -bool false": True} if self.os_major >= os_data.os_data.sonoma else {}),
|
**({"defaults write /Library/Preferences/.GlobalPreferences.plist NSEnableAppKitMenus -bool false": True} if self.os_major >= os_data.os_data.sonoma else {}),
|
||||||
|
**({"defaults write /Library/Preferences/.GlobalPreferences.plist NSZoomButtonShowMenu -bool false": True} if self.os_major >= os_data.os_data.sonoma else {}),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Non-Metal IOAccelerator Common": {
|
"Non-Metal IOAccelerator Common": {
|
||||||
@@ -377,7 +382,7 @@ class SystemPatchDictionary():
|
|||||||
"Install": {
|
"Install": {
|
||||||
"/System/Library/Frameworks": {
|
"/System/Library/Frameworks": {
|
||||||
"Metal.framework": f"13.2.1-{self.os_major}",
|
"Metal.framework": f"13.2.1-{self.os_major}",
|
||||||
**({ "CoreImage.framework": "14.0 Beta 3" } if self.os_major >= os_data.os_data.ventura else {}),
|
**({ "CoreImage.framework": "14.0 Beta 3" } if self.os_major >= os_data.os_data.sonoma else {}),
|
||||||
},
|
},
|
||||||
"/System/Library/PrivateFrameworks": {
|
"/System/Library/PrivateFrameworks": {
|
||||||
**({ "MTLCompiler.framework": "13.2.1" } if self.os_major == os_data.os_data.ventura else {}),
|
**({ "MTLCompiler.framework": "13.2.1" } if self.os_major == os_data.os_data.ventura else {}),
|
||||||
@@ -949,7 +954,7 @@ class SystemPatchDictionary():
|
|||||||
"Install": {
|
"Install": {
|
||||||
"/System/Library/Extensions": {
|
"/System/Library/Extensions": {
|
||||||
"AppleIntelHD4000GraphicsGLDriver.bundle": "11.0 Beta 6",
|
"AppleIntelHD4000GraphicsGLDriver.bundle": "11.0 Beta 6",
|
||||||
"AppleIntelHD4000GraphicsMTLDriver.bundle": "11.0 Beta 6",
|
"AppleIntelHD4000GraphicsMTLDriver.bundle": "11.0 Beta 6" if self.os_major < os_data.os_data.ventura else "11.0-beta 6-22",
|
||||||
"AppleIntelHD4000GraphicsVADriver.bundle": "11.3 Beta 1",
|
"AppleIntelHD4000GraphicsVADriver.bundle": "11.3 Beta 1",
|
||||||
"AppleIntelFramebufferCapri.kext": "11.4" if self.os_major < os_data.os_data.sonoma else "11.4-23",
|
"AppleIntelFramebufferCapri.kext": "11.4" if self.os_major < os_data.os_data.sonoma else "11.4-23",
|
||||||
"AppleIntelHD4000Graphics.kext": "11.4" if self.os_major < os_data.os_data.sonoma else "11.4-23",
|
"AppleIntelHD4000Graphics.kext": "11.4" if self.os_major < os_data.os_data.sonoma else "11.4-23",
|
||||||
@@ -999,7 +1004,7 @@ class SystemPatchDictionary():
|
|||||||
"AppleIntelBDWGraphics.kext": "12.5" if self.os_major < os_data.os_data.sonoma else "12.5-23",
|
"AppleIntelBDWGraphics.kext": "12.5" if self.os_major < os_data.os_data.sonoma else "12.5-23",
|
||||||
"AppleIntelBDWGraphicsFramebuffer.kext": "12.5" if self.os_major < os_data.os_data.sonoma else "12.5-23",
|
"AppleIntelBDWGraphicsFramebuffer.kext": "12.5" if self.os_major < os_data.os_data.sonoma else "12.5-23",
|
||||||
"AppleIntelBDWGraphicsGLDriver.bundle": "12.5",
|
"AppleIntelBDWGraphicsGLDriver.bundle": "12.5",
|
||||||
"AppleIntelBDWGraphicsMTLDriver.bundle": "12.5",
|
"AppleIntelBDWGraphicsMTLDriver.bundle": "12.5" if self.os_major < os_data.os_data.ventura else "12.5-22",
|
||||||
"AppleIntelBDWGraphicsVADriver.bundle": "12.5",
|
"AppleIntelBDWGraphicsVADriver.bundle": "12.5",
|
||||||
"AppleIntelBDWGraphicsVAME.bundle": "12.5",
|
"AppleIntelBDWGraphicsVAME.bundle": "12.5",
|
||||||
"AppleIntelGraphicsShared.bundle": "12.5",
|
"AppleIntelGraphicsShared.bundle": "12.5",
|
||||||
@@ -1264,6 +1269,29 @@ class SystemPatchDictionary():
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
# Injection of UHCI/OHCI causes a panic on 14.1+
|
||||||
|
"Legacy USB 1.1 Extended": {
|
||||||
|
"Display Name": "",
|
||||||
|
"OS Support": {
|
||||||
|
"Minimum OS Support": {
|
||||||
|
"OS Major": os_data.os_data.sonoma,
|
||||||
|
"OS Minor": 1 # macOS 14.1 (XNU 23.1)
|
||||||
|
},
|
||||||
|
"Maximum OS Support": {
|
||||||
|
"OS Major": os_data.os_data.max_os,
|
||||||
|
"OS Minor": 99
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"Install": {
|
||||||
|
"/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns": {
|
||||||
|
"AppleUSBOHCI.kext": "12.6.2-USB",
|
||||||
|
"AppleUSBOHCIPCI.kext": "12.6.2-USB",
|
||||||
|
"AppleUSBUHCI.kext": "12.6.2-USB",
|
||||||
|
"AppleUSBUHCIPCI.kext": "12.6.2-USB",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
# With macOS 14.1, daemon won't load if not on root volume
|
||||||
"PCIe FaceTime Camera": {
|
"PCIe FaceTime Camera": {
|
||||||
"Display Name": "Miscellaneous: PCIe FaceTime Camera",
|
"Display Name": "Miscellaneous: PCIe FaceTime Camera",
|
||||||
"OS Support": {
|
"OS Support": {
|
||||||
@@ -1276,14 +1304,66 @@ class SystemPatchDictionary():
|
|||||||
"OS Minor": 99
|
"OS Minor": 99
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"Install Non-Root": {
|
"Install": {
|
||||||
"/Library/CoreMediaIO/Plug-Ins/DAL": {
|
"/System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources": {
|
||||||
"AppleCamera.plugin": "14.0 Beta 1"
|
"AppleCamera.plugin": "14.0 Beta 1"
|
||||||
},
|
},
|
||||||
"/Library/LaunchDaemons": {
|
"/System/Library/LaunchDaemons": {
|
||||||
"com.apple.cmio.AppleCameraAssistant.plist": "14.0 Beta 1"
|
"com.apple.cmio.AppleCameraAssistant.plist": "14.0 Beta 1"
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"Remove Non-Root": {
|
||||||
|
"/Library/CoreMediaIO/Plug-Ins/DAL": [
|
||||||
|
"AppleCamera.plugin"
|
||||||
|
],
|
||||||
|
"/Library/LaunchDaemons": [
|
||||||
|
"com.apple.cmio.AppleCameraAssistant.plist"
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"T1 Security Chip": {
|
||||||
|
"Display Name": "Miscellaneous: T1 Security Chip",
|
||||||
|
"OS Support": {
|
||||||
|
"Minimum OS Support": {
|
||||||
|
"OS Major": os_data.os_data.sonoma,
|
||||||
|
"OS Minor": 0
|
||||||
|
},
|
||||||
|
"Maximum OS Support": {
|
||||||
|
"OS Major": os_data.os_data.max_os,
|
||||||
|
"OS Minor": 99
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"Install": {
|
||||||
|
"/System/Library/Frameworks": {
|
||||||
|
"LocalAuthentication.framework": "13.6" # Required for Password Authentication (SharedUtils.framework)
|
||||||
|
},
|
||||||
|
"/System/Library/PrivateFrameworks": {
|
||||||
|
"EmbeddedOSInstall.framework": "13.6" # Required for biometrickitd
|
||||||
|
},
|
||||||
|
# Required for Apple Pay
|
||||||
|
"/usr/lib": {
|
||||||
|
"libNFC_Comet.dylib": "13.6",
|
||||||
|
"libNFC_HAL.dylib": "13.6",
|
||||||
|
|
||||||
|
"libnfshared.dylib": "13.6",
|
||||||
|
"libnfshared.dylibOld.dylib": "13.6",
|
||||||
|
"libnfstorage.dylib": "13.6",
|
||||||
|
"libnfrestore.dylib": "13.6",
|
||||||
|
|
||||||
|
"libPN548_API.dylib": "13.6"
|
||||||
|
},
|
||||||
|
"/usr/libexec": {
|
||||||
|
"biometrickitd": "13.6", # Required for Touch ID
|
||||||
|
"nfcd": "13.6", # Required for Apple Pay
|
||||||
|
"nfrestore_service": "13.6", # Required for Apple Pay
|
||||||
|
},
|
||||||
|
"/usr/standalone/firmware/nfrestore/firmware/fw": {
|
||||||
|
"PN549_FW_02_01_5A_rev88207.bin": "13.6",
|
||||||
|
"SN100V_FW_A3_01_01_81_rev127208.bin": "13.6",
|
||||||
|
"SN200V_FW_B1_02_01_86_rev127266.bin": "13.6",
|
||||||
|
"SN300V_FW_B0_02_01_22_rev129172.bin": "13.6",
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,15 @@ module.exports = {
|
|||||||
]
|
]
|
||||||
|
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'macOS Sonoma',
|
||||||
|
collapsable: false,
|
||||||
|
sidebarDepth: 1,
|
||||||
|
children: [
|
||||||
|
['SONOMA-DROP', 'macOS Sonoma Support'],
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
title: 'macOS Ventura',
|
title: 'macOS Ventura',
|
||||||
collapsable: false,
|
collapsable: false,
|
||||||
@@ -140,7 +149,6 @@ module.exports = {
|
|||||||
sidebarDepth: 1,
|
sidebarDepth: 1,
|
||||||
children: [
|
children: [
|
||||||
'ISSUES-HOLD',
|
'ISSUES-HOLD',
|
||||||
'TESTED',
|
|
||||||
'TERMS',
|
'TERMS',
|
||||||
'HOW',
|
'HOW',
|
||||||
'PATCHEXPLAIN',
|
'PATCHEXPLAIN',
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ The below tables can be used to reference issues with a particular model, and se
|
|||||||
|
|
||||||
::: details OpenCore Patcher application
|
::: details OpenCore Patcher application
|
||||||
The patcher application requires **OS X Yosemite 10.10** or later to run.
|
The patcher application requires **OS X Yosemite 10.10** or later to run.
|
||||||
* **OS X El Capitan 10.11** or later is required to make macOS Ventura installers.
|
* **OS X El Capitan 10.11** or later is required to make installers for macOS Ventura and later.
|
||||||
|
|
||||||
The patcher is designed to target **macOS Big Sur 11.x to macOS Ventura 13.x**.
|
The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
|
||||||
* Other versions may work, albeit in a broken state. No support is provided for any version outside of the above.
|
* Other versions may work, albeit in a broken state. No support is provided for any version outside of the above.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@@ -26,13 +26,13 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Ventura 13.x**.
|
|||||||
|
|
||||||
| Model Name | Identifier | Tagged Issues |
|
| Model Name | Identifier | Tagged Issues |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| MacBook (13-inch, Late 2008) | `MacBook5,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)|
|
| MacBook (13-inch, Aluminum, Late 2008) | `MacBook5,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)|
|
||||||
| MacBook (13-inch, Early 2009)<br>MacBook (13-inch, Mid 2009) | `MacBook5,2` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Trackpad gestures are partially broken |
|
| MacBook (13-inch, Early 2009)<br>MacBook (13-inch, Mid 2009) | `MacBook5,2` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Trackpad gestures are partially broken |
|
||||||
| MacBook (13-inch, Late 2009) | `MacBook6,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
|
| MacBook (13-inch, Late 2009) | `MacBook6,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
|
||||||
| MacBook (13-inch, Mid 2010) | `MacBook7,1` | ^^ |
|
| MacBook (13-inch, Mid 2010) | `MacBook7,1` | ^^ |
|
||||||
| MacBook (Retina, 12-inch, Early 2015) | `MacBook8,1` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
| MacBook (Retina, 12-inch, Early 2015) | `MacBook8,1` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
||||||
| MacBook (Retina, 12-inch, Early 2016) | `MacBook9,1` | ^^ |
|
| MacBook (Retina, 12-inch, Early 2016) | `MacBook9,1` | ^^ |
|
||||||
| MacBook (Retina, 12-inch, 2017) | `MacBook10,1` | Supported by Apple |
|
| MacBook (Retina, 12-inch, 2017) | `MacBook10,1` | - Supported by OpenCore Legacy Patcher |
|
||||||
|
|
||||||
### MacBook Air
|
### MacBook Air
|
||||||
|
|
||||||
@@ -79,10 +79,10 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Ventura 13.x**.
|
|||||||
| MacBook Pro (13-inch, 2016, 2 Thunderbolt 3 ports) | `MacBookPro13,1` | ^^ |
|
| MacBook Pro (13-inch, 2016, 2 Thunderbolt 3 ports) | `MacBookPro13,1` | ^^ |
|
||||||
| MacBook Pro (13-inch, 2016, 4 Thunderbolt 3 ports) | `MacBookPro13,2` | ^^ |
|
| MacBook Pro (13-inch, 2016, 4 Thunderbolt 3 ports) | `MacBookPro13,2` | ^^ |
|
||||||
| MacBook Pro (15-inch, 2016) | `MacBookPro13,3` | ^^ |
|
| MacBook Pro (15-inch, 2016) | `MacBookPro13,3` | ^^ |
|
||||||
| MacBook Pro (13-inch, 2017, 2 Thunderbolt 3 ports) | `MacBookPro14,1` | - Supported by Apple |
|
| MacBook Pro (13-inch, 2017, 2 Thunderbolt 3 ports) | `MacBookPro14,1` | - Supported by OpenCore Legacy Patcher |
|
||||||
| MacBook Pro (13-inch, 2017, 4 Thunderbolt 3 ports) | `MacBookPro14,2` | ^^ |
|
| MacBook Pro (13-inch, 2017, 4 Thunderbolt 3 ports) | `MacBookPro14,2` | ^^ |
|
||||||
| MacBook Pro (15-inch, 2017) | `MacBookPro14,3` | ^^ |
|
| MacBook Pro (15-inch, 2017) | `MacBookPro14,3` | - [Legacy Metal (macOS 14+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
||||||
| MacBook Pro (13-inch, 2018, 4 Thunderbolt 3 ports)<br>MacBook Pro (13-inch, 2019, 4 Thunderbolt 3 ports) | `MacBookPro15,2` | ^^ |
|
| MacBook Pro (13-inch, 2018, 4 Thunderbolt 3 ports)<br>MacBook Pro (13-inch, 2019, 4 Thunderbolt 3 ports) | `MacBookPro15,2` | - Supported by Apple |
|
||||||
| MacBook Pro (15-inch, 2018)<br>MacBook Pro (15-inch, 2019) | `MacBookPro15,1` | ^^ |
|
| MacBook Pro (15-inch, 2018)<br>MacBook Pro (15-inch, 2019) | `MacBookPro15,1` | ^^ |
|
||||||
| MacBook Pro (13-inch, 2019, 2 Thunderbolt 3 ports) | `MacBookPro15,4` | ^^ |
|
| MacBook Pro (13-inch, 2019, 2 Thunderbolt 3 ports) | `MacBookPro15,4` | ^^ |
|
||||||
| MacBook Pro (16-inch, 2019) | `MacBookPro16,1`<br>`MacBookPro16,4` | ^^ |
|
| MacBook Pro (16-inch, 2019) | `MacBookPro16,1`<br>`MacBookPro16,4` | ^^ |
|
||||||
@@ -94,8 +94,8 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Ventura 13.x**.
|
|||||||
| Model Name | Identifier | Tagged Issues |
|
| Model Name | Identifier | Tagged Issues |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| Mac mini (Early 2009) | `Macmini3,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
|
| Mac mini (Early 2009) | `Macmini3,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
|
||||||
| Mac mini (Mid 2010) | `Macmini4,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108) |
|
| Mac mini (Mid 2010) | `Macmini4,1` | ^^ |
|
||||||
| Mac mini (Mid 2011) | `Macmini5,1`<br>`Macmini5,2`<br>`Macmini5,3` | ^^ |
|
| Mac mini (Mid 2011) | `Macmini5,1`<br>`Macmini5,2`<br>`Macmini5,3` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108) |
|
||||||
| Mac mini (Late 2012) | `Macmini6,1`<br>`Macmini6,2` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
| Mac mini (Late 2012) | `Macmini6,1`<br>`Macmini6,2` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
||||||
| Mac mini (Late 2014) | `Macmini7,1` | ^^ |
|
| Mac mini (Late 2014) | `Macmini7,1` | ^^ |
|
||||||
| Mac mini (Late 2018) | `Macmini8,1` | - Supported by Apple |
|
| Mac mini (Late 2018) | `Macmini8,1` | - Supported by Apple |
|
||||||
@@ -122,10 +122,10 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Ventura 13.x**.
|
|||||||
| iMac (21.5-inch, Late 2015) | `iMac16,1` | ^^ |
|
| iMac (21.5-inch, Late 2015) | `iMac16,1` | ^^ |
|
||||||
| iMac (Retina 4K, 21.5-inch, Late 2015) | `iMac16,2` | ^^ |
|
| iMac (Retina 4K, 21.5-inch, Late 2015) | `iMac16,2` | ^^ |
|
||||||
| iMac (Retina 5K, 27-inch, Late 2015) | `iMac17,1` | ^^ |
|
| iMac (Retina 5K, 27-inch, Late 2015) | `iMac17,1` | ^^ |
|
||||||
| iMac (21.5-inch, 2017) | `iMac18,1` | - Supported by Apple |
|
| iMac (21.5-inch, 2017) | `iMac18,1` | - Supported by OpenCore Legacy Patcher |
|
||||||
| iMac (Retina 4K, 21.5-inch, 2017) | `iMac18,2` | ^^ |
|
| iMac (Retina 4K, 21.5-inch, 2017) | `iMac18,2` | ^^ |
|
||||||
| iMac (Retina 5K, 27-inch, 2017) | `iMac18,3` | ^^ |
|
| iMac (Retina 5K, 27-inch, 2017) | `iMac18,3` | ^^ |
|
||||||
| iMac (Retina 5K, 27-inch, 2019) | `iMac19,1` | ^^ |
|
| iMac (Retina 5K, 27-inch, 2019) | `iMac19,1` | - Supported by Apple |
|
||||||
| iMac (Retina 4K, 21.5-inch, 2019) | `iMac19,2` | ^^ |
|
| iMac (Retina 4K, 21.5-inch, 2019) | `iMac19,2` | ^^ |
|
||||||
| iMac (Retina 5K, 27-inch, 2020) | `iMac20,1`<br>`iMac20,2` | ^^ |
|
| iMac (Retina 5K, 27-inch, 2020) | `iMac20,1`<br>`iMac20,2` | ^^ |
|
||||||
| iMac Pro (2017) | `iMacPro1,1` | ^^ |
|
| iMac Pro (2017) | `iMacPro1,1` | ^^ |
|
||||||
@@ -134,8 +134,8 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Ventura 13.x**.
|
|||||||
|
|
||||||
| Model Name | Identifier | Tagged Issues |
|
| Model Name | Identifier | Tagged Issues |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| Mac Pro (Early 2008) | `MacPro3,1` | - Recommend upgrade to Metal GPU<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Remove stock Bluetooth to prevent panics |
|
| Mac Pro (Early 2008) | `MacPro3,1` | - [Recommend upgrade to Metal GPU](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008)<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Remove stock Bluetooth to prevent panics |
|
||||||
| Mac Pro (Early 2009) | `MacPro4,1` | - Recommend upgrade to Metal GPU<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
|
| Mac Pro (Early 2009) | `MacPro4,1` | - [Recommend upgrade to Metal GPU](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008)<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
|
||||||
| Mac Pro (Mid 2010)<br>Mac Pro (Mid 2012) | `MacPro5,1` | ^^ |
|
| Mac Pro (Mid 2010)<br>Mac Pro (Mid 2012) | `MacPro5,1` | ^^ |
|
||||||
| Mac Pro (Late 2013) | `MacPro6,1` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
| Mac Pro (Late 2013) | `MacPro6,1` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
|
||||||
| Mac Pro (2019) | `MacPro7,1` | - Supported by Apple |
|
| Mac Pro (2019) | `MacPro7,1` | - Supported by Apple |
|
||||||
|
|||||||
@@ -44,6 +44,14 @@ If you're unsure whether you should enable SIP, leave it as-is. Systems where yo
|
|||||||
|
|
||||||
## Applying Post Install Volume Patches
|
## Applying Post Install Volume Patches
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
|
||||||
|
If you need to use Migration Assistant to bring over data to your new macOS install, it is **highly recommended** to avoid restoring from inside Setup Assistant and waiting to install root patches until after the transfer is complete. If root patches were automatically installed, you can use the options available in the OCLP app to remove them.
|
||||||
|
|
||||||
|
Using Migration Assistant while patches are installed can lead to an unbootable system, requiring a reinstall of macOS.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
Post Install Volume Patches, sometimes also called root patches, are patches that have to be installed to disk for some older Macs to gain back functionality.
|
Post Install Volume Patches, sometimes also called root patches, are patches that have to be installed to disk for some older Macs to gain back functionality.
|
||||||
|
|
||||||
OCLP will automatically root patch your system during a first time install **if the USB install media was created within OCLP.** Users will also be prompted to install these patches after macOS updates or whenever patches are not detected on the system. We recommend rebuilding OpenCore with the latest version of OCLP to take advantage of these new features.
|
OCLP will automatically root patch your system during a first time install **if the USB install media was created within OCLP.** Users will also be prompted to install these patches after macOS updates or whenever patches are not detected on the system. We recommend rebuilding OpenCore with the latest version of OCLP to take advantage of these new features.
|
||||||
@@ -60,11 +68,12 @@ Users can also see whether applicable patches have been installed, date and vers
|
|||||||
|
|
||||||
If you're using OCLP v0.4.3 or earlier, or need to run the patcher manually, you can do so with the app. There is no harm in trying to run the Patcher, as without compatible hardware, nothing will be done. You can see below on whether your hardware needs root volume patching or not.
|
If you're using OCLP v0.4.3 or earlier, or need to run the patcher manually, you can do so with the app. There is no harm in trying to run the Patcher, as without compatible hardware, nothing will be done. You can see below on whether your hardware needs root volume patching or not.
|
||||||
|
|
||||||
|
There is also an option to remove root patches, which may be required in some situations, such as switching GPUs in Mac Pros or using Migration Assistant.
|
||||||
|
|
||||||
| Listing Patches | Patching Finished |
|
| Listing Patches | Patching Finished |
|
||||||
| :--- | :--- |
|
| :--- | :--- |
|
||||||
|  |  |
|
|  |  |
|
||||||
|
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
|
|
||||||
With macOS Ventura and Macs with AMD Legacy GCN GPUs (ie. Metal), Root Patching requires a network connection to grab Apple's Kernel Debug Kit to start root patching. If your system is unable to connect to the internet, you can manually download a KDK from Apple's site:
|
With macOS Ventura and Macs with AMD Legacy GCN GPUs (ie. Metal), Root Patching requires a network connection to grab Apple's Kernel Debug Kit to start root patching. If your system is unable to connect to the internet, you can manually download a KDK from Apple's site:
|
||||||
|
|||||||
93
docs/SONOMA-DROP.md
Normal file
93
docs/SONOMA-DROP.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|

|
||||||
|
|
||||||
|
*Well here we are again, it's always such a pleasure~*
|
||||||
|
|
||||||
|
Apple has yet again dropped a bunch of models, continuing their journey on discontinuing Intel Macs. With the release of OpenCore Legacy Patcher 1.0.0, early support for macOS Sonoma has been implemented.
|
||||||
|
|
||||||
|
## Versioning
|
||||||
|
|
||||||
|
With 1.0.0, we'll be switching to a proper major, minor and bug fix system ([Semantic Versioning](https://semver.org/)). This means the coming release will be version 1.0.0, and future releases plan to follow this scheme:
|
||||||
|
|
||||||
|
- First digit: Major changes, including new OS support, API changes, and significant patch set changes, etc
|
||||||
|
- Second digit: Minor changes, including incoming OS update fixes, minor patch set changes, etc
|
||||||
|
- Third digit: Bug fixes, primarily hot fixes either due to a regression in prior release or resolving issues in already released OS updates
|
||||||
|
|
||||||
|
|
||||||
|
## Newly dropped hardware
|
||||||
|
|
||||||
|
* MacBook10,1: MacBook (Retina, 12-inch, 2017)
|
||||||
|
* MacBookPro14,1: MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
|
||||||
|
* MacBookPro14,2: MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)
|
||||||
|
* MacBookPro14,3: MacBook Pro (15-inch, 2017)
|
||||||
|
* iMac18,1: iMac (21.5-inch, 2017)
|
||||||
|
* iMac18,2: iMac (Retina 4K, 21.5-inch, 2017)
|
||||||
|
* iMac18,3: iMac (Retina 5K, 27-inch, 2017)
|
||||||
|
|
||||||
|
## Current status
|
||||||
|
|
||||||
|
OpenCore Legacy Patcher 1.0.0 will support Sonoma for all models normally supported by the Patcher, however some challenges remain. You can find information about them below.
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
|
||||||
|
* [Bluetooth](#bluetooth)
|
||||||
|
* [T1 Security chip](#t1-security-chip)
|
||||||
|
* [USB 1.1 (OHCI/UHCI) Support](#usb-11-ohciuhci-support)
|
||||||
|
* [Graphics support and issues](#graphics-support-and-issues)
|
||||||
|
|
||||||
|
|
||||||
|
### Bluetooth
|
||||||
|
|
||||||
|
Sometimes Bluetooth may not work after boot on pre-2012 models. Running NVRAM reset can alleviate it.
|
||||||
|
|
||||||
|
Dual boots may also bring the issue back even after the reset.
|
||||||
|
|
||||||
|
### T1 Security chip
|
||||||
|
|
||||||
|
::: details Support for the T1 Security chip (Resolved in 1.1.0 and newer)
|
||||||
|
|
||||||
|
Sonoma has removed support for T1 chips found in most 2016 and 2017 Macs. Therefore on these systems, the following will not function:
|
||||||
|
|
||||||
|
* Enable or disable FileVault
|
||||||
|
* Open the Password Settings window
|
||||||
|
* Add fingerprints (if upgrading, existing fingerprints will be deleted)
|
||||||
|
* Add cards to Apple Pay
|
||||||
|
|
||||||
|
[More information here](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1103)
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
::: warning
|
||||||
|
Note that erasing the entire drive will remove the T1 firmware and it won't be reinstalled.
|
||||||
|
:::
|
||||||
|
|
||||||
|
### USB 1.1 (OHCI/UHCI) Support
|
||||||
|
|
||||||
|
For Penryn systems, pre-2013 Mac Pros and Xserve, USB 1.1 support was outright removed in macOS Ventura and naturally this continues in Sonoma.
|
||||||
|
While USB 1.1 may seem unimportant, it handles many important devices on your system. These include:
|
||||||
|
|
||||||
|
* Keyboard and Trackpad for laptops
|
||||||
|
* IR Receivers
|
||||||
|
* Bluetooth
|
||||||
|
|
||||||
|
With OpenCore Legacy Patcher v0.6.0+, basic support has been implemented via Root Volume patching. However due to this, users will need to use a USB hub for installation and post-OS updates when patches are cleaned:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
::: warning The following systems rely on USB 1.1
|
||||||
|
|
||||||
|
* iMac10,x and older
|
||||||
|
* Macmini4,1 and older
|
||||||
|
* MacBook7,1 and older
|
||||||
|
* MacBookAir3,1 and older
|
||||||
|
* MacPro5,1 and older
|
||||||
|
* Xserve 3,1 and older
|
||||||
|
:::
|
||||||
|
|
||||||
|
[More information here](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)
|
||||||
|
|
||||||
|
### Graphics support and issues
|
||||||
|
This build includes both Legacy Metal and non-Metal patches for macOS Sonoma. Refer to the following links for more information about Legacy Metal and non-Metal support and their respective issues.
|
||||||
|
|
||||||
|
* [Legacy Metal](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008)
|
||||||
|
* [Non-Metal](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)
|
||||||
|
|
||||||
144
docs/TESTED.md
144
docs/TESTED.md
@@ -1,144 +0,0 @@
|
|||||||
# Tested Models on OpenCore Legacy Patcher
|
|
||||||
|
|
||||||
To aid users in troubleshooting, we've compiled a list of users who've reported success with OpenCore Legacy Patcher as well as the version used. This should aid users in verifying whether issues with the patcher are regression-related with newer versions.
|
|
||||||
|
|
||||||
::: details MacBook
|
|
||||||
|
|
||||||
| SMBIOS | Tested | Tester | Model | Version | Comment |
|
|
||||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
||||||
| MacBook4,1 | <span style="color:#30BCD5"> YES </span> | Mami | Stock | Unknown | Couldn't install due to broken USB support |
|
|
||||||
| MacBook5,1 | ^^ | air.man | ^^ | 0.0.19 | N/A |
|
|
||||||
| MacBook5,2 | ^^ | Finder352 | ^^ | ^^ | ^^ |
|
|
||||||
| MacBook6,1 | ^^ | Finder352 | ^^ | ^^ | ^^ |
|
|
||||||
| MacBook7,1 | ^^ | MykolaG | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | Jazzzny | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | AlexSakha67 | ^^ | 0.0.20 | ^^ |
|
|
||||||
| MacBook8,1 | <span style="color:red"> NO </span> | N/A | N/A | N/A | ^^ |
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
::: details MacBook Air
|
|
||||||
|
|
||||||
| SMBIOS | Tested | Tester | Model | Version | Comment |
|
|
||||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
||||||
| MacBookAir2,1 | <span style="color:#30BCD5"> YES </span> | Bruno | Stock | 0.4.5 | Slow to the point of being unusable. |
|
|
||||||
| MacBookAir3,1 | ^^ | uvesten | Stock | 0.3.3 | N/A |
|
|
||||||
| MacBookAir3,2 | ^^ | houser42 | ^^ | Unknown | ^^ |
|
|
||||||
| MacBookAir4,1 | <span style="color:red"> NO </span> | N/A | N/A | N/A | ^^ |
|
|
||||||
| MacBookAir4,2 | <span style="color:#30BCD5"> YES </span> | bdwilson1907 | Stock | 0.3.1 | Intermittent keyboard backlight |
|
|
||||||
| MacBookAir5,1 | ^^ | Ausdauersportler | ^^ | 0.0.9 | N/A |
|
|
||||||
| ^^ | ^^ | webg3 | ^^ | Unknown | ^^ |
|
|
||||||
| MacBookAir5,2 | ^^ | Bab-droid | ^^ | 0.0.19 | ^^ |
|
|
||||||
| ^^ | ^^ | K-Hobert | ^^ | Unknown | ^^ |
|
|
||||||
| ^^ | ^^ | cboukouv | ^^ | 0.0.21 | ^^ |
|
|
||||||
| MacBookAir6,1 | <span style="color:red"> NO </span> | N/A | N/A | N/A | N/A |
|
|
||||||
| MacBookAir6,2 | ^^ | ^^ | ^^ | ^^ | ^^ |
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
::: details MacBook Pro
|
|
||||||
|
|
||||||
| SMBIOS | Tested | Tester | Model | Version | Comment |
|
|
||||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
||||||
| MacBookPro4,1 | <span style="color:#30BCD5"> YES </span> | cboukouv | Stock | 0.0.19 | N/A |
|
|
||||||
| MacBookPro5,1 | ^^ | GURU_Jasho#5736 | ^^ | 0.0.21 | ^^ |
|
|
||||||
| MacBookPro5,2 | ^^ | hvds | ^^ | ^^ | ^^ |
|
|
||||||
| MacBookPro5,3 | ^^ | kommtzeitkonrad | ^^ | 0.0.22 | ^^ |
|
|
||||||
| MacBookPro5,4 | <span style="color:red"> NO </span> | N/A | N/A | N/A | ^^ |
|
|
||||||
| MacBookPro5,5 | <span style="color:#30BCD5"> YES </span> | ASentientHedgehog | Stock | - | ^^ |
|
|
||||||
| ^^ | ^^ | ParaDoX1994 | Stock | 0.4.5 | Camera/Bluetooth not working (connector broken) |
|
|
||||||
| MacBookPro6,1 | <span style="color:red"> NO </span> | N/A | N/A | N/A | N/A |
|
|
||||||
| MacBookPro6,2 | <span style="color:#30BCD5"> YES </span> | Jakeluke | Stock | Unknown | dGPU broken |
|
|
||||||
| MacBookPro7,1 | ^^ | fussel132 | ^^ | 0.1.2 | N/A
|
|
||||||
| ^^ | ^^ | casey1234 | Upgraded | 0.3.3 | Upgraded SSD |
|
|
||||||
| MacBookPro8,1 | <span style="color:#30BCD5"> YES </span> | AvaQueen | Stock | 0.0.19 | N/A |
|
|
||||||
| MacBookPro8,1 | ^^ | charly-black | Upgraded | 0.3.1 | Upgraded BCM94331PCIEBT4CAX |
|
|
||||||
| MacBookPro8,2 | ^^ | air.man | Stock | 0.0.22 | dGPU disabled |
|
|
||||||
| ^^ | ^^ | cboukouv | ^^ | 0.0.19 | N/A |
|
|
||||||
| MacBookPro8,3 | ^^ | lulujyc | ^^ | 0.1.4 | dGPU disabled |
|
|
||||||
| MacBookPro9,1 | <span style="color:#30BCD5"> YES </span>| jbdamiano | Stock | 0.0.19 | N/A |
|
|
||||||
| ^^ | ^^ | dennes544 | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | cgrazy | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | LIPA85 | ^^ | ^^ | ^^ |
|
|
||||||
| MacBookPro9,2 | <span style="color:#30BCD5"> YES </span> | alexx17xx | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | Arvxistanx | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | CyberDroid1 | ^^ | 0.0.16 | ^^ |
|
|
||||||
| ^^ | ^^ | woefi | Upgraded | 0.0.13 | Upgraded BCM94331CAX |
|
|
||||||
| ^^ | ^^ | whgmkeller | Stock | 0.0.11 | N/A |
|
|
||||||
| ^^ | ^^ | vinaypundith | Unknown | 0.0.7 | ^^ |
|
|
||||||
| ^^ | ^^ | casey1234 | Upgraded | 0.3.3 | Upgraded RAM and SSD |
|
|
||||||
| ^^ | ^^ | crystall1nedev | Upgraded | 0.4.4 | ^^ |
|
|
||||||
| MacBookPro10,1 | <span style="color:#30BCD5"> YES </span> | traviswparker | Stock | 0.0.14 | N/A |
|
|
||||||
| ^^ | ^^ | il-rollino | Upgraded | 0.0.21 | Upgraded BCM94360CSAX |
|
|
||||||
| MacBookPro10,2 | ^^ | akidone | ^^ | 0.3.0 | ^^ |
|
|
||||||
| MacBookPro11,1 | <span style="color:#30BCD5"> YES </span> | ParaDoX1994 | Stock | 0.4.4 | N/A |
|
|
||||||
| MacBookPro11,2 | ^^ | casey1234 | ^^ | 0.3.3 | ^^ |
|
|
||||||
| MacBookPro11,3 | <span style="color:red"> NO </span> | N/A | N/A | N/A | N/A |
|
|
||||||
:::
|
|
||||||
|
|
||||||
::: details Mac mini
|
|
||||||
|
|
||||||
| SMBIOS | Tested | Tester | Model | Version | Comment |
|
|
||||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
||||||
| Macmini3,1 | <span style="color:#30BCD5"> YES </span> | ASentientHedgehog | Stock | N/A | N/A |
|
|
||||||
| Macmini4,1 | <span style="color:#30BCD5"> YES </span> | Towster15#6369 | ^^ | 0.4.4 | Does not have internal SATA cable, booted and installed to SSD over USB 2.0 instead |
|
|
||||||
| ^^ | ^^ | MykolaG | ^^ | 0.4.5 | SD card reader possibly broken. |
|
|
||||||
| Macmini5,1 | <span style="color:#30BCD5"> YES </span> | MykolaG | ^^ | 0.4.5 | N/A |
|
|
||||||
| Macmini5,2 | ^^ | charly-black | ^^ | 0.3.1 | ^^ |
|
|
||||||
| ^^ | ^^ | MykolaG | ^^ | 0.4.5 | SD card reader possibly broken. |
|
|
||||||
| Macmini5,3 | <span style="color:red"> NO </span> | N/A | N/A | N/A | N/A |
|
|
||||||
| Macmini6,1 | <span style="color:#30BCD5"> YES </span> | cicofz | Stock | 0.0.21 | ^^ |
|
|
||||||
| ^^ | ^^ | Stig124 | ^^ | 0.0.19 | ^^ |
|
|
||||||
| ^^ | ^^ | mwidjaya | ^^ |0.0.18 | ^^ |
|
|
||||||
| ^^| ^^ | MykolaG | ^^ | 0.4.5 | ^^ |
|
|
||||||
| Macmini6,2 | ^^ | Shelbs | ^^ | 0.0.16 | ^^ |
|
|
||||||
| Macmini7,1 | <span style="color:#30BCD5"> YES </span> | MykolaG | ^^ | 0.4.5 | ^^ |
|
|
||||||
| Macmini8,1 | ^^ | ^^ | ^^ | 0.4.5 | ^^ |
|
|
||||||
:::
|
|
||||||
|
|
||||||
::: details iMac
|
|
||||||
|
|
||||||
| SMBIOS | Tested | Tester | Model | Version | Comment |
|
|
||||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
||||||
| iMac7,1 | <span style="color:#30BCD5"> YES </span> | lulujyc | Upgraded | 0.3.1 | Upgraded with BCM94352HMB <br><br> The USB 1.1 controller is unstable on Big Sur+, using USB hubs (forcing USB 2.0) can fix unrecognized keyboard/ mouse. |
|
|
||||||
| iMac8,1 | <span style="color:#30BCD5"> YES </span> | EduCovas | Stock | 0.0.21 | N/A |
|
|
||||||
| iMac9,1 | <span style="color:#30BCD5"> YES </span> | Allanrfox | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | Jakeluke | ^^ | ^^ | ^^ |
|
|
||||||
| iMac10,1 | <span style="color:#30BCD5"> YES </span> | Ausdauersportler | Upgraded | Unknown | Upgraded with WX4150 |
|
|
||||||
| iMac11,1 | ^^ | internetzel | ^^ | ^^ | Upgraded RX580 mobile |
|
|
||||||
| iMac11,2 | ^^ | MykolaG | Stock | 0.0.21 | N/A |
|
|
||||||
| ^^ | ^^ | iMac-iPad | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | vinaypundith | Unknown | 0.0.19 | ^^ |
|
|
||||||
| iMac11,3 | ^^ | Ausdauersportler | Upgraded | 0.0.21 | Upgraded with Polaris GPU and BCM943602CDP |
|
|
||||||
| iMac12,1 | <span style="color:#30BCD5"> YES </span> | shnockdu | ^^ | ^^ | Upgraded with Kepler GPU |
|
|
||||||
| ^^ | ^^ | StephN999 | ^^ | ^^ | Upgraded with WX4150 GPU and BCM94360CD |
|
|
||||||
| iMac12,2 | ^^ | Ausdauersportler | ^^ | ^^ | Upgraded with Polaris GPU and BCM943602CDP |
|
|
||||||
| iMac13,1 | <span style="color:#30BCD5"> YES </span> | alexx17xx | Stock | 0.0.19 | N/A |
|
|
||||||
| iMac13,2 | ^^ | Alain13 | ^^ | ^^ | ^^ |
|
|
||||||
| ^^ | ^^ | algernonpule | ^^ | ^^ | ^^ |
|
|
||||||
| iMac13,3 | <span style="color:red"> NO </span> | N/A | N/A | N/A | ^^ |
|
|
||||||
| iMac14,1 | <span style="color:#30BCD5"> YES </span> | woefi | Upgraded | 0.0.21 | Upgraded NVMe |
|
|
||||||
| ^^ | ^^ | mikeboss | Stock | 0.0.19 | N/A |
|
|
||||||
| iMac14,2 | ^^ | OKonnel | ^^ | 0.0.22 | ^^ |
|
|
||||||
| ^^ | ^^ | mibaxx | ^^ | 0.0.21 | ^^ |
|
|
||||||
| iMac14,3 | ^^ | StupeFied | ^^ | 0.4.5 | ^^ |
|
|
||||||
| iMac15,1 | <span style="color:#30BCD5"> YES </span> | JakubMazur | Upgraded | 0.4.1 | Upgraded RAM, Radeon R9 M295X and Quad-Core Intel Core i7 |
|
|
||||||
:::
|
|
||||||
|
|
||||||
::: details Mac Pro
|
|
||||||
|
|
||||||
| SMBIOS | Tested | Tester | Model | Version | Comment |
|
|
||||||
| :--- | :--- | :--- | :--- | :--- | :--- |
|
|
||||||
| MacPro3,1 | <span style="color:#30BCD5"> YES </span> | MykolaG | Upgraded | 0.1.6 | Upgraded RX 470 and BCM94360CD.<br/>Stock Bluetooth card removed. |
|
|
||||||
| ^^ | ^^ | christiann | ^^ | 0.0.21 | Upgraded RX 560 and BCM94322.<br/>Stock Bluetooth card removed. |
|
|
||||||
| ^^ | ^^ | gw463 | ^^ | 0.0.22 | Upgraded GTX 680 and BCM94360 |
|
|
||||||
| ^^ | ^^ | AlexSakha67 | ^^ | 0.0.20 | Upgraded R9 280 |
|
|
||||||
| ^^ | ^^ | nekton1 | ^^ | ^^ | Upgraded GTX 680 |
|
|
||||||
| ^^ | ^^ | Pri-est | Unknown | 0.0.9 | N/A |
|
|
||||||
| ^^ | ^^ | vinaypundith | Upgraded | 0.0.6 | Upgraded with GTX 680 and BCM94360CD. |
|
|
||||||
| ^^ | ^^ | ParaDoX1994 | ^^ | 0.4.4 | Upgraded with HD 7950.<br/>Stock Bluetooth card removed. |
|
|
||||||
| MacPro4,1 | <span style="color:#30BCD5"> YES </span> | vinaypundith | Unknown | 0.0.9 | N/A |
|
|
||||||
| MacPro5,1 | ^^ | woefi | Upgraded | 0.0.21 | Upgraded with RX 580. |
|
|
||||||
| ^^ | ^^ | Mabrouk Oscar | Unknown | ^^ | N/A |
|
|
||||||
| ^^ | ^^ | astuffedtiger | Flashed | 0.0.18 | MacPro4,1 flashed to 5,1 |
|
|
||||||
:::
|
|
||||||
@@ -6,6 +6,7 @@ Here are some common errors that users may experience while using this patcher:
|
|||||||
* [Stuck on `This version of Mac OS X is not supported on this platform` or (🚫) Prohibited Symbol](#stuck-on-this-version-of-mac-os-x-is-not-supported-on-this-platform-or-(🚫)-prohibited-symbol)
|
* [Stuck on `This version of Mac OS X is not supported on this platform` or (🚫) Prohibited Symbol](#stuck-on-this-version-of-mac-os-x-is-not-supported-on-this-platform-or-(🚫)-prohibited-symbol)
|
||||||
* [Cannot boot macOS without the USB](#cannot-boot-macos-without-the-usb)
|
* [Cannot boot macOS without the USB](#cannot-boot-macos-without-the-usb)
|
||||||
* [Infinite Recovery OS Booting](#infinite-recovery-os-reboot)
|
* [Infinite Recovery OS Booting](#infinite-recovery-os-reboot)
|
||||||
|
* [Stuck on boot after root patching](#stuck-on-boot-after-root-patching)
|
||||||
* [Reboot when entering Hibernation (`Sleep Wake Failure`)](#reboot-when-entering-hibernation-sleep-wake-failure)
|
* [Reboot when entering Hibernation (`Sleep Wake Failure`)](#reboot-when-entering-hibernation-sleep-wake-failure)
|
||||||
* [How to Boot Recovery through OpenCore Legacy Patcher](#how-to-boot-recovery-through-opencore-legacy-patcher)
|
* [How to Boot Recovery through OpenCore Legacy Patcher](#how-to-boot-recovery-through-opencore-legacy-patcher)
|
||||||
* [Stuck on "Your Mac needs a firmware update"](#stuck-on-your-mac-needs-a-firmware-update)
|
* [Stuck on "Your Mac needs a firmware update"](#stuck-on-your-mac-needs-a-firmware-update)
|
||||||
@@ -51,6 +52,32 @@ With OpenCore Legacy Patcher, we rely on Apple Secure Boot to ensure OS updates
|
|||||||
|
|
||||||
* Note: Machines with modified root volumes will also result in an infinite recovery loop until integrity is restored.
|
* Note: Machines with modified root volumes will also result in an infinite recovery loop until integrity is restored.
|
||||||
|
|
||||||
|
## Stuck on boot after root patching
|
||||||
|
|
||||||
|
Boot into recovery by pressing space when your disk is selected on the OCLP bootpicker (if you have it hidden, hold ESC while starting up)
|
||||||
|
|
||||||
|
* **Note:** If your disk name is something else than "Macintosh HD", make sure to change the path accordingly. You can figure out your disk name by typing `ls /Volumes`.
|
||||||
|
|
||||||
|
Go into terminal and first mount the disk by typing
|
||||||
|
```sh
|
||||||
|
mount -uw "/Volumes/Macintosh HD"
|
||||||
|
```
|
||||||
|
Then revert the snapshot
|
||||||
|
```sh
|
||||||
|
bless --mount "/Volumes/Macintosh HD" --bootefi --last-sealed-snapshot
|
||||||
|
```
|
||||||
|
After that, type the following
|
||||||
|
```sh
|
||||||
|
cd "/Volumes/Macintosh HD/Library/Extensions" && ls
|
||||||
|
```
|
||||||
|
You should now see bunch of .kexts. If you only see .kexts starting with "HighPoint" and "SoftRAID", you can ignore this and just restart the system. If other kexts are found, continue.
|
||||||
|
|
||||||
|
Delete everything **except** for the ones that start with HighPoint and SoftRAID, by using `rm -rf "kextname"`
|
||||||
|
|
||||||
|
Then restart and now your system should be restored to the unpatched snapshot and should be able to boot again.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Reboot when entering Hibernation (`Sleep Wake Failure`)
|
## Reboot when entering Hibernation (`Sleep Wake Failure`)
|
||||||
|
|
||||||
[Known issue on some models](https://github.com/dortania/Opencore-Legacy-Patcher/issues/72), a temporary fix is to disable Hibernation by executing the following command in the terminal:
|
[Known issue on some models](https://github.com/dortania/Opencore-Legacy-Patcher/issues/72), a temporary fix is to disable Hibernation by executing the following command in the terminal:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Uninstalling OpenCore
|
# Uninstalling OpenCore
|
||||||
|
|
||||||
To remove OpenCore:
|
## Uninstalling the bootloader
|
||||||
|
|
||||||
1. Remove OpenCore either from the USB or internal drive
|
1. Remove OpenCore either from the USB or internal drive
|
||||||
|
|
||||||
@@ -15,4 +15,9 @@ To remove OpenCore:
|
|||||||
|
|
||||||
Note that after you remove OpenCore, your Mac will no longer boot and show the "prohibited" symbol. Be ready to install an natively-supported version of macOS before you uninstall OpenCore.
|
Note that after you remove OpenCore, your Mac will no longer boot and show the "prohibited" symbol. Be ready to install an natively-supported version of macOS before you uninstall OpenCore.
|
||||||
|
|
||||||
* This does not apply to native to native Macs just using OpenCore to achieve features like AirPlay to Mac and Sidecar, but it is still recomended to reinstall macOS, after removing OpenCore, if using SMBIOS spoofing to enable Univeral Control.
|
* This does not apply to native Macs just using OpenCore to achieve features like AirPlay to Mac and Sidecar, but it is still recommended to reinstall macOS after removing OpenCore, if using SMBIOS spoofing to enable Univeral Control.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Uninstalling the application
|
||||||
|
|
||||||
|
If you want to remove the application without reinstalling the OS, navigate to `/Library/Application Support/` and delete the Dortania folder.
|
||||||
|
|||||||
@@ -204,9 +204,41 @@ Before we continue, please keep in mind that SMBIOS Spoofing is an advanced feat
|
|||||||
|
|
||||||
Ventura has dropped more models which includes all of the blacklisted Macs in question, making the procedure slightly different. It is important to follow the guide for the version you're on, failing to do so is likely to cause boot issues.
|
Ventura has dropped more models which includes all of the blacklisted Macs in question, making the procedure slightly different. It is important to follow the guide for the version you're on, failing to do so is likely to cause boot issues.
|
||||||
|
|
||||||
|
::: details macOS Sonoma
|
||||||
|
|
||||||
|
Firstly run OpenCore Legacy Patcher.
|
||||||
|
|
||||||
|
Then go to **Settings** and **SMBIOS** tab, set SMBIOS Spoof Level to **Moderate**. Set SMBIOS Spoof Model **one listed next to your native model in the table for spoofed models below.**
|
||||||
|
|
||||||
|
Notice that "Allow native models" and "Allow Native Spoofs" **are NOT** enabled unlike on Monterey, this is on purpose. They are no longer relevant on Sonoma and enabling them will cause boot issues.
|
||||||
|
|
||||||
|
| Main Settings view | SMBIOS settings |
|
||||||
|
| :--- | :--- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
::: details Table for spoofed models (click to expand)
|
||||||
|
|
||||||
|
Spoofing to any model with native Sonoma support should work, but these are the earliest Macs natively supported by Sonoma and thus chosen for the sake of simplicity.
|
||||||
|
|
||||||
|
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Ventura as long as the other requirements are met, since they aren't blacklisted.
|
||||||
|
|
||||||
|
|
||||||
|
| Mac by name | Native SMBIOS | Spoof SMBIOS |
|
||||||
|
|-------------|---------------|--------------|
|
||||||
|
| MacBook Air Early 2015 11" / 13" | MacBookAir7,x | MacBookAir8,1 |
|
||||||
|
| MacBook Pro Early 2015 13" | MacBookPro12,x | MacBookPro15,2 |
|
||||||
|
| MacBook Pro Mid 2015 15" | MacBookPro11,4 / 11,5 | MacBookPro15,2 |
|
||||||
|
| iMac Late 2015 21" | iMac16,x | iMac19,2 |
|
||||||
|
| Mac mini Late 2014 | Macmini7,x | MacMini8,1 |
|
||||||
|
| Mac Pro Late 2013 | MacPro6,x | MacPro7,1 |
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
::: details macOS Ventura
|
::: details macOS Ventura
|
||||||
|
|
||||||
Firstly run the GUI version of OpenCore Legacy Patcher.
|
Firstly run OpenCore Legacy Patcher.
|
||||||
|
|
||||||
Then go to **Settings** and **SMBIOS** tab, set SMBIOS Spoof Level to **Moderate**. Set SMBIOS Spoof Model **one listed next to your native model in the table for spoofed models below.**
|
Then go to **Settings** and **SMBIOS** tab, set SMBIOS Spoof Level to **Moderate**. Set SMBIOS Spoof Model **one listed next to your native model in the table for spoofed models below.**
|
||||||
|
|
||||||
@@ -225,20 +257,20 @@ Spoofing to any model with native Ventura support should work, but these are the
|
|||||||
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Ventura as long as the other requirements are met, since they aren't blacklisted.
|
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Ventura as long as the other requirements are met, since they aren't blacklisted.
|
||||||
|
|
||||||
|
|
||||||
| Mac by name | Native SMBIOS | Spoof SMBIOS | Tested | Tested by |
|
| Mac by name | Native SMBIOS | Spoof SMBIOS |
|
||||||
|-------------|---------------|--------------|--------|-----------|
|
|-------------|---------------|--------------|
|
||||||
| MacBook Air Early 2015 11" / 13" | MacBookAir7,x | MacBookAir8,1 | <span style="color:red"> NO </span> | N/A |
|
| MacBook Air Early 2015 11" / 13" | MacBookAir7,x | MacBookAir8,1 |
|
||||||
| MacBook Pro Early 2015 13" | MacBookPro12,x | MacBookPro14,1 | ^^ | ^^ |
|
| MacBook Pro Early 2015 13" | MacBookPro12,x | MacBookPro14,1 |
|
||||||
| MacBook Pro Mid 2015 15" | MacBookPro11,4 / 11,5 | MacBookPro14,3 | ^^ | ^^
|
| MacBook Pro Mid 2015 15" | MacBookPro11,4 / 11,5 | MacBookPro14,3 |
|
||||||
| iMac Late 2015 21" | iMac16,x | iMac18,2 | ^^ | ^^
|
| iMac Late 2015 21" | iMac16,x | iMac18,2 |
|
||||||
| Mac mini Late 2014 | Macmini7,x | MacMini8,1 | <span style="color:red"> NO </span> | N/A |
|
| Mac mini Late 2014 | Macmini7,x | MacMini8,1 |
|
||||||
| Mac Pro Late 2013 | MacPro6,x | MacPro7,1 | <span style="color:red"> NO </span> | N/A |
|
| Mac Pro Late 2013 | MacPro6,x | MacPro7,1 |
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
::: details macOS Monterey
|
::: details macOS Monterey
|
||||||
|
|
||||||
Firstly, run the GUI version of OpenCore Legacy Patcher. Secondly, go to **Settings** then the **App** tab and tick **Allow native models**.
|
Firstly, run OpenCore Legacy Patcher. Secondly, go to **Settings** then the **App** tab and tick **Allow native models**.
|
||||||
|
|
||||||
[](../images/OCLP-App-Allow-Native-Models.png)
|
[](../images/OCLP-App-Allow-Native-Models.png)
|
||||||
|
|
||||||
@@ -257,14 +289,14 @@ Any model after the list of officially blacklisted Macs should be supported, but
|
|||||||
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Monterey, as long as the other requirements are met, since they aren't blacklisted.
|
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Monterey, as long as the other requirements are met, since they aren't blacklisted.
|
||||||
|
|
||||||
|
|
||||||
| Mac by name | Native SMBIOS | Spoof SMBIOS | Tested | Tested by |
|
| Mac by name | Native SMBIOS | Spoof SMBIOS |
|
||||||
|-------------|---------------|--------------|--------|-----------|
|
|-------------|---------------|--------------|
|
||||||
| MacBook Air Early 2015 11" / 13" | MacBookAir7,x | MacBookAir8,1 | <span style="color:#30BCD5"> YES </span> | Hzlph |
|
| MacBook Air Early 2015 11" / 13" | MacBookAir7,x | MacBookAir8,1 |
|
||||||
| MacBook Pro Early 2015 13" | MacBookPro12,x | MacBookPro13,1 | ^^ | ^^ |
|
| MacBook Pro Early 2015 13" | MacBookPro12,x | MacBookPro13,1 |
|
||||||
| MacBook Pro Mid 2015 15" | MacBookPro11,4 / 11,5 | MacBookPro13,3 | ^^ | ^^
|
| MacBook Pro Mid 2015 15" | MacBookPro11,4 / 11,5 | MacBookPro13,3 |
|
||||||
| iMac Late 2015 21" | iMac16,x | iMac18,2 | ^^ | ^^
|
| iMac Late 2015 21" | iMac16,x | iMac18,2 |
|
||||||
| Mac mini Late 2014 | Macmini7,x | MacMini8,1 | <span style="color:red"> NO </span> | N/A |
|
| Mac mini Late 2014 | Macmini7,x | MacMini8,1 |
|
||||||
| Mac Pro Late 2013 | MacPro6,x | MacPro7,1 | <span style="color:#30BCD5"> YES </span> | Crystall1nedev |
|
| Mac Pro Late 2013 | MacPro6,x | MacPro7,1 |
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
|||||||
@@ -5,21 +5,20 @@ Many older Macs do not "officially" support UEFI Windows installations, leading
|
|||||||
|
|
||||||
## Minimum Requirements
|
## Minimum Requirements
|
||||||
|
|
||||||
This guide will focus on the installation of Windows 10 without using Boot Camp Assistant. Windows 11 should also work, but its quirks will not be covered.
|
This guide will focus on the installation of modern Windows (10/11) without using Boot Camp Assistant.
|
||||||
|
|
||||||
* Due to hardware and firmware limitations, UEFI Windows installations are only recommended on the following machines:
|
* Due to hardware and firmware limitations, UEFI Windows installations are only recommended on the following machines:
|
||||||
|
|
||||||
* 2015 MacBook or newer (MacBook8,x+)
|
* 2015 MacBook or newer (`MacBook8,x`+)
|
||||||
* 2011 MacBook Air or newer (MacBookAir4,x+)
|
* 2011 MacBook Air or newer (`MacBookAir4,x`+)
|
||||||
* 2011 MacBook Pro or newer (MacBookPro8,x+)
|
* 2011 MacBook Pro or newer (`MacBookPro8,x`+)
|
||||||
* 2011 Mac mini or newer (Macmini5,x+)
|
* 2011 Mac mini or newer (`Macmini5,x`+)
|
||||||
* 2009[^1] Mac Pro or newer (MacPro4,1+), upgraded GPU is preferred
|
* 2009* Mac Pro or newer (`MacPro4,1`+), upgraded GPU is preferred
|
||||||
* 2010 iMac or newer (iMac11,x+), upgraded GPU is preferred
|
* 2010 iMac or newer (`iMac11,x`+), upgraded GPU is preferred
|
||||||
* 2009[^2] Xserve (Xserve3,1), upgraded GPU is preferred
|
* 2009* Xserve (`Xserve3,1`), upgraded GPU is preferred
|
||||||
|
|
||||||
|
|
||||||
[^1]: MacPro4,1 and MacPro5,1 systems experience issues with the Windows installer, follow the DISM installation section for instructions.
|
*`MacPro4,1`, `MacPro5,1`, and `Xserve3,1` systems experience issues with the Windows installer, follow the DISM installation section for instructions.
|
||||||
[^2]: Theoretically supported, not tested. Follow DISM installation section
|
|
||||||
|
|
||||||
If your machine is not listed, UEFI Windows will likely still install, but you may face stability/driver issues.
|
If your machine is not listed, UEFI Windows will likely still install, but you may face stability/driver issues.
|
||||||
|
|
||||||
@@ -87,18 +86,26 @@ The `rsync` command will take some time, so get some coffee and sit back. Once f
|
|||||||
|
|
||||||
## Installation Process
|
## Installation Process
|
||||||
|
|
||||||
Once you reboot your machine, you should see a new boot option in the OCLP Bootpicker labelled as "EFI Boot". It may or may not have the Boot Camp icon.
|
Once you reboot your machine, you should see a new boot option in the OCLP Bootpicker labelled as "EFI Boot" or "Windows". It may or may not have the Boot Camp icon.
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
|
|
||||||
If you aren't booted into OCLP, you may see two boot options labelled "Windows" and "EFI Boot". Do not choose either of the options and boot into OCLP to continue.
|
If you aren't booted into OCLP, you may see **two** boot options labelled "Windows" and "EFI Boot". Do not choose either of the options and boot into OCLP to continue.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Installation: Microsoft Method
|
### Installation: Microsoft Method
|
||||||
|
|
||||||
Once booted into the Windows installer, proceed as you normally would on any Windows computer. If you see an error message containing “Windows could not prepare the computer to boot into the next phase of installation”, please follow the next portion of this guide (DISM Installation).
|
Once booted into the Windows installer, proceed as you normally would on any Windows computer. If you see an error message containing “Windows could not prepare the computer to boot into the next phase of installation”, please follow the next portion of this guide (DISM Installation).
|
||||||
|
|
||||||
|
::: details Installing Windows 11
|
||||||
|
|
||||||
|
If you are installing Windows 11, you will need to [modify the Windows Setup](https://www.bleepingcomputer.com/news/microsoft/how-to-bypass-the-windows-11-tpm-20-requirement/) to allow installation on unsupported machines.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
### Installation: DISM Deployment Method
|
### Installation: DISM Deployment Method
|
||||||
|
|
||||||
Once booted into the Windows installer, proceed as you normally would until you reach the "Where do you want to install Windows" disk formatting section.
|
Once booted into the Windows installer, proceed as you normally would until you reach the "Where do you want to install Windows" disk formatting section.
|
||||||
@@ -132,7 +139,7 @@ Once `dism` finishes its thing, run `bcdboot E:\Windows`, substituting "E" for t
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Windows is now installed. It should be recognized as "EFI Boot" with a Boot Camp icon in the OCLP Bootpicker.
|
Windows is now installed. It should be recognized as "EFI Boot" or "Windows" with a Boot Camp icon in the OCLP Bootpicker.
|
||||||
|
|
||||||
:::warning
|
:::warning
|
||||||
|
|
||||||
@@ -221,4 +228,8 @@ You can also open `Properties` on the file to change the compatibility to `Previ
|
|||||||
|
|
||||||
### iMac12,x Bluescreen after driver installation
|
### iMac12,x Bluescreen after driver installation
|
||||||
|
|
||||||
Currently Intel's iGPU drivers for the HD 3000 series do not support UEFI booting in Windows. The recommended solution is to simply disable the iGPU: [iMac 12,1 Windows 10 Boot Loop – Fix Intel Graphics issue](https://zzq.org/?p=39)
|
Intel's iGPU drivers for the HD 3000 series do not support UEFI booting in Windows. The recommended solution is to simply disable the iGPU: [iMac 12,1 Windows 10 Boot Loop – Fix Intel Graphics issue](https://zzq.org/?p=39)
|
||||||
|
|
||||||
|
### NVIDIA Tesla Black Screen after driver installation
|
||||||
|
|
||||||
|
The NVIDIA Tesla GPUs found in 2008-2010 Macs do not support UEFI booting in Windows. You cannot use UEFI Windows without low-level patching on these machines.
|
||||||
BIN
images/sonoma.png
Normal file
BIN
images/sonoma.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 354 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 787 KiB After Width: | Height: | Size: 762 KiB |
@@ -284,6 +284,8 @@
|
|||||||
<false/>
|
<false/>
|
||||||
<key>EnableWriteUnprotector</key>
|
<key>EnableWriteUnprotector</key>
|
||||||
<false/>
|
<false/>
|
||||||
|
<key>FixupAppleEfiImages</key>
|
||||||
|
<false/>
|
||||||
<key>ForceBooterSignature</key>
|
<key>ForceBooterSignature</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>ForceExitBootServices</key>
|
<key>ForceExitBootServices</key>
|
||||||
@@ -887,7 +889,7 @@
|
|||||||
<key>Enabled</key>
|
<key>Enabled</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>MaxKernel</key>
|
<key>MaxKernel</key>
|
||||||
<string>22.99.99</string>
|
<string></string>
|
||||||
<key>MinKernel</key>
|
<key>MinKernel</key>
|
||||||
<string>18.0.0</string>
|
<string>18.0.0</string>
|
||||||
<key>BundlePath</key>
|
<key>BundlePath</key>
|
||||||
@@ -1377,7 +1379,7 @@
|
|||||||
<key>ExecutablePath</key>
|
<key>ExecutablePath</key>
|
||||||
<string>Contents/MacOS/AppleUSBOHCI</string>
|
<string>Contents/MacOS/AppleUSBOHCI</string>
|
||||||
<key>MaxKernel</key>
|
<key>MaxKernel</key>
|
||||||
<string></string>
|
<string>23.0.0</string>
|
||||||
<key>MinKernel</key>
|
<key>MinKernel</key>
|
||||||
<string>22.0.0</string>
|
<string>22.0.0</string>
|
||||||
<key>PlistPath</key>
|
<key>PlistPath</key>
|
||||||
@@ -1395,7 +1397,7 @@
|
|||||||
<key>ExecutablePath</key>
|
<key>ExecutablePath</key>
|
||||||
<string>Contents/MacOS/AppleUSBOHCIPCI</string>
|
<string>Contents/MacOS/AppleUSBOHCIPCI</string>
|
||||||
<key>MaxKernel</key>
|
<key>MaxKernel</key>
|
||||||
<string></string>
|
<string>23.0.0</string>
|
||||||
<key>MinKernel</key>
|
<key>MinKernel</key>
|
||||||
<string>22.0.0</string>
|
<string>22.0.0</string>
|
||||||
<key>PlistPath</key>
|
<key>PlistPath</key>
|
||||||
@@ -1413,7 +1415,7 @@
|
|||||||
<key>ExecutablePath</key>
|
<key>ExecutablePath</key>
|
||||||
<string>Contents/MacOS/AppleUSBUHCI</string>
|
<string>Contents/MacOS/AppleUSBUHCI</string>
|
||||||
<key>MaxKernel</key>
|
<key>MaxKernel</key>
|
||||||
<string></string>
|
<string>23.0.0</string>
|
||||||
<key>MinKernel</key>
|
<key>MinKernel</key>
|
||||||
<string>22.0.0</string>
|
<string>22.0.0</string>
|
||||||
<key>PlistPath</key>
|
<key>PlistPath</key>
|
||||||
@@ -1431,7 +1433,7 @@
|
|||||||
<key>ExecutablePath</key>
|
<key>ExecutablePath</key>
|
||||||
<string>Contents/MacOS/AppleUSBUHCIPCI</string>
|
<string>Contents/MacOS/AppleUSBUHCIPCI</string>
|
||||||
<key>MaxKernel</key>
|
<key>MaxKernel</key>
|
||||||
<string></string>
|
<string>23.0.0</string>
|
||||||
<key>MinKernel</key>
|
<key>MinKernel</key>
|
||||||
<string>22.0.0</string>
|
<string>22.0.0</string>
|
||||||
<key>PlistPath</key>
|
<key>PlistPath</key>
|
||||||
@@ -1707,6 +1709,24 @@
|
|||||||
<key>PlistPath</key>
|
<key>PlistPath</key>
|
||||||
<string>Contents/Info.plist</string>
|
<string>Contents/Info.plist</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Arch</key>
|
||||||
|
<string>x86_64</string>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>corecrypto - T1</string>
|
||||||
|
<key>Enabled</key>
|
||||||
|
<false/>
|
||||||
|
<key>MaxKernel</key>
|
||||||
|
<string></string>
|
||||||
|
<key>MinKernel</key>
|
||||||
|
<string>23.0.0</string>
|
||||||
|
<key>BundlePath</key>
|
||||||
|
<string>corecrypto_T1.kext</string>
|
||||||
|
<key>ExecutablePath</key>
|
||||||
|
<string>Contents/MacOS/corecrypto_T1</string>
|
||||||
|
<key>PlistPath</key>
|
||||||
|
<string>Contents/Info.plist</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Arch</key>
|
<key>Arch</key>
|
||||||
<string>x86_64</string>
|
<string>x86_64</string>
|
||||||
@@ -2360,8 +2380,8 @@
|
|||||||
<true/>
|
<true/>
|
||||||
<key>HideAuxiliary</key>
|
<key>HideAuxiliary</key>
|
||||||
<true/>
|
<true/>
|
||||||
<!-- <key>InstanceIdentifier</key>
|
<key>InstanceIdentifier</key>
|
||||||
<string></string> -->
|
<string></string>
|
||||||
<key>LauncherPath</key>
|
<key>LauncherPath</key>
|
||||||
<string>Default</string>
|
<string>Default</string>
|
||||||
<key>LauncherOption</key>
|
<key>LauncherOption</key>
|
||||||
@@ -3066,8 +3086,8 @@
|
|||||||
<integer>-1</integer>
|
<integer>-1</integer>
|
||||||
<key>ResizeUsePciRbIo</key>
|
<key>ResizeUsePciRbIo</key>
|
||||||
<false/>
|
<false/>
|
||||||
<!-- <key>ShimRetainProtocol</key>
|
<key>ShimRetainProtocol</key>
|
||||||
<false/> -->
|
<false/>
|
||||||
<key>TscSyncTimeout</key>
|
<key>TscSyncTimeout</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>UnblockFsConnect</key>
|
<key>UnblockFsConnect</key>
|
||||||
|
|||||||
@@ -235,7 +235,7 @@
|
|||||||
<key>GID</key>
|
<key>GID</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>PATH</key>
|
<key>PATH</key>
|
||||||
<string>../com.dortania.opencore-legacy-patcher.auto-patch.plist</string>
|
<string>../Launch Services/com.dortania.opencore-legacy-patcher.auto-patch.plist</string>
|
||||||
<key>PATH_TYPE</key>
|
<key>PATH_TYPE</key>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
<key>PERMISSIONS</key>
|
<key>PERMISSIONS</key>
|
||||||
|
|||||||
BIN
payloads/Kexts/Acidanthera/AMFIPass-v1.4.0-RELEASE.zip
Normal file
BIN
payloads/Kexts/Acidanthera/AMFIPass-v1.4.0-RELEASE.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/AirportBrcmFixup-v2.1.8-DEBUG.zip
Normal file
BIN
payloads/Kexts/Acidanthera/AirportBrcmFixup-v2.1.8-DEBUG.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Acidanthera/AirportBrcmFixup-v2.1.8-RELEASE.zip
Normal file
BIN
payloads/Kexts/Acidanthera/AirportBrcmFixup-v2.1.8-RELEASE.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Misc/AppleKeyStore-v1.1.0.zip
Normal file
BIN
payloads/Kexts/Misc/AppleKeyStore-v1.1.0.zip
Normal file
Binary file not shown.
Binary file not shown.
BIN
payloads/Kexts/Misc/AppleSSE-v1.1.0.zip
Normal file
BIN
payloads/Kexts/Misc/AppleSSE-v1.1.0.zip
Normal file
Binary file not shown.
BIN
payloads/Kexts/Misc/corecrypto_T1-v1.0.0.zip
Normal file
BIN
payloads/Kexts/Misc/corecrypto_T1-v1.0.0.zip
Normal file
Binary file not shown.
@@ -13,5 +13,9 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>RunAtLoad</key>
|
<key>RunAtLoad</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>StandardErrorPath</key>
|
||||||
|
<string>/var/log/OpenCore-Patcher.log</string>
|
||||||
|
<key>StandardOutPath</key>
|
||||||
|
<string>/var/log/OpenCore-Patcher.log</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?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>AssociatedBundleIdentifiers</key>
|
||||||
|
<string>com.dortania.opencore-legacy-patcher</string>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.dortania.opencore-legacy-patcher.macos-update</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/Library/Application Support/Dortania/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher</string>
|
||||||
|
<string>--prepare_for_update</string>
|
||||||
|
</array>
|
||||||
|
<key>WatchPaths</key>
|
||||||
|
<array>
|
||||||
|
<string>/System/Volumes/Update/Update.plist</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<?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>AssociatedBundleIdentifiers</key>
|
||||||
|
<string>com.dortania.opencore-legacy-patcher</string>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.dortania.opencore-legacy-patcher.rsr-monitor</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/Library/Application Support/Dortania/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher</string>
|
||||||
|
<string>--cache_os</string>
|
||||||
|
</array>
|
||||||
|
<key>WatchPaths</key>
|
||||||
|
<array>
|
||||||
|
<string>/System/Volumes/Update/Preflight.plist</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -4,8 +4,10 @@
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Created by Rodion Shingarev on 13.04.19.
|
# Created by Rodion Shingarev on 13.04.19.
|
||||||
|
# Modified by Jazzzny for OpenCore Legacy Patcher on 06.10.23.
|
||||||
#
|
#
|
||||||
OCPath="$1"
|
OCPath="$1"
|
||||||
|
UtilsPath="$PWD"
|
||||||
|
|
||||||
if [ "${OCPath}" = "" ]; then
|
if [ "${OCPath}" = "" ]; then
|
||||||
echo "Usage ./create_vault.sh path/to/EFI/OC"
|
echo "Usage ./create_vault.sh path/to/EFI/OC"
|
||||||
@@ -17,54 +19,75 @@ if [ ! -d "${OCPath}" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -x /usr/bin/find ] || [ ! -x /bin/rm ] || [ ! -x /usr/bin/sed ] || [ ! -x /usr/bin/xxd ]; then
|
if [ ! -x /usr/bin/env ] || [ ! -x /usr/bin/find ] || [ ! -x /bin/rm ] || [ ! -x /usr/bin/sed ] || [ ! -x /usr/bin/awk ] || [ ! -x /usr/bin/sort ] || [ ! -x /usr/bin/xxd ]; then
|
||||||
echo "Unix environment is broken!"
|
echo "Unix environment is broken!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -x /usr/libexec/PlistBuddy ]; then
|
|
||||||
echo "PlistBuddy is missing!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -x /usr/bin/shasum ]; then
|
|
||||||
echo "shasum is missing!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
abort() {
|
abort() {
|
||||||
/bin/rm -rf vault.plist vault.sig /tmp/vault_hash
|
/bin/rm -rf vault.plist vault.sig /tmp/vault_hash
|
||||||
echo "Fatal error: ${1}!"
|
echo "Fatal error: ${1}!"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "Chose ${OCPath} for hashing..."
|
# plist output functions so we don't need PlistBuddy
|
||||||
|
write_header() {
|
||||||
|
cat <<EOF > "$1"
|
||||||
|
<?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>Files</key>
|
||||||
|
<dict>
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
write_file_name_and_hash() {
|
||||||
|
{
|
||||||
|
echo -e "\t\t<key>${2}</key>"
|
||||||
|
echo -e "\t\t<data>"
|
||||||
|
echo -e -n "\t\t"
|
||||||
|
cat "$3"
|
||||||
|
echo -e "\t\t</data>"
|
||||||
|
} >> "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
write_footer() {
|
||||||
|
cat <<EOF >> "$1"
|
||||||
|
</dict>
|
||||||
|
<key>Version</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
cd "${OCPath}" || abort "Failed to reach ${OCPath}"
|
cd "${OCPath}" || abort "Failed to reach ${OCPath}"
|
||||||
/bin/rm -rf vault.plist vault.sig || abort "Failed to cleanup"
|
/bin/rm -rf vault.plist vault.sig || abort "Failed to cleanup"
|
||||||
/usr/libexec/PlistBuddy -c "Add Version integer 1" vault.plist || abort "Failed to set vault.plist version"
|
|
||||||
|
|
||||||
echo "Hashing files in ${OCPath}..."
|
echo "Hashing OpenCore configuration..."
|
||||||
|
|
||||||
|
write_header vault.plist
|
||||||
|
|
||||||
/usr/bin/find . -not -path '*/\.*' -type f \
|
/usr/bin/find . -not -path '*/\.*' -type f \
|
||||||
\( ! -iname ".*" \) \
|
\( ! -iname ".*" \) \
|
||||||
\( ! -iname "vault.*" \) \
|
\( ! -iname "vault.*" \) \
|
||||||
\( ! -iname "OpenCore.efi" \) | while read -r fname; do
|
\( ! -iname "MemTest86.log" \) \
|
||||||
|
\( ! -iname "MemTest86-Report-*.html" \) \
|
||||||
|
\( ! -iname "OpenCore.efi" \) | env LC_COLLATE=POSIX /usr/bin/sort | while read -r fname; do
|
||||||
fname="${fname#"./"}"
|
fname="${fname#"./"}"
|
||||||
wname="${fname//\//\\\\}"
|
wname="${fname//\//\\\\}"
|
||||||
shasum=$(/usr/bin/shasum -a 256 "${fname}") || abort "Failed to hash ${fname}"
|
sha=$("${UtilsPath}"/openssl sha256 "${fname}" | /usr/bin/awk '{print $2}') || abort "Failed to hash ${fname}"
|
||||||
sha=$(echo "$shasum" | /usr/bin/sed 's/^\([a-f0-9]\{64\}\).*/\1/') || abort "Illegit hashsum"
|
|
||||||
if [ "${#sha}" != 64 ] || [ "$(echo "$sha"| /usr/bin/sed 's/^[a-f0-9]*$//')" ]; then
|
if [ "${#sha}" != 64 ] || [ "$(echo "$sha"| /usr/bin/sed 's/^[a-f0-9]*$//')" ]; then
|
||||||
abort "Got invalid hash: ${sha}!"
|
abort "Got invalid hash: ${sha}!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "${wname}: ${sha}"
|
echo "${sha}" | /usr/bin/xxd -r -p | "${UtilsPath}"/openssl base64 > /tmp/vault_hash || abort "Hashing failure"
|
||||||
|
write_file_name_and_hash vault.plist "${wname}" /tmp/vault_hash
|
||||||
echo "${sha}" | /usr/bin/xxd -r -p > /tmp/vault_hash || abort "Hashing failure"
|
|
||||||
/usr/libexec/PlistBuddy -c "Import Files:'${wname}' /tmp/vault_hash" vault.plist || abort "Failed to append vault.plist!"
|
|
||||||
done
|
done
|
||||||
|
|
||||||
/bin/rm -rf /tmp/vault_hash
|
/bin/rm -rf /tmp/vault_hash
|
||||||
|
|
||||||
echo "All done!"
|
write_footer vault.plist
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
BIN
payloads/Tools/CreateVault/openssl
Executable file
BIN
payloads/Tools/CreateVault/openssl
Executable file
Binary file not shown.
@@ -1,16 +1,18 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Modified by Jazzzny for OpenCore Legacy Patcher on 06.10.23.
|
||||||
|
|
||||||
abort() {
|
abort() {
|
||||||
echo "Fatal error: ${1}!"
|
echo "Fatal error: ${1}!"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# shellcheck disable=SC2317
|
||||||
cleanup() {
|
cleanup() {
|
||||||
echo "Cleaning up keys"
|
|
||||||
rm -rf "${KeyPath}"
|
rm -rf "${KeyPath}"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ ! -x /usr/bin/dirname ] || [ ! -x /bin/chmod ] || [ ! -x /bin/mkdir ] || [ ! -x /usr/bin/openssl ] || [ ! -x /bin/rm ] || [ ! -x /usr/bin/strings ] || [ ! -x /usr/bin/grep ] || [ ! -x /usr/bin/cut ] || [ ! -x /bin/dd ] || [ ! -x /usr/bin/uuidgen ] ; then
|
if [ ! -x /usr/bin/dirname ] || [ ! -x /bin/chmod ] || [ ! -x /bin/mkdir ] || [ ! -x /bin/rm ] || [ ! -x /usr/bin/grep ] || [ ! -x /usr/bin/awk ] || [ ! -x /bin/dd ] || [ ! -x /usr/bin/uuidgen ] ; then
|
||||||
abort "Unix environment is broken!"
|
abort "Unix environment is broken!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -22,10 +24,8 @@ if [ "$OCPath" = "" ]; then
|
|||||||
OCPath=../../EFI/OC
|
OCPath=../../EFI/OC
|
||||||
fi
|
fi
|
||||||
|
|
||||||
KeyPath="/tmp/Keys-$(/usr/bin/uuidgen)"
|
KeyPath="/tmp/$(/usr/bin/uuidgen)"
|
||||||
OCBin="${OCPath}/OpenCore.efi"
|
OCBin="${OCPath}/OpenCore.efi"
|
||||||
RootCA="${KeyPath}/ca.pem"
|
|
||||||
PrivKey="${KeyPath}/privatekey.cer"
|
|
||||||
PubKey="${KeyPath}/vault.pub"
|
PubKey="${KeyPath}/vault.pub"
|
||||||
|
|
||||||
if [ ! -d "${OCPath}" ]; then
|
if [ ! -d "${OCPath}" ]; then
|
||||||
@@ -58,31 +58,14 @@ fi
|
|||||||
|
|
||||||
./create_vault.sh "${OCPath}" || abort "create_vault.sh returns errors!"
|
./create_vault.sh "${OCPath}" || abort "create_vault.sh returns errors!"
|
||||||
|
|
||||||
if [ ! -f "${RootCA}" ]; then
|
echo "Signing OpenCore..."
|
||||||
/usr/bin/openssl genrsa -out "${RootCA}" 2048 || abort "Failed to generate CA"
|
|
||||||
if [ -f "${PrivKey}" ]; then
|
|
||||||
echo "WARNING: Private key exists without CA"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
/bin/rm -fP "${PrivKey}" || abort "Failed to remove ${PrivKey}"
|
|
||||||
echo "Issuing a new private key..."
|
|
||||||
/usr/bin/openssl req -new -x509 -key "${RootCA}" -out "${PrivKey}" -days 1825 -subj "/C=WO/L=127.0.0.1/O=Acidanthera/OU=Acidanthera OpenCore/CN=Greetings from Acidanthera and WWHC" || abort "Failed to issue private key!"
|
|
||||||
|
|
||||||
/bin/rm -fP "${PubKey}" || abort "Failed to remove ${PubKey}"
|
|
||||||
echo "Getting public key based off private key..."
|
|
||||||
./RsaTool -cert "${PrivKey}" > "${PubKey}" || abort "Failed to get public key"
|
|
||||||
|
|
||||||
echo "Signing ${OCBin}..."
|
|
||||||
./RsaTool -sign "${OCPath}/vault.plist" "${OCPath}/vault.sig" "${PubKey}" || abort "Failed to patch ${PubKey}"
|
./RsaTool -sign "${OCPath}/vault.plist" "${OCPath}/vault.sig" "${PubKey}" || abort "Failed to patch ${PubKey}"
|
||||||
|
off=$(($(./strings -a -t d "${OCBin}" | /usr/bin/grep "=BEGIN OC VAULT=" | /usr/bin/awk '{print $1}') + 16))
|
||||||
echo "Bin-patching ${OCBin}..."
|
|
||||||
off=$(($(/usr/bin/strings -a -t d "${OCBin}" | /usr/bin/grep "=BEGIN OC VAULT=" | /usr/bin/cut -f1 -d' ') + 16))
|
|
||||||
if [ "${off}" -le 16 ]; then
|
if [ "${off}" -le 16 ]; then
|
||||||
abort "${OCBin} is borked"
|
abort "${OCBin} is borked"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
/bin/dd of="${OCBin}" if="${PubKey}" bs=1 seek="${off}" count=528 conv=notrunc || abort "Failed to bin-patch ${OCBin}"
|
/bin/dd of="${OCBin}" if="${PubKey}" bs=1 seek="${off}" count=528 conv=notrunc || abort "Failed to bin-patch ${OCBin}"
|
||||||
|
|
||||||
echo "All done!"
|
echo "Signing complete"
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
BIN
payloads/Tools/CreateVault/strings
Executable file
BIN
payloads/Tools/CreateVault/strings
Executable file
Binary file not shown.
@@ -5,3 +5,4 @@ pyinstaller
|
|||||||
packaging
|
packaging
|
||||||
py_sip_xnu
|
py_sip_xnu
|
||||||
py-applescript
|
py-applescript
|
||||||
|
markdown2
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
import threading
|
import sys
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import plistlib
|
||||||
|
import threading
|
||||||
|
import subprocess
|
||||||
|
|
||||||
from resources import defaults, utilities, validation, constants
|
from pathlib import Path
|
||||||
from resources.sys_patch import sys_patch, sys_patch_auto
|
|
||||||
|
from data import model_array, os_data
|
||||||
from resources.build import build
|
from resources.build import build
|
||||||
from data import model_array
|
from resources.sys_patch import sys_patch, sys_patch_auto
|
||||||
|
from resources import defaults, utilities, validation, constants
|
||||||
|
from resources.wx_gui import gui_entry
|
||||||
|
|
||||||
|
|
||||||
# Generic building args
|
# Generic building args
|
||||||
@@ -41,6 +46,14 @@ class arguments:
|
|||||||
self._sys_unpatch_handler()
|
self._sys_unpatch_handler()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if self.args.prepare_for_update:
|
||||||
|
self._prepare_for_update_handler()
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.args.cache_os:
|
||||||
|
self._cache_os_handler()
|
||||||
|
return
|
||||||
|
|
||||||
if self.args.auto_patch:
|
if self.args.auto_patch:
|
||||||
self._sys_patch_auto_handler()
|
self._sys_patch_auto_handler()
|
||||||
return
|
return
|
||||||
@@ -88,6 +101,62 @@ class arguments:
|
|||||||
sys_patch_auto.AutomaticSysPatch(self.constants).start_auto_patch()
|
sys_patch_auto.AutomaticSysPatch(self.constants).start_auto_patch()
|
||||||
|
|
||||||
|
|
||||||
|
def _prepare_for_update_handler(self) -> None:
|
||||||
|
"""
|
||||||
|
Prepare host for macOS update
|
||||||
|
"""
|
||||||
|
logging.info("Preparing host for macOS update")
|
||||||
|
|
||||||
|
os_data = utilities.fetch_staged_update(variant="Update")
|
||||||
|
if os_data[0] is None:
|
||||||
|
logging.info("No update staged, skipping")
|
||||||
|
return
|
||||||
|
|
||||||
|
os_version = os_data[0]
|
||||||
|
os_build = os_data[1]
|
||||||
|
|
||||||
|
logging.info(f"Preparing for update to {os_version} ({os_build})")
|
||||||
|
|
||||||
|
self._clean_le_handler()
|
||||||
|
|
||||||
|
|
||||||
|
def _cache_os_handler(self) -> None:
|
||||||
|
"""
|
||||||
|
Fetch KDK for incoming OS
|
||||||
|
"""
|
||||||
|
results = subprocess.run(["ps", "-ax"], stdout=subprocess.PIPE)
|
||||||
|
if results.stdout.decode("utf-8").count("OpenCore-Patcher --cache_os") > 1:
|
||||||
|
logging.info("Another instance of OS caching is running, exiting")
|
||||||
|
return
|
||||||
|
|
||||||
|
gui_entry.EntryPoint(self.constants).start(entry=gui_entry.SupportedEntryPoints.OS_CACHE)
|
||||||
|
|
||||||
|
|
||||||
|
def _clean_le_handler(self) -> None:
|
||||||
|
"""
|
||||||
|
Clean /Library/Extensions of problematic kexts
|
||||||
|
Note macOS Ventura and older do this automatically
|
||||||
|
"""
|
||||||
|
|
||||||
|
if self.constants.detected_os < os_data.os_data.sonoma:
|
||||||
|
return
|
||||||
|
|
||||||
|
logging.info("Cleaning /Library/Extensions")
|
||||||
|
|
||||||
|
for kext in Path("/Library/Extensions").glob("*.kext"):
|
||||||
|
if not Path(f"{kext}/Contents/Info.plist").exists():
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
kext_plist = plistlib.load(open(f"{kext}/Contents/Info.plist", "rb"))
|
||||||
|
except Exception as e:
|
||||||
|
logging.info(f" - Failed to load plist for {kext.name}: {e}")
|
||||||
|
continue
|
||||||
|
if "GPUCompanionBundles" not in kext_plist:
|
||||||
|
continue
|
||||||
|
logging.info(f" - Removing {kext.name}")
|
||||||
|
subprocess.run(["rm", "-rf", kext])
|
||||||
|
|
||||||
|
|
||||||
def _build_handler(self) -> None:
|
def _build_handler(self) -> None:
|
||||||
"""
|
"""
|
||||||
Start config building process
|
Start config building process
|
||||||
|
|||||||
@@ -65,8 +65,6 @@ class BuildOpenCore:
|
|||||||
]:
|
]:
|
||||||
function(self.model, self.constants, self.config)
|
function(self.model, self.constants, self.config)
|
||||||
|
|
||||||
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -lilubetaall"
|
|
||||||
|
|
||||||
# Work-around ocvalidate
|
# Work-around ocvalidate
|
||||||
if self.constants.validate is False:
|
if self.constants.validate is False:
|
||||||
logging.info("- Adding bootmgfw.efi BlessOverride")
|
logging.info("- Adding bootmgfw.efi BlessOverride")
|
||||||
|
|||||||
@@ -215,12 +215,13 @@ class BuildFirmware:
|
|||||||
# CSM check
|
# CSM check
|
||||||
# For model support, check for GUID in firmware and as well as Bootcamp Assistant's Info.plist ('PreUEFIModels' key)
|
# For model support, check for GUID in firmware and as well as Bootcamp Assistant's Info.plist ('PreUEFIModels' key)
|
||||||
# Ref: https://github.com/acidanthera/OpenCorePkg/blob/0.9.5/Platform/OpenLegacyBoot/OpenLegacyBoot.c#L19
|
# Ref: https://github.com/acidanthera/OpenCorePkg/blob/0.9.5/Platform/OpenLegacyBoot/OpenLegacyBoot.c#L19
|
||||||
# if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.ivy_bridge.value and self.model != "MacPro6,1":
|
if Path(self.constants.drivers_path / Path("OpenLegacyBoot.efi")).exists():
|
||||||
# logging.info("- Enabling CSM support")
|
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.ivy_bridge.value and self.model != "MacPro6,1":
|
||||||
# support.BuildSupport(self.model, self.constants, self.config).get_efi_binary_by_path("OpenLegacyBoot.efi", "UEFI", "Drivers")["Enabled"] = True
|
logging.info("- Enabling CSM support")
|
||||||
# else:
|
support.BuildSupport(self.model, self.constants, self.config).get_efi_binary_by_path("OpenLegacyBoot.efi", "UEFI", "Drivers")["Enabled"] = True
|
||||||
# # Shipped alongside OpenCorePkg, so remove if unused
|
else:
|
||||||
# (self.constants.drivers_path / Path("OpenLegacyBoot.efi")).unlink()
|
# Shipped alongside OpenCorePkg, so remove if unused
|
||||||
|
(self.constants.drivers_path / Path("OpenLegacyBoot.efi")).unlink()
|
||||||
|
|
||||||
def _firmware_compatibility_handling(self) -> None:
|
def _firmware_compatibility_handling(self) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -232,7 +233,7 @@ class BuildFirmware:
|
|||||||
# Patches IOPCIConfigurator.cpp's IOPCIIsHotplugPort to skip configRead16/32 calls
|
# Patches IOPCIConfigurator.cpp's IOPCIIsHotplugPort to skip configRead16/32 calls
|
||||||
# Credit to CaseySJ for original discovery:
|
# Credit to CaseySJ for original discovery:
|
||||||
# - Patch: https://github.com/AMD-OSX/AMD_Vanilla/pull/196
|
# - Patch: https://github.com/AMD-OSX/AMD_Vanilla/pull/196
|
||||||
# - Source: https://github.com/apple-oss-distributions/IOPCIFamily/blob/main/IOPCIConfigurator.cpp#L968-L1022
|
# - Source: https://github.com/apple-oss-distributions/IOPCIFamily/blob/IOPCIFamily-583.40.1/IOPCIConfigurator.cpp#L968-L1022
|
||||||
#
|
#
|
||||||
# Currently all pre-Sandy Bridge Macs lacking an iGPU benefit from this patch as well as MacPro6,1
|
# Currently all pre-Sandy Bridge Macs lacking an iGPU benefit from this patch as well as MacPro6,1
|
||||||
# Otherwise some graphics hardware will fail to wake, macOS will misreport hardware as ExpressCard-based,
|
# Otherwise some graphics hardware will fail to wake, macOS will misreport hardware as ExpressCard-based,
|
||||||
@@ -247,7 +248,7 @@ class BuildFirmware:
|
|||||||
logging.info("- Adding PCI Bus Enumeration Patch")
|
logging.info("- Adding PCI Bus Enumeration Patch")
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Patch"], "Comment", "CaseySJ - Fix PCI bus enumeration (Ventura)")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Patch"], "Comment", "CaseySJ - Fix PCI bus enumeration (Ventura)")["Enabled"] = True
|
||||||
# Sonoma slightly adjusted this line specifically
|
# Sonoma slightly adjusted this line specifically
|
||||||
# - https://github.com/apple-oss-distributions/IOPCIFamily/blob/main/IOPCIConfigurator.cpp#L1009
|
# - https://github.com/apple-oss-distributions/IOPCIFamily/blob/IOPCIFamily-583.40.1/IOPCIConfigurator.cpp#L1009
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Patch"], "Comment", "Fix PCI bus enumeration (Sonoma)")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Patch"], "Comment", "Fix PCI bus enumeration (Sonoma)")["Enabled"] = True
|
||||||
|
|
||||||
if self.constants.set_vmm_cpuid is True:
|
if self.constants.set_vmm_cpuid is True:
|
||||||
@@ -304,10 +305,10 @@ class BuildFirmware:
|
|||||||
whereas other drivers like ./qa_logger.efi is invoked via Device Path.
|
whereas other drivers like ./qa_logger.efi is invoked via Device Path.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if "5K Display" not in smbios_data.smbios_dictionary[self.model]:
|
if "Dual DisplayPort Display" not in smbios_data.smbios_dictionary[self.model]:
|
||||||
return
|
return
|
||||||
|
|
||||||
logging.info("- Adding 5K Display Patch")
|
logging.info("- Adding 4K/5K Display Patch")
|
||||||
# Set LauncherPath to '/boot.efi'
|
# Set LauncherPath to '/boot.efi'
|
||||||
# This is to ensure that only the Mac's firmware presents the boot option, but not OpenCore
|
# This is to ensure that only the Mac's firmware presents the boot option, but not OpenCore
|
||||||
# https://github.com/acidanthera/OpenCorePkg/blob/0.7.6/Library/OcAppleBootPolicyLib/OcAppleBootPolicyLib.c#L50-L73
|
# https://github.com/acidanthera/OpenCorePkg/blob/0.7.6/Library/OcAppleBootPolicyLib/OcAppleBootPolicyLib.c#L50-L73
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class BuildMiscellaneous:
|
|||||||
self._debug_handling()
|
self._debug_handling()
|
||||||
self._cpu_friend_handling()
|
self._cpu_friend_handling()
|
||||||
self._general_oc_handling()
|
self._general_oc_handling()
|
||||||
|
self._t1_handling()
|
||||||
|
|
||||||
|
|
||||||
def _feature_unlock_handling(self) -> None:
|
def _feature_unlock_handling(self) -> None:
|
||||||
@@ -280,6 +281,12 @@ class BuildMiscellaneous:
|
|||||||
# - Ref: https://techcommunity.microsoft.com/t5/microsoft-usb-blog/reasons-to-avoid-companion-controllers/ba-p/270710
|
# - Ref: https://techcommunity.microsoft.com/t5/microsoft-usb-blog/reasons-to-avoid-companion-controllers/ba-p/270710
|
||||||
#
|
#
|
||||||
# To be paired for sys_patch_dict.py's 'Legacy USB 1.1' patchset
|
# To be paired for sys_patch_dict.py's 'Legacy USB 1.1' patchset
|
||||||
|
#
|
||||||
|
# Note: With macOS 14.1, injection of these kexts causes a panic.
|
||||||
|
# To avoid this, a MaxKernel is configured with XNU 23.0.0 (macOS 14.0).
|
||||||
|
# Additionally sys_patch.py stack will now patches the bins onto disk for 14.1+.
|
||||||
|
# Reason for keeping the dual logic is due to potential conflicts of in-cache vs injection if we start
|
||||||
|
# patching pre-14.1 hosts.
|
||||||
if (
|
if (
|
||||||
smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.penryn.value or \
|
smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.penryn.value or \
|
||||||
self.model in ["MacPro4,1", "MacPro5,1", "Xserve3,1"]
|
self.model in ["MacPro4,1", "MacPro5,1", "Xserve3,1"]
|
||||||
@@ -335,11 +342,9 @@ class BuildMiscellaneous:
|
|||||||
logging.info(f"- Setting custom OpenCore picker timeout to {self.constants.oc_timeout} seconds")
|
logging.info(f"- Setting custom OpenCore picker timeout to {self.constants.oc_timeout} seconds")
|
||||||
self.config["Misc"]["Boot"]["Timeout"] = self.constants.oc_timeout
|
self.config["Misc"]["Boot"]["Timeout"] = self.constants.oc_timeout
|
||||||
|
|
||||||
if self.constants.vault is True and utilities.check_command_line_tools() is True:
|
if self.constants.vault is True:
|
||||||
logging.info("- Setting Vault configuration")
|
logging.info("- Setting Vault configuration")
|
||||||
self.config["Misc"]["Security"]["Vault"] = "Secure"
|
self.config["Misc"]["Security"]["Vault"] = "Secure"
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_efi_binary_by_path("OpenShell.efi", "Misc", "Tools")["Enabled"] = False
|
|
||||||
|
|
||||||
|
|
||||||
def _t1_handling(self) -> None:
|
def _t1_handling(self) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -351,9 +356,8 @@ class BuildMiscellaneous:
|
|||||||
logging.info("- Enabling T1 Security Chip support")
|
logging.info("- Enabling T1 Security Chip support")
|
||||||
|
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Block"], "Identifier", "com.apple.driver.AppleSSE")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Block"], "Identifier", "com.apple.driver.AppleSSE")["Enabled"] = True
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Block"], "Identifier", "com.apple.driver.AppleCredentialManager")["Enabled"] = True
|
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Block"], "Identifier", "com.apple.driver.AppleKeyStore")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Block"], "Identifier", "com.apple.driver.AppleKeyStore")["Enabled"] = True
|
||||||
|
|
||||||
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("corecrypto_T1.kext", self.constants.t1_corecrypto_version, self.constants.t1_corecrypto_path)
|
||||||
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleSSE.kext", self.constants.t1_sse_version, self.constants.t1_sse_path)
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleSSE.kext", self.constants.t1_sse_version, self.constants.t1_sse_path)
|
||||||
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleCredentialManager.kext", self.constants.t1_credential_version, self.constants.t1_credential_path)
|
|
||||||
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleKeyStore.kext", self.constants.t1_key_store_version, self.constants.t1_key_store_path)
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleKeyStore.kext", self.constants.t1_key_store_version, self.constants.t1_key_store_path)
|
||||||
@@ -35,6 +35,7 @@ class BuildWiredNetworking:
|
|||||||
|
|
||||||
# Always enable due to chance of hot-plugging
|
# Always enable due to chance of hot-plugging
|
||||||
self._usb_ecm_dongles()
|
self._usb_ecm_dongles()
|
||||||
|
self._i210_handling()
|
||||||
|
|
||||||
|
|
||||||
def _usb_ecm_dongles(self) -> None:
|
def _usb_ecm_dongles(self) -> None:
|
||||||
@@ -48,6 +49,21 @@ class BuildWiredNetworking:
|
|||||||
# - Kext: AppleUSBECM.kext
|
# - Kext: AppleUSBECM.kext
|
||||||
support.BuildSupport(self.model, self.constants, self.config).enable_kext("ECM-Override.kext", self.constants.ecm_override_version, self.constants.ecm_override_path)
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("ECM-Override.kext", self.constants.ecm_override_version, self.constants.ecm_override_path)
|
||||||
|
|
||||||
|
|
||||||
|
def _i210_handling(self) -> None:
|
||||||
|
"""
|
||||||
|
PCIe i210 NIC Handling
|
||||||
|
"""
|
||||||
|
# i210 NICs are broke in macOS 14 due to driver kit downgrades
|
||||||
|
# See ECM logic for why it's always enabled
|
||||||
|
if not self.model in smbios_data.smbios_dictionary:
|
||||||
|
return
|
||||||
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("CatalinaIntelI210Ethernet.kext", self.constants.i210_version, self.constants.i210_path)
|
||||||
|
# Ivy Bridge and newer natively support DriverKit, so set MinKernel to 23.0.0
|
||||||
|
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] >= cpu_data.CPUGen.ivy_bridge.value:
|
||||||
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("CatalinaIntelI210Ethernet.kext")["MinKernel"] = "23.0.0"
|
||||||
|
|
||||||
|
|
||||||
def _on_model(self) -> None:
|
def _on_model(self) -> None:
|
||||||
"""
|
"""
|
||||||
On-Model Hardware Detection Handling
|
On-Model Hardware Detection Handling
|
||||||
|
|||||||
@@ -108,17 +108,11 @@ class BuildSupport:
|
|||||||
if self.constants.vault is False:
|
if self.constants.vault is False:
|
||||||
return
|
return
|
||||||
|
|
||||||
if utilities.check_command_line_tools() is False:
|
logging.info("- Vaulting EFI\n=========================================")
|
||||||
# sign.command checks for the existence of '/usr/bin/strings' however does not verify whether it's executable
|
popen = subprocess.Popen([str(self.constants.vault_path), f"{self.constants.oc_folder}/"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
|
||||||
# sign.command will continue to run and create an unbootable OpenCore.efi due to the missing strings binary
|
for stdout_line in iter(popen.stdout.readline, ""):
|
||||||
# macOS has dummy binaries that just reroute to the actual binaries after you install Xcode's Command Line Tools
|
logging.info(stdout_line.strip())
|
||||||
logging.info("- Missing Command Line tools, skipping Vault for saftey reasons")
|
logging.info("=========================================")
|
||||||
logging.info("- Install via 'xcode-select --install' and rerun OCLP if you wish to vault this config")
|
|
||||||
return
|
|
||||||
|
|
||||||
logging.info("- Vaulting EFI")
|
|
||||||
subprocess.run([str(self.constants.vault_path), f"{self.constants.oc_folder}/"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
||||||
|
|
||||||
|
|
||||||
def validate_pathing(self) -> None:
|
def validate_pathing(self) -> None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -13,8 +13,8 @@ from data import os_data
|
|||||||
class Constants:
|
class Constants:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
# Patcher Versioning
|
# Patcher Versioning
|
||||||
self.patcher_version: str = "1.0.0" # OpenCore-Legacy-Patcher
|
self.patcher_version: str = "1.2.0" # OpenCore-Legacy-Patcher
|
||||||
self.patcher_support_pkg_version: str = "1.3.2" # PatcherSupportPkg
|
self.patcher_support_pkg_version: str = "1.4.5" # PatcherSupportPkg
|
||||||
self.copyright_date: str = "Copyright © 2020-2023 Dortania"
|
self.copyright_date: str = "Copyright © 2020-2023 Dortania"
|
||||||
self.patcher_name: str = "OpenCore Legacy Patcher"
|
self.patcher_name: str = "OpenCore Legacy Patcher"
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ class Constants:
|
|||||||
|
|
||||||
# OpenCore Versioning
|
# OpenCore Versioning
|
||||||
# https://github.com/acidanthera/OpenCorePkg
|
# https://github.com/acidanthera/OpenCorePkg
|
||||||
self.opencore_version: str = "0.9.3"
|
self.opencore_version: str = "0.9.6"
|
||||||
|
|
||||||
# Kext Versioning
|
# Kext Versioning
|
||||||
## Acidanthera
|
## Acidanthera
|
||||||
@@ -36,7 +36,7 @@ class Constants:
|
|||||||
self.lilu_version: str = "1.6.7" # Lilu
|
self.lilu_version: str = "1.6.7" # Lilu
|
||||||
self.whatevergreen_version: str = "1.6.6" # WhateverGreen
|
self.whatevergreen_version: str = "1.6.6" # WhateverGreen
|
||||||
self.whatevergreen_navi_version: str = "1.6.6-Navi" # WhateverGreen (Navi Patch)
|
self.whatevergreen_navi_version: str = "1.6.6-Navi" # WhateverGreen (Navi Patch)
|
||||||
self.airportbcrmfixup_version: str = "2.1.7" # AirPortBrcmFixup
|
self.airportbcrmfixup_version: str = "2.1.8" # AirPortBrcmFixup
|
||||||
self.nvmefix_version: str = "1.1.1" # NVMeFix
|
self.nvmefix_version: str = "1.1.1" # NVMeFix
|
||||||
self.applealc_version: str = "1.6.3" # AppleALC
|
self.applealc_version: str = "1.6.3" # AppleALC
|
||||||
self.restrictevents_version: str = "1.1.3" # RestrictEvents
|
self.restrictevents_version: str = "1.1.3" # RestrictEvents
|
||||||
@@ -67,9 +67,9 @@ class Constants:
|
|||||||
self.aicpupm_version: str = "1.0.0" # AppleIntelCPUPowerManagement/Client
|
self.aicpupm_version: str = "1.0.0" # AppleIntelCPUPowerManagement/Client
|
||||||
self.s3x_nvme_version: str = "1.0.0" # IONVMeFamily (14.0 Beta 1, S1X and S3X classes)
|
self.s3x_nvme_version: str = "1.0.0" # IONVMeFamily (14.0 Beta 1, S1X and S3X classes)
|
||||||
self.apple_camera_version: str = "1.0.0" # AppleCameraInterface (14.0 Beta 1)
|
self.apple_camera_version: str = "1.0.0" # AppleCameraInterface (14.0 Beta 1)
|
||||||
self.t1_credential_version: str = "1.0.0" # AppleCredentialManager (13.5 - T1 support)
|
self.t1_sse_version: str = "1.1.0" # AppleSSE (13.6 - T1 support)
|
||||||
self.t1_sse_version: str = "1.0.0" # AppleSSE (13.5 - T1 support)
|
self.t1_key_store_version: str = "1.1.0" # AppleKeyStore (13.6 - T1 support)
|
||||||
self.t1_key_store_version: str = "1.0.0" # AppleKeyStore (13.5 - T1 support)
|
self.t1_corecrypto_version: str = "1.0.0" # corecrypto (13.6 - T1 support)
|
||||||
|
|
||||||
## Apple - Dortania Modified
|
## Apple - Dortania Modified
|
||||||
self.bcm570_version: str = "1.0.2" # CatalinaBCM5701Ethernet
|
self.bcm570_version: str = "1.0.2" # CatalinaBCM5701Ethernet
|
||||||
@@ -94,7 +94,7 @@ class Constants:
|
|||||||
self.aspp_override_version: str = "1.0.1" # ACPI_SMC_PlatformPlugin Override
|
self.aspp_override_version: str = "1.0.1" # ACPI_SMC_PlatformPlugin Override
|
||||||
self.ecm_override_version: str = "1.0.0" # AppleUSBECM Override
|
self.ecm_override_version: str = "1.0.0" # AppleUSBECM Override
|
||||||
self.rsrhelper_version: str = "1.0.0" # RSRHelper
|
self.rsrhelper_version: str = "1.0.0" # RSRHelper
|
||||||
self.amfipass_version: str = "1.3.1" # AMFIPass
|
self.amfipass_version: str = "1.4.0" # AMFIPass
|
||||||
self.amfipass_compatibility_version: str = "1.2.1" # Minimum AMFIPass version required
|
self.amfipass_compatibility_version: str = "1.2.1" # Minimum AMFIPass version required
|
||||||
|
|
||||||
## Syncretic
|
## Syncretic
|
||||||
@@ -279,14 +279,26 @@ class Constants:
|
|||||||
def plist_template(self):
|
def plist_template(self):
|
||||||
return self.payload_path / Path("Config/config.plist")
|
return self.payload_path / Path("Config/config.plist")
|
||||||
|
|
||||||
# Launch Agent
|
# Launch Services
|
||||||
|
@property
|
||||||
|
def launch_services_path(self):
|
||||||
|
return self.payload_path / Path("Launch Services")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def auto_patch_launch_agent_path(self):
|
def auto_patch_launch_agent_path(self):
|
||||||
return self.payload_path / Path("com.dortania.opencore-legacy-patcher.auto-patch.plist")
|
return self.launch_services_path / Path("com.dortania.opencore-legacy-patcher.auto-patch.plist")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def rsr_monitor_launch_daemon_path(self):
|
def rsr_monitor_launch_daemon_path(self):
|
||||||
return self.payload_path / Path("com.dortania.opencore-legacy-patcher.rsr-monitor.plist")
|
return self.launch_services_path / Path("com.dortania.opencore-legacy-patcher.rsr-monitor.plist")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def update_launch_daemon_path(self):
|
||||||
|
return self.launch_services_path / Path("com.dortania.opencore-legacy-patcher.macos-update.plist")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def kdk_launch_daemon_path(self):
|
||||||
|
return self.launch_services_path / Path("com.dortania.opencore-legacy-patcher.os-caching.plist")
|
||||||
|
|
||||||
# ACPI
|
# ACPI
|
||||||
@property
|
@property
|
||||||
@@ -439,14 +451,14 @@ class Constants:
|
|||||||
def t1_key_store_path(self):
|
def t1_key_store_path(self):
|
||||||
return self.payload_kexts_path / Path(f"Misc/AppleKeyStore-v{self.t1_key_store_version}.zip")
|
return self.payload_kexts_path / Path(f"Misc/AppleKeyStore-v{self.t1_key_store_version}.zip")
|
||||||
|
|
||||||
@property
|
|
||||||
def t1_credential_path(self):
|
|
||||||
return self.payload_kexts_path / Path(f"Misc/AppleCredentialManager-v{self.t1_credential_version}.zip")
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def t1_sse_path(self):
|
def t1_sse_path(self):
|
||||||
return self.payload_kexts_path / Path(f"Misc/AppleSSE-v{self.t1_sse_version}.zip")
|
return self.payload_kexts_path / Path(f"Misc/AppleSSE-v{self.t1_sse_version}.zip")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def t1_corecrypto_path(self):
|
||||||
|
return self.payload_kexts_path / Path(f"Misc/corecrypto_T1-v{self.t1_corecrypto_version}.zip")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def mousse_path(self):
|
def mousse_path(self):
|
||||||
return self.payload_kexts_path / Path(f"SSE/AAAMouSSE-v{self.mousse_version}.zip")
|
return self.payload_kexts_path / Path(f"SSE/AAAMouSSE-v{self.mousse_version}.zip")
|
||||||
@@ -703,6 +715,13 @@ class Constants:
|
|||||||
return self.payload_path / Path("Tools/RSRRepair")
|
return self.payload_path / Path("Tools/RSRRepair")
|
||||||
|
|
||||||
# Icons
|
# Icons
|
||||||
|
@property
|
||||||
|
def icns_resource_path(self):
|
||||||
|
if self.launcher_script:
|
||||||
|
return self.payload_path / Path("Icon/AppIcons")
|
||||||
|
return Path(self.launcher_binary).parent.parent / Path("Resources")
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def app_icon_path(self):
|
def app_icon_path(self):
|
||||||
return self.payload_path / Path("OC-Patcher.icns")
|
return self.payload_path / Path("OC-Patcher.icns")
|
||||||
@@ -725,23 +744,23 @@ class Constants:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def icon_path_macos_generic(self):
|
def icon_path_macos_generic(self):
|
||||||
return self.payload_path / Path("Icon/AppIcons/Generic.icns")
|
return self.icns_resource_path / Path("Generic.icns")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def icon_path_macos_big_sur(self):
|
def icon_path_macos_big_sur(self):
|
||||||
return self.payload_path / Path("Icon/AppIcons/BigSur.icns")
|
return self.icns_resource_path / Path("BigSur.icns")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def icon_path_macos_monterey(self):
|
def icon_path_macos_monterey(self):
|
||||||
return self.payload_path / Path("Icon/AppIcons/Monterey.icns")
|
return self.icns_resource_path / Path("Monterey.icns")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def icon_path_macos_ventura(self):
|
def icon_path_macos_ventura(self):
|
||||||
return self.payload_path / Path("Icon/AppIcons/Ventura.icns")
|
return self.icns_resource_path / Path("Ventura.icns")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def icon_path_macos_sonoma(self):
|
def icon_path_macos_sonoma(self):
|
||||||
return self.payload_path / Path("Icon/AppIcons/Sonoma.icns")
|
return self.icns_resource_path / Path("Sonoma.icns")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def gui_path(self):
|
def gui_path(self):
|
||||||
@@ -764,13 +783,6 @@ class Constants:
|
|||||||
def kdk_download_path(self):
|
def kdk_download_path(self):
|
||||||
return self.payload_path / Path("KDK.dmg")
|
return self.payload_path / Path("KDK.dmg")
|
||||||
|
|
||||||
@property
|
|
||||||
def icns_resource_path(self):
|
|
||||||
if self.launcher_script:
|
|
||||||
return self.payload_path / Path("Icon/AppIcons")
|
|
||||||
return Path(self.launcher_binary).parent.parent / Path("Resources")
|
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def icons_path(self):
|
def icons_path(self):
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ class USBDevice:
|
|||||||
device_speed: int
|
device_speed: int
|
||||||
product_name: str
|
product_name: str
|
||||||
vendor_name: Optional[str] = None
|
vendor_name: Optional[str] = None
|
||||||
|
serial_number: Optional[str] = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_ioregistry(cls, entry: ioreg.io_registry_entry_t):
|
def from_ioregistry(cls, entry: ioreg.io_registry_entry_t):
|
||||||
@@ -44,6 +45,7 @@ class USBDevice:
|
|||||||
device_class = None
|
device_class = None
|
||||||
device_speed = None
|
device_speed = None
|
||||||
vendor_name = None
|
vendor_name = None
|
||||||
|
serial_number = None
|
||||||
product_name = "N/A"
|
product_name = "N/A"
|
||||||
|
|
||||||
if "idVendor" in properties:
|
if "idVendor" in properties:
|
||||||
@@ -58,8 +60,10 @@ class USBDevice:
|
|||||||
vendor_name = properties["kUSBVendorString"].strip()
|
vendor_name = properties["kUSBVendorString"].strip()
|
||||||
if "USBSpeed" in properties:
|
if "USBSpeed" in properties:
|
||||||
device_speed = properties["USBSpeed"]
|
device_speed = properties["USBSpeed"]
|
||||||
|
if "kUSBSerialNumberString" in properties:
|
||||||
|
serial_number = properties["kUSBSerialNumberString"].strip()
|
||||||
|
|
||||||
return cls(vendor_id, device_id, device_class, device_speed, product_name, vendor_name)
|
return cls(vendor_id, device_id, device_class, device_speed, product_name, vendor_name, serial_number)
|
||||||
|
|
||||||
|
|
||||||
def detect(self):
|
def detect(self):
|
||||||
@@ -634,6 +638,7 @@ class Computer:
|
|||||||
ambient_light_sensor: Optional[bool] = False
|
ambient_light_sensor: Optional[bool] = False
|
||||||
third_party_sata_ssd: Optional[bool] = False
|
third_party_sata_ssd: Optional[bool] = False
|
||||||
pcie_webcam: Optional[bool] = False
|
pcie_webcam: Optional[bool] = False
|
||||||
|
t1_chip: Optional[bool] = False
|
||||||
secure_boot_model: Optional[str] = None
|
secure_boot_model: Optional[str] = None
|
||||||
secure_boot_policy: Optional[int] = None
|
secure_boot_policy: Optional[int] = None
|
||||||
oclp_sys_version: Optional[str] = None
|
oclp_sys_version: Optional[str] = None
|
||||||
@@ -659,6 +664,7 @@ class Computer:
|
|||||||
computer.cpu_probe()
|
computer.cpu_probe()
|
||||||
computer.bluetooth_probe()
|
computer.bluetooth_probe()
|
||||||
computer.topcase_probe()
|
computer.topcase_probe()
|
||||||
|
computer.t1_probe()
|
||||||
computer.ambient_light_sensor_probe()
|
computer.ambient_light_sensor_probe()
|
||||||
computer.pcie_webcam_probe()
|
computer.pcie_webcam_probe()
|
||||||
computer.sata_disk_probe()
|
computer.sata_disk_probe()
|
||||||
@@ -936,6 +942,40 @@ class Computer:
|
|||||||
elif usb_device.device_id in usb_data.AppleIDs.AppleUSBMultiTouch:
|
elif usb_device.device_id in usb_data.AppleIDs.AppleUSBMultiTouch:
|
||||||
self.trackpad_type = "Modern"
|
self.trackpad_type = "Modern"
|
||||||
|
|
||||||
|
def t1_probe(self):
|
||||||
|
if not self.usb_devices:
|
||||||
|
return
|
||||||
|
|
||||||
|
for usb_device in self.usb_devices:
|
||||||
|
if usb_device.vendor_id != 0x5ac:
|
||||||
|
continue
|
||||||
|
# Standard T1
|
||||||
|
if usb_device.device_id == 0x8600:
|
||||||
|
self.t1_chip = True
|
||||||
|
break
|
||||||
|
# T1 in DFU mode
|
||||||
|
# Note all Apple devices report the same device ID in DFU mode
|
||||||
|
if usb_device.device_id == 0x1281:
|
||||||
|
# Break down serial number into components
|
||||||
|
# ex. "CPID:8002 CPRV:10 CPFM:03 SCEP:01 BDID:12 ECID:000E5C8E34600026 IBFL:3D"
|
||||||
|
# Is this overcomplicating T1 detection? Probably...
|
||||||
|
if usb_device.serial_number is None:
|
||||||
|
continue
|
||||||
|
serial_number = usb_device.serial_number.split(" ")
|
||||||
|
# T1s come in 2 known flavours:
|
||||||
|
# - x619dev
|
||||||
|
# - CPID: 0x8002
|
||||||
|
# - BDID: 0x13
|
||||||
|
# - x619ap
|
||||||
|
# - CPID: 0x8002
|
||||||
|
# - BDID: 0x12
|
||||||
|
if "CPID:8002" not in serial_number:
|
||||||
|
continue
|
||||||
|
if "BDID:13" not in serial_number and "BDID:12" not in serial_number:
|
||||||
|
continue
|
||||||
|
self.t1_chip = True
|
||||||
|
break
|
||||||
|
|
||||||
def sata_disk_probe(self):
|
def sata_disk_probe(self):
|
||||||
# Get all SATA Controllers/Disks from 'system_profiler SPSerialATADataType'
|
# Get all SATA Controllers/Disks from 'system_profiler SPSerialATADataType'
|
||||||
# Determine whether SATA SSD is present and Apple-made
|
# Determine whether SATA SSD is present and Apple-made
|
||||||
|
|||||||
@@ -31,7 +31,12 @@ class GlobalEnviromentSettings:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if Path(self.global_settings_plist).exists():
|
if Path(self.global_settings_plist).exists():
|
||||||
|
try:
|
||||||
plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
|
plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Error: Unable to read global settings file")
|
||||||
|
logging.error(e)
|
||||||
|
return None
|
||||||
if property_name in plist:
|
if property_name in plist:
|
||||||
return plist[property_name]
|
return plist[property_name]
|
||||||
return None
|
return None
|
||||||
@@ -43,7 +48,12 @@ class GlobalEnviromentSettings:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if Path(self.global_settings_plist).exists():
|
if Path(self.global_settings_plist).exists():
|
||||||
|
try:
|
||||||
plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
|
plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Error: Unable to read global settings file")
|
||||||
|
logging.error(e)
|
||||||
|
return
|
||||||
plist[property_name] = property_value
|
plist[property_name] = property_value
|
||||||
try:
|
try:
|
||||||
plistlib.dump(plist, Path(self.global_settings_plist).open("wb"))
|
plistlib.dump(plist, Path(self.global_settings_plist).open("wb"))
|
||||||
@@ -69,9 +79,14 @@ class GlobalEnviromentSettings:
|
|||||||
defaults_path = Path(defaults_path).expanduser()
|
defaults_path = Path(defaults_path).expanduser()
|
||||||
|
|
||||||
if Path(defaults_path).exists():
|
if Path(defaults_path).exists():
|
||||||
defaults_plist = plistlib.load(Path(defaults_path).open("rb"))
|
|
||||||
# merge defaults with global settings
|
# merge defaults with global settings
|
||||||
|
try:
|
||||||
|
defaults_plist = plistlib.load(Path(defaults_path).open("rb"))
|
||||||
global_settings_plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
|
global_settings_plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
|
||||||
|
except Exception as e:
|
||||||
|
logging.error("Error: Unable to read global settings file")
|
||||||
|
logging.error(e)
|
||||||
|
return
|
||||||
global_settings_plist.update(defaults_plist)
|
global_settings_plist.update(defaults_plist)
|
||||||
try:
|
try:
|
||||||
plistlib.dump(global_settings_plist, Path(self.global_settings_plist).open("wb"))
|
plistlib.dump(global_settings_plist, Path(self.global_settings_plist).open("wb"))
|
||||||
|
|||||||
@@ -49,7 +49,12 @@ class KernelDebugKitObject:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, global_constants: constants.Constants, host_build: str, host_version: str, ignore_installed: bool = False, passive: bool = False) -> None:
|
def __init__(self, global_constants: constants.Constants,
|
||||||
|
host_build: str, host_version: str,
|
||||||
|
ignore_installed: bool = False, passive: bool = False,
|
||||||
|
check_backups_only: bool = False
|
||||||
|
) -> None:
|
||||||
|
|
||||||
self.constants: constants.Constants = global_constants
|
self.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
self.host_build: str = host_build # ex. 20A5384c
|
self.host_build: str = host_build # ex. 20A5384c
|
||||||
@@ -58,6 +63,7 @@ class KernelDebugKitObject:
|
|||||||
self.passive: bool = passive # Don't perform actions requiring elevated privileges
|
self.passive: bool = passive # Don't perform actions requiring elevated privileges
|
||||||
|
|
||||||
self.ignore_installed: bool = ignore_installed # If True, will ignore any installed KDKs and download the latest
|
self.ignore_installed: bool = ignore_installed # If True, will ignore any installed KDKs and download the latest
|
||||||
|
self.check_backups_only: bool = check_backups_only # If True, will only check for KDK backups, not KDKs already installed
|
||||||
self.kdk_already_installed: bool = False
|
self.kdk_already_installed: bool = False
|
||||||
|
|
||||||
self.kdk_installed_path: str = ""
|
self.kdk_installed_path: str = ""
|
||||||
@@ -400,6 +406,8 @@ class KernelDebugKitObject:
|
|||||||
if not Path(KDK_INSTALL_PATH).exists():
|
if not Path(KDK_INSTALL_PATH).exists():
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# Installed KDKs only
|
||||||
|
if self.check_backups_only is False:
|
||||||
for kdk_folder in Path(KDK_INSTALL_PATH).iterdir():
|
for kdk_folder in Path(KDK_INSTALL_PATH).iterdir():
|
||||||
if not kdk_folder.is_dir():
|
if not kdk_folder.is_dir():
|
||||||
continue
|
continue
|
||||||
@@ -587,7 +595,7 @@ class KernelDebugKitUtilities:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def install_kdk_dmg(self, kdk_path: Path) -> bool:
|
def install_kdk_dmg(self, kdk_path: Path, only_install_backup: bool = False) -> bool:
|
||||||
"""
|
"""
|
||||||
Installs provided KDK disk image
|
Installs provided KDK disk image
|
||||||
|
|
||||||
@@ -617,6 +625,8 @@ class KernelDebugKitUtilities:
|
|||||||
self._unmount_disk_image(mount_point)
|
self._unmount_disk_image(mount_point)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
if only_install_backup is False:
|
||||||
if self.install_kdk_pkg(kdk_pkg_path) is False:
|
if self.install_kdk_pkg(kdk_pkg_path) is False:
|
||||||
self._unmount_disk_image(mount_point)
|
self._unmount_disk_image(mount_point)
|
||||||
return False
|
return False
|
||||||
@@ -663,6 +673,9 @@ class KernelDebugKitUtilities:
|
|||||||
logging.warning("Cannot create KDK backup, not running as root")
|
logging.warning("Cannot create KDK backup, not running as root")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if not Path(KDK_INSTALL_PATH).exists():
|
||||||
|
subprocess.run(["mkdir", "-p", KDK_INSTALL_PATH], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
|
||||||
kdk_dst_name = f"KDK_{kdk_info_dict['version']}_{kdk_info_dict['build']}.pkg"
|
kdk_dst_name = f"KDK_{kdk_info_dict['version']}_{kdk_info_dict['build']}.pkg"
|
||||||
kdk_dst_path = Path(f"{KDK_INSTALL_PATH}/{kdk_dst_name}")
|
kdk_dst_path = Path(f"{KDK_INSTALL_PATH}/{kdk_dst_name}")
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class InitializeLoggingSupport:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
base_path = Path("~/Library/Logs").expanduser()
|
base_path = Path("~/Library/Logs").expanduser()
|
||||||
if not base_path.exists():
|
if not base_path.exists() or str(base_path).startswith("/var/root/"):
|
||||||
# Likely in an installer environment, store in /Users/Shared
|
# Likely in an installer environment, store in /Users/Shared
|
||||||
base_path = Path("/Users/Shared")
|
base_path = Path("/Users/Shared")
|
||||||
else:
|
else:
|
||||||
@@ -71,7 +71,7 @@ class InitializeLoggingSupport:
|
|||||||
try:
|
try:
|
||||||
base_path.mkdir()
|
base_path.mkdir()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Failed to create Dortania folder: {e}")
|
print(f"Failed to create Dortania folder: {e}")
|
||||||
base_path = Path("/Users/Shared")
|
base_path = Path("/Users/Shared")
|
||||||
|
|
||||||
self.log_filepath = Path(f"{base_path}/{self.log_filename}").expanduser()
|
self.log_filepath = Path(f"{base_path}/{self.log_filename}").expanduser()
|
||||||
@@ -194,6 +194,7 @@ class InitializeLoggingSupport:
|
|||||||
logging.info('#' * str_len)
|
logging.info('#' * str_len)
|
||||||
|
|
||||||
logging.info("Log file set:")
|
logging.info("Log file set:")
|
||||||
|
logging.info(f" {self.log_filepath}")
|
||||||
# Display relative path to avoid disclosing user's username
|
# Display relative path to avoid disclosing user's username
|
||||||
try:
|
try:
|
||||||
path = self.log_filepath.relative_to(Path.home())
|
path = self.log_filepath.relative_to(Path.home())
|
||||||
|
|||||||
@@ -648,7 +648,10 @@ class PatchSysVolume:
|
|||||||
self._execute_patchset(sys_patch_generate.GenerateRootPatchSets(self.computer.real_model, self.constants, self.hardware_details).patchset)
|
self._execute_patchset(sys_patch_generate.GenerateRootPatchSets(self.computer.real_model, self.constants, self.hardware_details).patchset)
|
||||||
|
|
||||||
if self.constants.wxpython_variant is True and self.constants.detected_os >= os_data.os_data.big_sur:
|
if self.constants.wxpython_variant is True and self.constants.detected_os >= os_data.os_data.big_sur:
|
||||||
sys_patch_auto.AutomaticSysPatch(self.constants).install_auto_patcher_launch_agent()
|
needs_daemon = False
|
||||||
|
if self.constants.detected_os >= os_data.os_data.ventura and self.skip_root_kmutil_requirement is False:
|
||||||
|
needs_daemon = True
|
||||||
|
sys_patch_auto.AutomaticSysPatch(self.constants).install_auto_patcher_launch_agent(kdk_caching_needed=needs_daemon)
|
||||||
|
|
||||||
self._rebuild_root_volume()
|
self._rebuild_root_volume()
|
||||||
|
|
||||||
@@ -665,11 +668,15 @@ class PatchSysVolume:
|
|||||||
self._preflight_checks(required_patches, source_files_path)
|
self._preflight_checks(required_patches, source_files_path)
|
||||||
for patch in required_patches:
|
for patch in required_patches:
|
||||||
logging.info("- Installing Patchset: " + patch)
|
logging.info("- Installing Patchset: " + patch)
|
||||||
if "Remove" in required_patches[patch]:
|
for method_remove in ["Remove", "Remove Non-Root"]:
|
||||||
for remove_patch_directory in required_patches[patch]["Remove"]:
|
if method_remove in required_patches[patch]:
|
||||||
|
for remove_patch_directory in required_patches[patch][method_remove]:
|
||||||
logging.info("- Remove Files at: " + remove_patch_directory)
|
logging.info("- Remove Files at: " + remove_patch_directory)
|
||||||
for remove_patch_file in required_patches[patch]["Remove"][remove_patch_directory]:
|
for remove_patch_file in required_patches[patch][method_remove][remove_patch_directory]:
|
||||||
|
if method_remove == "Remove":
|
||||||
destination_folder_path = str(self.mount_location) + remove_patch_directory
|
destination_folder_path = str(self.mount_location) + remove_patch_directory
|
||||||
|
else:
|
||||||
|
destination_folder_path = str(self.mount_location_data) + remove_patch_directory
|
||||||
self._remove_file(destination_folder_path, remove_patch_file)
|
self._remove_file(destination_folder_path, remove_patch_file)
|
||||||
|
|
||||||
|
|
||||||
@@ -712,8 +719,6 @@ class PatchSysVolume:
|
|||||||
utilities.process_status(subprocess.run(process, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True))
|
utilities.process_status(subprocess.run(process, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True))
|
||||||
if any(x in required_patches for x in ["AMD Legacy GCN", "AMD Legacy Polaris", "AMD Legacy Vega"]):
|
if any(x in required_patches for x in ["AMD Legacy GCN", "AMD Legacy Polaris", "AMD Legacy Vega"]):
|
||||||
sys_patch_helpers.SysPatchHelpers(self.constants).disable_window_server_caching()
|
sys_patch_helpers.SysPatchHelpers(self.constants).disable_window_server_caching()
|
||||||
if any(x in required_patches for x in ["Intel Ivy Bridge", "Intel Haswell"]):
|
|
||||||
sys_patch_helpers.SysPatchHelpers(self.constants).remove_news_widgets()
|
|
||||||
if "Metal 3802 Common Extended" in required_patches:
|
if "Metal 3802 Common Extended" in required_patches:
|
||||||
sys_patch_helpers.SysPatchHelpers(self.constants).patch_gpu_compiler_libraries(mount_point=self.mount_location)
|
sys_patch_helpers.SysPatchHelpers(self.constants).patch_gpu_compiler_libraries(mount_point=self.mount_location)
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,22 @@
|
|||||||
# Copyright (C) 2022, Mykola Grymalyuk
|
# Copyright (C) 2022, Mykola Grymalyuk
|
||||||
|
# Copyright (c) 2023 Jazzzny
|
||||||
|
|
||||||
import wx
|
import wx
|
||||||
|
import wx.html2
|
||||||
|
import requests
|
||||||
|
import markdown2
|
||||||
import logging
|
import logging
|
||||||
import plistlib
|
import plistlib
|
||||||
import subprocess
|
import subprocess
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
import hashlib
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
from resources import utilities, updates, global_settings, network_handler, constants
|
from resources import utilities, updates, global_settings, network_handler, constants
|
||||||
from resources.sys_patch import sys_patch_detect
|
from resources.sys_patch import sys_patch_detect
|
||||||
from resources.wx_gui import gui_entry
|
from resources.wx_gui import gui_entry, gui_support
|
||||||
|
|
||||||
|
|
||||||
class AutomaticSysPatch:
|
class AutomaticSysPatch:
|
||||||
@@ -51,19 +56,90 @@ class AutomaticSysPatch:
|
|||||||
logging.info(f"- Found new version: {version}")
|
logging.info(f"- Found new version: {version}")
|
||||||
|
|
||||||
app = wx.App()
|
app = wx.App()
|
||||||
frame = wx.Frame(None, -1, "OpenCore Legacy Patcher")
|
mainframe = wx.Frame(None, -1, "OpenCore Legacy Patcher")
|
||||||
dialog = wx.MessageDialog(
|
|
||||||
parent=frame,
|
ID_GITHUB = wx.NewId()
|
||||||
message=f"Current Version: {self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}\nNew version: {version}\nWould you like to update?",
|
ID_UPDATE = wx.NewId()
|
||||||
caption="Update Available for OpenCore Legacy Patcher!",
|
|
||||||
style=wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION
|
url = "https://api.github.com/repos/dortania/OpenCore-Legacy-Patcher/releases/latest"
|
||||||
)
|
response = requests.get(url).json()
|
||||||
dialog.SetYesNoCancelLabels("Download and install", "View on Github", "Ignore")
|
try:
|
||||||
response = dialog.ShowModal()
|
changelog = response["body"].split("## Asset Information")[0]
|
||||||
if response == wx.ID_YES:
|
except: #if user constantly checks for updates, github will rate limit them
|
||||||
gui_entry.EntryPoint(self.constants).start(entry=gui_entry.SupportedEntryPoints.UPDATE_APP)
|
changelog = """## Unable to fetch changelog
|
||||||
elif response == wx.ID_NO:
|
|
||||||
|
Please check the Github page for more information about this release."""
|
||||||
|
|
||||||
|
html_markdown = markdown2.markdown(changelog)
|
||||||
|
html_css = """
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 20px;
|
||||||
|
background-color: rgb(238,238,238);
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
line-height: 0.5;
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: -apple-system-control-accent;
|
||||||
|
}
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body {
|
||||||
|
color: #fff;
|
||||||
|
background-color: rgb(47,47,47);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
"""
|
||||||
|
frame = wx.Dialog(None, -1, title="", size=(650, 500))
|
||||||
|
frame.SetMinSize((650, 500))
|
||||||
|
frame.SetWindowStyle(wx.STAY_ON_TOP)
|
||||||
|
panel = wx.Panel(frame)
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
sizer.AddSpacer(10)
|
||||||
|
self.title_text = wx.StaticText(panel, label="A new version of OpenCore Legacy Patcher is available!")
|
||||||
|
self.description = wx.StaticText(panel, label=f"OpenCore Legacy Patcher {version} is now available - You have {self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}. Would you like to update?")
|
||||||
|
self.title_text.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
||||||
|
self.description.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
||||||
|
self.web_view = wx.html2.WebView.New(panel, style=wx.BORDER_SUNKEN)
|
||||||
|
html_code = html_css+html_markdown.replace("<a href=", "<a target='_blank' href=")
|
||||||
|
self.web_view.SetPage(html_code, "")
|
||||||
|
self.web_view.Bind(wx.html2.EVT_WEBVIEW_NEWWINDOW, self._onWebviewNav)
|
||||||
|
self.web_view.EnableContextMenu(False)
|
||||||
|
self.close_button = wx.Button(panel, label="Ignore")
|
||||||
|
self.close_button.Bind(wx.EVT_BUTTON, lambda event: frame.EndModal(wx.ID_CANCEL))
|
||||||
|
self.view_button = wx.Button(panel, ID_GITHUB, label="View on GitHub")
|
||||||
|
self.view_button.Bind(wx.EVT_BUTTON, lambda event: frame.EndModal(ID_GITHUB))
|
||||||
|
self.install_button = wx.Button(panel, label="Download and Install")
|
||||||
|
self.install_button.Bind(wx.EVT_BUTTON, lambda event: frame.EndModal(ID_UPDATE))
|
||||||
|
self.install_button.SetDefault()
|
||||||
|
|
||||||
|
buttonsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
buttonsizer.Add(self.close_button, 0, wx.ALIGN_CENTRE | wx.RIGHT, 5)
|
||||||
|
buttonsizer.Add(self.view_button, 0, wx.ALIGN_CENTRE | wx.LEFT|wx.RIGHT, 5)
|
||||||
|
buttonsizer.Add(self.install_button, 0, wx.ALIGN_CENTRE | wx.LEFT, 5)
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
sizer.Add(self.title_text, 0, wx.ALIGN_CENTRE | wx.TOP, 20)
|
||||||
|
sizer.Add(self.description, 0, wx.ALIGN_CENTRE | wx.BOTTOM, 20)
|
||||||
|
sizer.Add(self.web_view, 1, wx.EXPAND | wx.LEFT|wx.RIGHT, 10)
|
||||||
|
sizer.Add(buttonsizer, 0, wx.ALIGN_RIGHT | wx.ALL, 20)
|
||||||
|
panel.SetSizer(sizer)
|
||||||
|
frame.Centre()
|
||||||
|
|
||||||
|
result = frame.ShowModal()
|
||||||
|
|
||||||
|
|
||||||
|
if result == ID_GITHUB:
|
||||||
webbrowser.open(dict["Github Link"])
|
webbrowser.open(dict["Github Link"])
|
||||||
|
elif result == ID_UPDATE:
|
||||||
|
gui_entry.EntryPoint(self.constants).start(entry=gui_entry.SupportedEntryPoints.UPDATE_APP)
|
||||||
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if utilities.check_seal() is True:
|
if utilities.check_seal() is True:
|
||||||
@@ -127,6 +203,9 @@ class AutomaticSysPatch:
|
|||||||
if self._determine_if_versions_match():
|
if self._determine_if_versions_match():
|
||||||
self._determine_if_boot_matches()
|
self._determine_if_boot_matches()
|
||||||
|
|
||||||
|
def _onWebviewNav(self, event):
|
||||||
|
url = event.GetURL()
|
||||||
|
webbrowser.open(url)
|
||||||
|
|
||||||
def _determine_if_versions_match(self):
|
def _determine_if_versions_match(self):
|
||||||
"""
|
"""
|
||||||
@@ -253,7 +332,7 @@ class AutomaticSysPatch:
|
|||||||
logging.info("- Unable to determine if boot disk is removable, skipping prompt")
|
logging.info("- Unable to determine if boot disk is removable, skipping prompt")
|
||||||
|
|
||||||
|
|
||||||
def install_auto_patcher_launch_agent(self):
|
def install_auto_patcher_launch_agent(self, kdk_caching_needed: bool = False):
|
||||||
"""
|
"""
|
||||||
Install the Auto Patcher Launch Agent
|
Install the Auto Patcher Launch Agent
|
||||||
|
|
||||||
@@ -268,8 +347,34 @@ class AutomaticSysPatch:
|
|||||||
logging.info("- Skipping Auto Patcher Launch Agent, not supported when running from source")
|
logging.info("- Skipping Auto Patcher Launch Agent, not supported when running from source")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
services = {
|
||||||
|
self.constants.auto_patch_launch_agent_path: "/Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist",
|
||||||
|
self.constants.update_launch_daemon_path: "/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.macos-update.plist",
|
||||||
|
**({ self.constants.rsr_monitor_launch_daemon_path: "/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.rsr-monitor.plist" } if self._create_rsr_monitor_daemon() else {}),
|
||||||
|
**({ self.constants.kdk_launch_daemon_path: "/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.os-caching.plist" } if kdk_caching_needed is True else {} ),
|
||||||
|
}
|
||||||
|
|
||||||
|
for service in services:
|
||||||
|
name = Path(service).name
|
||||||
|
logging.info(f"- Installing {name}")
|
||||||
|
if Path(services[service]).exists():
|
||||||
|
if hashlib.sha256(open(service, "rb").read()).hexdigest() == hashlib.sha256(open(services[service], "rb").read()).hexdigest():
|
||||||
|
logging.info(f" - {name} checksums match, skipping")
|
||||||
|
continue
|
||||||
|
logging.info(f" - Existing service found, removing")
|
||||||
|
utilities.process_status(utilities.elevated(["rm", services[service]], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
||||||
|
# Create parent directories
|
||||||
|
if not Path(services[service]).parent.exists():
|
||||||
|
logging.info(f" - Creating {Path(services[service]).parent} directory")
|
||||||
|
utilities.process_status(utilities.elevated(["mkdir", "-p", Path(services[service]).parent], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
||||||
|
utilities.process_status(utilities.elevated(["cp", service, services[service]], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
||||||
|
|
||||||
|
# Set the permissions on the service
|
||||||
|
utilities.process_status(utilities.elevated(["chmod", "644", services[service]], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
||||||
|
utilities.process_status(utilities.elevated(["chown", "root:wheel", services[service]], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
||||||
|
|
||||||
if self.constants.launcher_binary.startswith("/Library/Application Support/Dortania/"):
|
if self.constants.launcher_binary.startswith("/Library/Application Support/Dortania/"):
|
||||||
logging.info("- Skipping Auto Patcher Launch Agent, already installed")
|
logging.info("- Skipping Patcher Install, already installed")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Verify our binary isn't located in '/Library/Application Support/Dortania/'
|
# Verify our binary isn't located in '/Library/Application Support/Dortania/'
|
||||||
@@ -299,37 +404,6 @@ class AutomaticSysPatch:
|
|||||||
|
|
||||||
subprocess.run(["xattr", "-cr", "/Library/Application Support/Dortania/OpenCore-Patcher.app"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
subprocess.run(["xattr", "-cr", "/Library/Application Support/Dortania/OpenCore-Patcher.app"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
|
||||||
# Copy over our launch agent
|
|
||||||
logging.info("- Copying auto-patch.plist Launch Agent to /Library/LaunchAgents/")
|
|
||||||
if Path("/Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist").exists():
|
|
||||||
logging.info("- Deleting existing auto-patch.plist")
|
|
||||||
utilities.process_status(utilities.elevated(["rm", "/Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
if not Path("/Library/LaunchAgents/").exists():
|
|
||||||
logging.info("- Creating /Library/LaunchAgents/")
|
|
||||||
utilities.process_status(utilities.elevated(["mkdir", "-p", "/Library/LaunchAgents/"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
utilities.process_status(utilities.elevated(["cp", self.constants.auto_patch_launch_agent_path, "/Library/LaunchAgents/"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
|
|
||||||
# Set the permissions on the com.dortania.opencore-legacy-patcher.auto-patch.plist
|
|
||||||
logging.info("- Setting permissions on auto-patch.plist")
|
|
||||||
utilities.process_status(utilities.elevated(["chmod", "644", "/Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
utilities.process_status(utilities.elevated(["chown", "root:wheel", "/Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
|
|
||||||
# Copy over our launch daemon
|
|
||||||
if self._create_rsr_monitor_daemon() is True:
|
|
||||||
logging.info("- Copying rsr-monitor.plist Launch Daemon to /Library/LaunchDaemons/")
|
|
||||||
if Path("/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.rsr-monitor.plist").exists():
|
|
||||||
logging.info("- Deleting existing rsr-monitor.plist")
|
|
||||||
utilities.process_status(utilities.elevated(["rm", "/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.rsr-monitor.plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
if not Path("/Library/LaunchDaemons/").exists():
|
|
||||||
logging.info("- Creating /Library/LaunchDaemons/")
|
|
||||||
utilities.process_status(utilities.elevated(["mkdir", "-p", "/Library/LaunchDaemons/"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
utilities.process_status(utilities.elevated(["cp", self.constants.rsr_monitor_launch_daemon_path, "/Library/LaunchDaemons/"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
|
|
||||||
# Set the permissions on the com.dortania.opencore-legacy-patcher.rsr-monitor.plist
|
|
||||||
logging.info("- Setting permissions on rsr-monitor.plist")
|
|
||||||
utilities.process_status(utilities.elevated(["chmod", "644", "/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.rsr-monitor.plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
utilities.process_status(utilities.elevated(["chown", "root:wheel", "/Library/LaunchDaemons/com.dortania.opencore-legacy-patcher.rsr-monitor.plist"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
|
|
||||||
|
|
||||||
# Making app alias
|
# Making app alias
|
||||||
# Simply an easy way for users to notice the app
|
# Simply an easy way for users to notice the app
|
||||||
# If there's already an alias or exiting app, skip
|
# If there's already an alias or exiting app, skip
|
||||||
|
|||||||
@@ -20,10 +20,27 @@ class DetectRootPatch:
|
|||||||
Library for querying root volume patches applicable for booted system
|
Library for querying root volume patches applicable for booted system
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, model: str, global_constants: constants.Constants):
|
def __init__(self, model: str, global_constants: constants.Constants,
|
||||||
|
os_major: int = None, os_minor: int = None,
|
||||||
|
os_build: str = None, os_version: str = None
|
||||||
|
) -> None:
|
||||||
|
|
||||||
self.model: str = model
|
self.model: str = model
|
||||||
|
|
||||||
self.constants: constants.Constants = global_constants
|
self.constants: constants.Constants = global_constants
|
||||||
|
if os_major is None:
|
||||||
|
os_major = self.constants.detected_os
|
||||||
|
if os_minor is None:
|
||||||
|
os_minor = self.constants.detected_os_minor
|
||||||
|
if os_build is None:
|
||||||
|
os_build = self.constants.detected_os_build
|
||||||
|
if os_version is None:
|
||||||
|
os_version = self.constants.detected_os_version
|
||||||
|
|
||||||
|
self.os_major: int = os_major
|
||||||
|
self.os_minor: int = os_minor
|
||||||
|
self.os_build: str = os_build
|
||||||
|
self.os_version: str = os_version
|
||||||
|
|
||||||
self.computer = self.constants.computer
|
self.computer = self.constants.computer
|
||||||
|
|
||||||
@@ -53,6 +70,7 @@ class DetectRootPatch:
|
|||||||
self.legacy_keyboard_backlight = False
|
self.legacy_keyboard_backlight = False
|
||||||
self.legacy_uhci_ohci = False
|
self.legacy_uhci_ohci = False
|
||||||
self.legacy_pcie_webcam = False
|
self.legacy_pcie_webcam = False
|
||||||
|
self.legacy_t1_chip = False
|
||||||
|
|
||||||
# Patch Requirements
|
# Patch Requirements
|
||||||
self.amfi_must_disable = False
|
self.amfi_must_disable = False
|
||||||
@@ -88,7 +106,7 @@ class DetectRootPatch:
|
|||||||
if gpu.class_code and gpu.class_code != 0xFFFFFFFF:
|
if gpu.class_code and gpu.class_code != 0xFFFFFFFF:
|
||||||
logging.info(f"Found GPU ({i}): {utilities.friendly_hex(gpu.vendor_id)}:{utilities.friendly_hex(gpu.device_id)}")
|
logging.info(f"Found GPU ({i}): {utilities.friendly_hex(gpu.vendor_id)}:{utilities.friendly_hex(gpu.device_id)}")
|
||||||
if gpu.arch in [device_probe.NVIDIA.Archs.Tesla] and self.constants.force_nv_web is False:
|
if gpu.arch in [device_probe.NVIDIA.Archs.Tesla] and self.constants.force_nv_web is False:
|
||||||
if self.constants.detected_os > non_metal_os:
|
if self.os_major > non_metal_os:
|
||||||
self.nvidia_tesla = True
|
self.nvidia_tesla = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
||||||
@@ -96,24 +114,24 @@ class DetectRootPatch:
|
|||||||
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
|
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
elif gpu.arch == device_probe.NVIDIA.Archs.Kepler and self.constants.force_nv_web is False:
|
elif gpu.arch == device_probe.NVIDIA.Archs.Kepler and self.constants.force_nv_web is False:
|
||||||
if self.constants.detected_os > os_data.os_data.big_sur:
|
if self.os_major > os_data.os_data.big_sur:
|
||||||
# Kepler drivers were dropped with Beta 7
|
# Kepler drivers were dropped with Beta 7
|
||||||
# 12.0 Beta 5: 21.0.0 - 21A5304g
|
# 12.0 Beta 5: 21.0.0 - 21A5304g
|
||||||
# 12.0 Beta 6: 21.1.0 - 21A5506j
|
# 12.0 Beta 6: 21.1.0 - 21A5506j
|
||||||
# 12.0 Beta 7: 21.1.0 - 21A5522h
|
# 12.0 Beta 7: 21.1.0 - 21A5522h
|
||||||
if (
|
if (
|
||||||
self.constants.detected_os >= os_data.os_data.ventura or
|
self.os_major >= os_data.os_data.ventura or
|
||||||
(
|
(
|
||||||
"21A5506j" not in self.constants.detected_os_build and
|
"21A5506j" not in self.os_build and
|
||||||
self.constants.detected_os == os_data.os_data.monterey and
|
self.os_major == os_data.os_data.monterey and
|
||||||
self.constants.detected_os_minor > 0
|
self.os_minor > 0
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
self.kepler_gpu = True
|
self.kepler_gpu = True
|
||||||
self.supports_metal = True
|
self.supports_metal = True
|
||||||
if self.constants.detected_os >= os_data.os_data.ventura:
|
if self.os_major >= os_data.os_data.ventura:
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if (self.constants.detected_os == os_data.os_data.ventura and self.constants.detected_os_minor >= 4) or self.constants.detected_os > os_data.os_data.ventura:
|
if (self.os_major == os_data.os_data.ventura and self.os_minor >= 4) or self.os_major > os_data.os_data.ventura:
|
||||||
self.amfi_shim_bins = True
|
self.amfi_shim_bins = True
|
||||||
elif gpu.arch in [
|
elif gpu.arch in [
|
||||||
device_probe.NVIDIA.Archs.Fermi,
|
device_probe.NVIDIA.Archs.Fermi,
|
||||||
@@ -121,7 +139,7 @@ class DetectRootPatch:
|
|||||||
device_probe.NVIDIA.Archs.Maxwell,
|
device_probe.NVIDIA.Archs.Maxwell,
|
||||||
device_probe.NVIDIA.Archs.Pascal,
|
device_probe.NVIDIA.Archs.Pascal,
|
||||||
]:
|
]:
|
||||||
if self.constants.detected_os > os_data.os_data.mojave:
|
if self.os_major > os_data.os_data.mojave:
|
||||||
self.nvidia_web = True
|
self.nvidia_web = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
||||||
@@ -129,14 +147,14 @@ class DetectRootPatch:
|
|||||||
self.needs_nv_web_checks = True
|
self.needs_nv_web_checks = True
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
elif gpu.arch == device_probe.AMD.Archs.TeraScale_1:
|
elif gpu.arch == device_probe.AMD.Archs.TeraScale_1:
|
||||||
if self.constants.detected_os > non_metal_os:
|
if self.os_major > non_metal_os:
|
||||||
self.amd_ts1 = True
|
self.amd_ts1 = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
||||||
self.amfi_shim_bins = True
|
self.amfi_shim_bins = True
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
elif gpu.arch == device_probe.AMD.Archs.TeraScale_2:
|
elif gpu.arch == device_probe.AMD.Archs.TeraScale_2:
|
||||||
if self.constants.detected_os > non_metal_os:
|
if self.os_major > non_metal_os:
|
||||||
self.amd_ts2 = True
|
self.amd_ts2 = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
||||||
@@ -148,7 +166,7 @@ class DetectRootPatch:
|
|||||||
device_probe.AMD.Archs.Legacy_GCN_9000,
|
device_probe.AMD.Archs.Legacy_GCN_9000,
|
||||||
device_probe.AMD.Archs.Polaris,
|
device_probe.AMD.Archs.Polaris,
|
||||||
]:
|
]:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
if self.os_major > os_data.os_data.monterey:
|
||||||
if self.constants.computer.rosetta_active is True:
|
if self.constants.computer.rosetta_active is True:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -170,7 +188,7 @@ class DetectRootPatch:
|
|||||||
if self.model == "MacBookPro13,3":
|
if self.model == "MacBookPro13,3":
|
||||||
self.legacy_gcn = True
|
self.legacy_gcn = True
|
||||||
elif self.model == "MacBookPro14,3":
|
elif self.model == "MacBookPro14,3":
|
||||||
if self.constants.detected_os < os_data.os_data.sonoma:
|
if self.os_major < os_data.os_data.sonoma:
|
||||||
continue
|
continue
|
||||||
self.legacy_gcn_v2 = True
|
self.legacy_gcn_v2 = True
|
||||||
else:
|
else:
|
||||||
@@ -179,7 +197,7 @@ class DetectRootPatch:
|
|||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
elif gpu.arch == device_probe.AMD.Archs.Vega:
|
elif gpu.arch == device_probe.AMD.Archs.Vega:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
if self.os_major > os_data.os_data.monterey:
|
||||||
if "AVX2" in self.constants.computer.cpu.leafs:
|
if "AVX2" in self.constants.computer.cpu.leafs:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -188,7 +206,7 @@ class DetectRootPatch:
|
|||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Iron_Lake:
|
elif gpu.arch == device_probe.Intel.Archs.Iron_Lake:
|
||||||
if self.constants.detected_os > non_metal_os:
|
if self.os_major > non_metal_os:
|
||||||
self.iron_gpu = True
|
self.iron_gpu = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
||||||
@@ -196,7 +214,7 @@ class DetectRootPatch:
|
|||||||
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
|
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Sandy_Bridge:
|
elif gpu.arch == device_probe.Intel.Archs.Sandy_Bridge:
|
||||||
if self.constants.detected_os > non_metal_os:
|
if self.os_major > non_metal_os:
|
||||||
self.sandy_gpu = True
|
self.sandy_gpu = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
if os_data.os_data.ventura in self.constants.legacy_accel_support:
|
||||||
@@ -204,33 +222,31 @@ class DetectRootPatch:
|
|||||||
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
|
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Ivy_Bridge:
|
elif gpu.arch == device_probe.Intel.Archs.Ivy_Bridge:
|
||||||
if self.constants.detected_os > os_data.os_data.big_sur:
|
if self.os_major > os_data.os_data.big_sur:
|
||||||
self.ivy_gpu = True
|
self.ivy_gpu = True
|
||||||
if self.constants.detected_os >= os_data.os_data.ventura:
|
if self.os_major >= os_data.os_data.ventura:
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if (self.constants.detected_os == os_data.os_data.ventura and self.constants.detected_os_minor >= 4) or self.constants.detected_os > os_data.os_data.ventura:
|
if (self.os_major == os_data.os_data.ventura and self.os_minor >= 4) or self.os_major > os_data.os_data.ventura:
|
||||||
self.amfi_shim_bins = True
|
self.amfi_shim_bins = True
|
||||||
self.supports_metal = True
|
self.supports_metal = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Haswell:
|
elif gpu.arch == device_probe.Intel.Archs.Haswell:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
if self.os_major > os_data.os_data.monterey:
|
||||||
self.haswell_gpu = True
|
self.haswell_gpu = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if (self.constants.detected_os == os_data.os_data.ventura and self.constants.detected_os_minor >= 4) or self.constants.detected_os > os_data.os_data.ventura:
|
if (self.os_major == os_data.os_data.ventura and self.os_minor >= 4) or self.os_major > os_data.os_data.ventura:
|
||||||
self.amfi_shim_bins = True
|
self.amfi_shim_bins = True
|
||||||
self.supports_metal = True
|
self.supports_metal = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Broadwell:
|
elif gpu.arch == device_probe.Intel.Archs.Broadwell:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
if self.os_major > os_data.os_data.monterey:
|
||||||
self.broadwell_gpu = True
|
self.broadwell_gpu = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
self.supports_metal = True
|
self.supports_metal = True
|
||||||
elif gpu.arch == device_probe.Intel.Archs.Skylake:
|
elif gpu.arch == device_probe.Intel.Archs.Skylake:
|
||||||
if self.constants.detected_os > os_data.os_data.monterey:
|
if self.os_major > os_data.os_data.monterey:
|
||||||
self.skylake_gpu = True
|
self.skylake_gpu = True
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
self.supports_metal = True
|
self.supports_metal = True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if self.supports_metal is True:
|
if self.supports_metal is True:
|
||||||
# Avoid patching Metal and non-Metal GPUs if both present, prioritize Metal GPU
|
# Avoid patching Metal and non-Metal GPUs if both present, prioritize Metal GPU
|
||||||
# Main concerns are for iMac12,x with Sandy iGPU and Kepler dGPU
|
# Main concerns are for iMac12,x with Sandy iGPU and Kepler dGPU
|
||||||
@@ -250,7 +266,7 @@ class DetectRootPatch:
|
|||||||
self.legacy_polaris = False
|
self.legacy_polaris = False
|
||||||
self.legacy_vega = False
|
self.legacy_vega = False
|
||||||
|
|
||||||
if self.constants.detected_os <= os_data.os_data.monterey:
|
if self.os_major <= os_data.os_data.monterey:
|
||||||
# Always assume Root KC requirement on Monterey and older
|
# Always assume Root KC requirement on Monterey and older
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
else:
|
else:
|
||||||
@@ -271,7 +287,7 @@ class DetectRootPatch:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Increase OS check if modern wifi is detected
|
# Increase OS check if modern wifi is detected
|
||||||
if self.constants.detected_os < (os_data.os_data.ventura if self.legacy_wifi is True else os_data.os_data.sonoma):
|
if self.os_major < (os_data.os_data.ventura if self.legacy_wifi is True else os_data.os_data.sonoma):
|
||||||
return
|
return
|
||||||
if self.legacy_wifi is False and self.modern_wifi is False:
|
if self.legacy_wifi is False and self.modern_wifi is False:
|
||||||
return
|
return
|
||||||
@@ -312,7 +328,7 @@ class DetectRootPatch:
|
|||||||
self.legacy_keyboard_backlight = False
|
self.legacy_keyboard_backlight = False
|
||||||
|
|
||||||
# Currently all graphics patches require a KDK
|
# Currently all graphics patches require a KDK
|
||||||
if self.constants.detected_os >= os_data.os_data.sonoma:
|
if self.os_major >= os_data.os_data.sonoma:
|
||||||
self.kepler_gpu = False
|
self.kepler_gpu = False
|
||||||
self.ivy_gpu = False
|
self.ivy_gpu = False
|
||||||
self.haswell_gpu = False
|
self.haswell_gpu = False
|
||||||
@@ -441,7 +457,7 @@ class DetectRootPatch:
|
|||||||
"""
|
"""
|
||||||
min_os = os_data.os_data.big_sur
|
min_os = os_data.os_data.big_sur
|
||||||
max_os = os_data.os_data.sonoma
|
max_os = os_data.os_data.sonoma
|
||||||
if self.constants.detected_os < min_os or self.constants.detected_os > max_os:
|
if self.os_major < min_os or self.os_major > max_os:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -454,7 +470,7 @@ class DetectRootPatch:
|
|||||||
bool: True if installed, False otherwise
|
bool: True if installed, False otherwise
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return kdk_handler.KernelDebugKitObject(self.constants, self.constants.detected_os_build, self.constants.detected_os_version, passive=True).kdk_already_installed
|
return kdk_handler.KernelDebugKitObject(self.constants, self.os_build, self.os_version, passive=True).kdk_already_installed
|
||||||
|
|
||||||
|
|
||||||
def _check_sip(self):
|
def _check_sip(self):
|
||||||
@@ -465,14 +481,14 @@ class DetectRootPatch:
|
|||||||
tuple: (list, str, str) of SIP values, SIP hex, SIP error message
|
tuple: (list, str, str) of SIP values, SIP hex, SIP error message
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.constants.detected_os > os_data.os_data.catalina:
|
if self.os_major > os_data.os_data.catalina:
|
||||||
if self.nvidia_web is True:
|
if self.nvidia_web is True:
|
||||||
sip = sip_data.system_integrity_protection.root_patch_sip_big_sur_3rd_part_kexts
|
sip = sip_data.system_integrity_protection.root_patch_sip_big_sur_3rd_part_kexts
|
||||||
sip_hex = "0xA03"
|
sip_hex = "0xA03"
|
||||||
sip_value = (
|
sip_value = (
|
||||||
f"For Hackintoshes, please set csr-active-config to '030A0000' ({sip_hex})\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS"
|
f"For Hackintoshes, please set csr-active-config to '030A0000' ({sip_hex})\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS"
|
||||||
)
|
)
|
||||||
elif self.constants.detected_os >= os_data.os_data.ventura:
|
elif self.os_major >= os_data.os_data.ventura:
|
||||||
sip = sip_data.system_integrity_protection.root_patch_sip_ventura
|
sip = sip_data.system_integrity_protection.root_patch_sip_ventura
|
||||||
sip_hex = "0x803"
|
sip_hex = "0x803"
|
||||||
sip_value = (
|
sip_value = (
|
||||||
@@ -499,7 +515,7 @@ class DetectRootPatch:
|
|||||||
bool: True if UHCI/OHCI patches required, False otherwise
|
bool: True if UHCI/OHCI patches required, False otherwise
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.constants.detected_os < os_data.os_data.ventura:
|
if self.os_major < os_data.os_data.ventura:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# If we're on a hackintosh, check for UHCI/OHCI controllers
|
# If we're on a hackintosh, check for UHCI/OHCI controllers
|
||||||
@@ -538,32 +554,37 @@ class DetectRootPatch:
|
|||||||
|
|
||||||
self.has_network = network_handler.NetworkUtilities().verify_network_connection()
|
self.has_network = network_handler.NetworkUtilities().verify_network_connection()
|
||||||
|
|
||||||
|
if self.os_major >= os_data.os_data.sonoma:
|
||||||
self.legacy_pcie_webcam = self.constants.computer.pcie_webcam
|
self.legacy_pcie_webcam = self.constants.computer.pcie_webcam
|
||||||
|
self.legacy_t1_chip = self.constants.computer.t1_chip
|
||||||
|
|
||||||
|
if self.legacy_t1_chip is True:
|
||||||
|
self.amfi_must_disable = True
|
||||||
|
|
||||||
if self._check_uhci_ohci() is True:
|
if self._check_uhci_ohci() is True:
|
||||||
self.legacy_uhci_ohci = True
|
self.legacy_uhci_ohci = True
|
||||||
self.requires_root_kc = True
|
self.requires_root_kc = True
|
||||||
|
|
||||||
if self.model in model_array.LegacyBrightness:
|
if self.model in model_array.LegacyBrightness:
|
||||||
if self.constants.detected_os > os_data.os_data.catalina:
|
if self.os_major > os_data.os_data.catalina:
|
||||||
self.brightness_legacy = True
|
self.brightness_legacy = True
|
||||||
|
|
||||||
if self.model in ["iMac7,1", "iMac8,1"] or (self.model in model_array.LegacyAudio and utilities.check_kext_loaded("as.vit9696.AppleALC") is False):
|
if self.model in ["iMac7,1", "iMac8,1"] or (self.model in model_array.LegacyAudio and utilities.check_kext_loaded("as.vit9696.AppleALC") is False):
|
||||||
# Special hack for systems with botched GOPs
|
# Special hack for systems with botched GOPs
|
||||||
# TL;DR: No Boot Screen breaks Lilu, therefore breaking audio
|
# TL;DR: No Boot Screen breaks Lilu, therefore breaking audio
|
||||||
if self.constants.detected_os > os_data.os_data.catalina:
|
if self.os_major > os_data.os_data.catalina:
|
||||||
self.legacy_audio = True
|
self.legacy_audio = True
|
||||||
|
|
||||||
if (
|
if (
|
||||||
isinstance(self.constants.computer.wifi, device_probe.Broadcom)
|
isinstance(self.constants.computer.wifi, device_probe.Broadcom)
|
||||||
and self.constants.computer.wifi.chipset in [device_probe.Broadcom.Chipsets.AirPortBrcm4331, device_probe.Broadcom.Chipsets.AirPortBrcm43224]
|
and self.constants.computer.wifi.chipset in [device_probe.Broadcom.Chipsets.AirPortBrcm4331, device_probe.Broadcom.Chipsets.AirPortBrcm43224]
|
||||||
) or (isinstance(self.constants.computer.wifi, device_probe.Atheros) and self.constants.computer.wifi.chipset == device_probe.Atheros.Chipsets.AirPortAtheros40):
|
) or (isinstance(self.constants.computer.wifi, device_probe.Atheros) and self.constants.computer.wifi.chipset == device_probe.Atheros.Chipsets.AirPortAtheros40):
|
||||||
if self.constants.detected_os > os_data.os_data.big_sur:
|
if self.os_major > os_data.os_data.big_sur:
|
||||||
self.legacy_wifi = True
|
self.legacy_wifi = True
|
||||||
if self.constants.detected_os >= os_data.os_data.ventura:
|
if self.os_major >= os_data.os_data.ventura:
|
||||||
# Due to extracted frameworks for IO80211.framework and co, check library validation
|
# Due to extracted frameworks for IO80211.framework and co, check library validation
|
||||||
self.amfi_must_disable = True
|
self.amfi_must_disable = True
|
||||||
if self.constants.detected_os > os_data.os_data.ventura:
|
if self.os_major > os_data.os_data.ventura:
|
||||||
self.amfi_shim_bins = True
|
self.amfi_shim_bins = True
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -574,7 +595,7 @@ class DetectRootPatch:
|
|||||||
# We don't officially support this chipset, however we'll throw a bone to hackintosh users
|
# We don't officially support this chipset, however we'll throw a bone to hackintosh users
|
||||||
device_probe.Broadcom.Chipsets.AirPortBrcmNICThirdParty,
|
device_probe.Broadcom.Chipsets.AirPortBrcmNICThirdParty,
|
||||||
]):
|
]):
|
||||||
if self.constants.detected_os > os_data.os_data.ventura:
|
if self.os_major > os_data.os_data.ventura:
|
||||||
self.modern_wifi = True
|
self.modern_wifi = True
|
||||||
self.amfi_shim_bins = True
|
self.amfi_shim_bins = True
|
||||||
|
|
||||||
@@ -584,7 +605,7 @@ class DetectRootPatch:
|
|||||||
# Same method is also used for demuxed machines
|
# Same method is also used for demuxed machines
|
||||||
# Note that MacBookPro5,x machines are extremely unstable with this patch set, so disabled until investigated further
|
# Note that MacBookPro5,x machines are extremely unstable with this patch set, so disabled until investigated further
|
||||||
# Ref: https://github.com/dortania/OpenCore-Legacy-Patcher/files/7360909/KP-b10-030.txt
|
# Ref: https://github.com/dortania/OpenCore-Legacy-Patcher/files/7360909/KP-b10-030.txt
|
||||||
if self.constants.detected_os > os_data.os_data.high_sierra:
|
if self.os_major > os_data.os_data.high_sierra:
|
||||||
if self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
|
if self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
|
||||||
# Ref: https://doslabelectronics.com/Demux.html
|
# Ref: https://doslabelectronics.com/Demux.html
|
||||||
if self._detect_demux() is True:
|
if self._detect_demux() is True:
|
||||||
@@ -621,9 +642,10 @@ class DetectRootPatch:
|
|||||||
"Miscellaneous: Legacy Keyboard Backlight": self.legacy_keyboard_backlight,
|
"Miscellaneous: Legacy Keyboard Backlight": self.legacy_keyboard_backlight,
|
||||||
"Miscellaneous: Legacy USB 1.1": self.legacy_uhci_ohci,
|
"Miscellaneous: Legacy USB 1.1": self.legacy_uhci_ohci,
|
||||||
"Miscellaneous: PCIe FaceTime Camera": self.legacy_pcie_webcam,
|
"Miscellaneous: PCIe FaceTime Camera": self.legacy_pcie_webcam,
|
||||||
|
"Miscellaneous: T1 Security Chip": self.legacy_t1_chip,
|
||||||
"Settings: Requires AMFI exemption": self.amfi_must_disable,
|
"Settings: Requires AMFI exemption": self.amfi_must_disable,
|
||||||
"Settings: Supports Auxiliary Cache": not self.requires_root_kc,
|
"Settings: Supports Auxiliary Cache": not self.requires_root_kc,
|
||||||
"Settings: Kernel Debug Kit missing": self.missing_kdk if self.constants.detected_os >= os_data.os_data.ventura.value else False,
|
"Settings: Kernel Debug Kit missing": self.missing_kdk if self.os_major >= os_data.os_data.ventura.value else False,
|
||||||
"Validation: Patching Possible": self.verify_patch_allowed(),
|
"Validation: Patching Possible": self.verify_patch_allowed(),
|
||||||
"Validation: Unpatching Possible": self._verify_unpatch_allowed(),
|
"Validation: Unpatching Possible": self._verify_unpatch_allowed(),
|
||||||
f"Validation: Unsupported Host OS": self.unsupported_os,
|
f"Validation: Unsupported Host OS": self.unsupported_os,
|
||||||
@@ -637,7 +659,7 @@ class DetectRootPatch:
|
|||||||
"Validation: Force OpenGL property missing": self.missing_nv_web_opengl if self.nvidia_web is True else False,
|
"Validation: Force OpenGL property missing": self.missing_nv_web_opengl if self.nvidia_web is True else False,
|
||||||
"Validation: Force compat property missing": self.missing_nv_compat if self.nvidia_web is True else False,
|
"Validation: Force compat property missing": self.missing_nv_compat if self.nvidia_web is True else False,
|
||||||
"Validation: nvda_drv(_vrl) variable missing": self.missing_nv_web_nvram if self.nvidia_web is True else False,
|
"Validation: nvda_drv(_vrl) variable missing": self.missing_nv_web_nvram if self.nvidia_web is True else False,
|
||||||
"Validation: Network Connection Required": (not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.constants.detected_os >= os_data.os_data.ventura.value) else False,
|
"Validation: Network Connection Required": (not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.os_major >= os_data.os_data.ventura.value) else False,
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.root_patch_dict
|
return self.root_patch_dict
|
||||||
@@ -654,7 +676,7 @@ class DetectRootPatch:
|
|||||||
if self.amfi_must_disable is False:
|
if self.amfi_must_disable is False:
|
||||||
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
|
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
|
||||||
|
|
||||||
if self.constants.detected_os < os_data.os_data.big_sur:
|
if self.os_major < os_data.os_data.big_sur:
|
||||||
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
|
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
|
||||||
|
|
||||||
amfipass_version = utilities.check_kext_loaded("com.dhinakg.AMFIPass")
|
amfipass_version = utilities.check_kext_loaded("com.dhinakg.AMFIPass")
|
||||||
@@ -663,7 +685,7 @@ class DetectRootPatch:
|
|||||||
# If AMFIPass is loaded, our binaries will work
|
# If AMFIPass is loaded, our binaries will work
|
||||||
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
|
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
|
||||||
|
|
||||||
if self.constants.detected_os >= os_data.os_data.ventura:
|
if self.os_major >= os_data.os_data.ventura:
|
||||||
if self.amfi_shim_bins is True:
|
if self.amfi_shim_bins is True:
|
||||||
# Currently we require AMFI outright disabled
|
# Currently we require AMFI outright disabled
|
||||||
# in Ventura to work with shim'd binaries
|
# in Ventura to work with shim'd binaries
|
||||||
@@ -687,7 +709,7 @@ class DetectRootPatch:
|
|||||||
sip = sip_dict[0]
|
sip = sip_dict[0]
|
||||||
sip_value = sip_dict[1]
|
sip_value = sip_dict[1]
|
||||||
|
|
||||||
self.sip_enabled, self.sbm_enabled, self.fv_enabled, self.dosdude_patched = utilities.patching_status(sip, self.constants.detected_os)
|
self.sip_enabled, self.sbm_enabled, self.fv_enabled, self.dosdude_patched = utilities.patching_status(sip, self.os_major)
|
||||||
self.amfi_enabled = not amfi_detect.AmfiConfigurationDetection().check_config(self._get_amfi_level_needed())
|
self.amfi_enabled = not amfi_detect.AmfiConfigurationDetection().check_config(self._get_amfi_level_needed())
|
||||||
|
|
||||||
self.unsupported_os = not self._check_os_compat()
|
self.unsupported_os = not self._check_os_compat()
|
||||||
@@ -741,7 +763,7 @@ class DetectRootPatch:
|
|||||||
logging.info("\nCannot patch! WhateverGreen.kext missing")
|
logging.info("\nCannot patch! WhateverGreen.kext missing")
|
||||||
logging.info("Please ensure WhateverGreen.kext is installed")
|
logging.info("Please ensure WhateverGreen.kext is installed")
|
||||||
|
|
||||||
if (not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.constants.detected_os >= os_data.os_data.ventura.value) else False:
|
if (not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.os_major >= os_data.os_data.ventura.value) else False:
|
||||||
logging.info("\nCannot patch! Network Connection Required")
|
logging.info("\nCannot patch! Network Connection Required")
|
||||||
logging.info("Please ensure you have an active internet connection")
|
logging.info("Please ensure you have an active internet connection")
|
||||||
|
|
||||||
@@ -764,7 +786,7 @@ class DetectRootPatch:
|
|||||||
self.missing_whatever_green if self.nvidia_web is True else False,
|
self.missing_whatever_green if self.nvidia_web is True else False,
|
||||||
|
|
||||||
# KDK specific
|
# KDK specific
|
||||||
(not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.constants.detected_os >= os_data.os_data.ventura.value) else False
|
(not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.os_major >= os_data.os_data.ventura.value) else False
|
||||||
]
|
]
|
||||||
):
|
):
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -176,10 +176,14 @@ class GenerateRootPatchSets:
|
|||||||
|
|
||||||
if self.hardware_details["Miscellaneous: Legacy USB 1.1"] is True:
|
if self.hardware_details["Miscellaneous: Legacy USB 1.1"] is True:
|
||||||
required_patches.update({"Legacy USB 1.1": all_hardware_patchset["Miscellaneous"]["Legacy USB 1.1"]})
|
required_patches.update({"Legacy USB 1.1": all_hardware_patchset["Miscellaneous"]["Legacy USB 1.1"]})
|
||||||
|
required_patches.update({"Legacy USB 1.1 Extended": all_hardware_patchset["Miscellaneous"]["Legacy USB 1.1 Extended"]})
|
||||||
|
|
||||||
if self.hardware_details["Miscellaneous: PCIe FaceTime Camera"] is True:
|
if self.hardware_details["Miscellaneous: PCIe FaceTime Camera"] is True:
|
||||||
required_patches.update({"PCIe FaceTime Camera": all_hardware_patchset["Miscellaneous"]["PCIe FaceTime Camera"]})
|
required_patches.update({"PCIe FaceTime Camera": all_hardware_patchset["Miscellaneous"]["PCIe FaceTime Camera"]})
|
||||||
|
|
||||||
|
if self.hardware_details["Miscellaneous: T1 Security Chip"] is True:
|
||||||
|
required_patches.update({"T1 Security Chip": all_hardware_patchset["Miscellaneous"]["T1 Security Chip"]})
|
||||||
|
|
||||||
if required_patches:
|
if required_patches:
|
||||||
host_os_float = float(f"{self.constants.detected_os}.{self.constants.detected_os_minor}")
|
host_os_float = float(f"{self.constants.detected_os}.{self.constants.detected_os_minor}")
|
||||||
|
|
||||||
|
|||||||
@@ -60,8 +60,8 @@ def seconds_to_readable_time(seconds) -> str:
|
|||||||
seconds = int(seconds)
|
seconds = int(seconds)
|
||||||
time = ""
|
time = ""
|
||||||
|
|
||||||
if seconds == 0:
|
if 0 <= seconds < 60:
|
||||||
return "0m "
|
return "Less than a minute "
|
||||||
if seconds < 0:
|
if seconds < 0:
|
||||||
return "Indeterminate time "
|
return "Indeterminate time "
|
||||||
|
|
||||||
@@ -553,6 +553,33 @@ def elevated(*args, **kwargs) -> subprocess.CompletedProcess:
|
|||||||
return subprocess.run(["sudo"] + [args[0][0]] + args[0][1:], **kwargs)
|
return subprocess.run(["sudo"] + [args[0][0]] + args[0][1:], **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_staged_update(variant: str = "Update") -> (str, str):
|
||||||
|
"""
|
||||||
|
Check for staged macOS update
|
||||||
|
Supported variants:
|
||||||
|
- Preflight
|
||||||
|
- Update
|
||||||
|
"""
|
||||||
|
|
||||||
|
os_build = None
|
||||||
|
os_version = None
|
||||||
|
|
||||||
|
update_config = f"/System/Volumes/Update/{variant}.plist"
|
||||||
|
if not Path(update_config).exists():
|
||||||
|
return (None, None)
|
||||||
|
try:
|
||||||
|
update_staged = plistlib.load(open(update_config, "rb"))
|
||||||
|
except:
|
||||||
|
return (None, None)
|
||||||
|
if "update-asset-attributes" not in update_staged:
|
||||||
|
return (None, None)
|
||||||
|
|
||||||
|
os_build = update_staged["update-asset-attributes"]["Build"]
|
||||||
|
os_version = update_staged["update-asset-attributes"]["OSVersion"]
|
||||||
|
|
||||||
|
return os_version, os_build
|
||||||
|
|
||||||
|
|
||||||
def check_cli_args():
|
def check_cli_args():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--build", help="Build OpenCore", action="store_true", required=False)
|
parser.add_argument("--build", help="Build OpenCore", action="store_true", required=False)
|
||||||
@@ -580,6 +607,8 @@ def check_cli_args():
|
|||||||
# sys_patch args
|
# sys_patch args
|
||||||
parser.add_argument("--patch_sys_vol", help="Patches root volume", action="store_true", required=False)
|
parser.add_argument("--patch_sys_vol", help="Patches root volume", action="store_true", required=False)
|
||||||
parser.add_argument("--unpatch_sys_vol", help="Unpatches root volume, EXPERIMENTAL", action="store_true", required=False)
|
parser.add_argument("--unpatch_sys_vol", help="Unpatches root volume, EXPERIMENTAL", action="store_true", required=False)
|
||||||
|
parser.add_argument("--prepare_for_update", help="Prepares host for macOS update, ex. clean /Library/Extensions", action="store_true", required=False)
|
||||||
|
parser.add_argument("--cache_os", help="Caches patcher files (ex. KDKs) for incoming OS in Preflight.plist", action="store_true", required=False)
|
||||||
|
|
||||||
# validation args
|
# validation args
|
||||||
parser.add_argument("--validate", help="Runs Validation Tests for CI", action="store_true", required=False)
|
parser.add_argument("--validate", help="Runs Validation Tests for CI", action="store_true", required=False)
|
||||||
@@ -591,7 +620,15 @@ def check_cli_args():
|
|||||||
parser.add_argument("--update_installed", help="Prompt user to finish updating via GUI", action="store_true", required=False)
|
parser.add_argument("--update_installed", help="Prompt user to finish updating via GUI", action="store_true", required=False)
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
if not (args.build or args.patch_sys_vol or args.unpatch_sys_vol or args.validate or args.auto_patch):
|
if not (
|
||||||
|
args.build or
|
||||||
|
args.patch_sys_vol or
|
||||||
|
args.unpatch_sys_vol or
|
||||||
|
args.validate or
|
||||||
|
args.auto_patch or
|
||||||
|
args.prepare_for_update or
|
||||||
|
args.cache_os
|
||||||
|
):
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return args
|
return args
|
||||||
|
|||||||
191
resources/wx_gui/gui_cache_os_update.py
Normal file
191
resources/wx_gui/gui_cache_os_update.py
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
"""
|
||||||
|
UI to display to users before a macOS update is applied
|
||||||
|
Primarily for caching updates required for incoming OS (ex. KDKs)
|
||||||
|
"""
|
||||||
|
|
||||||
|
import wx
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import logging
|
||||||
|
import threading
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from resources import constants, kdk_handler, utilities
|
||||||
|
from resources.wx_gui import gui_support, gui_download
|
||||||
|
|
||||||
|
|
||||||
|
class OSUpdateFrame(wx.Frame):
|
||||||
|
"""
|
||||||
|
Create a modal frame for displaying information to the user before an update is applied
|
||||||
|
"""
|
||||||
|
def __init__(self, parent: wx.Frame, title: str, global_constants: constants.Constants, screen_location: tuple = None):
|
||||||
|
logging.info("Initializing Prepare Update Frame")
|
||||||
|
|
||||||
|
if parent:
|
||||||
|
self.frame = parent
|
||||||
|
else:
|
||||||
|
super().__init__(parent, title=title, size=(360, 140), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX)
|
||||||
|
self.frame = self
|
||||||
|
self.frame.Centre()
|
||||||
|
|
||||||
|
self.title = title
|
||||||
|
self.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
|
os_data = utilities.fetch_staged_update(variant="Preflight")
|
||||||
|
if os_data[0] is None:
|
||||||
|
logging.info("No staged update found")
|
||||||
|
self._exit()
|
||||||
|
logging.info(f"Staged update found: {os_data[0]} ({os_data[1]})")
|
||||||
|
self.os_data = os_data
|
||||||
|
|
||||||
|
self._generate_ui()
|
||||||
|
|
||||||
|
self.kdk_obj: kdk_handler.KernelDebugKitObject = None
|
||||||
|
def _kdk_thread_spawn():
|
||||||
|
self.kdk_obj = kdk_handler.KernelDebugKitObject(self.constants, self.os_data[1], self.os_data[0], passive=True, check_backups_only=True)
|
||||||
|
|
||||||
|
kdk_thread = threading.Thread(target=_kdk_thread_spawn)
|
||||||
|
kdk_thread.start()
|
||||||
|
|
||||||
|
while kdk_thread.is_alive():
|
||||||
|
wx.Yield()
|
||||||
|
|
||||||
|
if self.kdk_obj.success is False:
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
kdk_download_obj = self.kdk_obj.retrieve_download()
|
||||||
|
if not kdk_download_obj:
|
||||||
|
# KDK is already downloaded
|
||||||
|
# Return false since we didn't display anything
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
self.kdk_download_obj = kdk_download_obj
|
||||||
|
|
||||||
|
self.frame.Show()
|
||||||
|
|
||||||
|
self.did_cancel = -1
|
||||||
|
self._notifyUser()
|
||||||
|
|
||||||
|
# Allow 10 seconds for the user to cancel the download
|
||||||
|
# If nothing, continue
|
||||||
|
for i in range(0, 10):
|
||||||
|
if self.did_cancel == 1:
|
||||||
|
self._exit()
|
||||||
|
if self.did_cancel == -1:
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
gui_download.DownloadFrame(
|
||||||
|
self,
|
||||||
|
title=self.title,
|
||||||
|
global_constants=self.constants,
|
||||||
|
download_obj=kdk_download_obj,
|
||||||
|
item_name=f"KDK Build {self.kdk_obj.kdk_url_build}"
|
||||||
|
)
|
||||||
|
if kdk_download_obj.download_complete is False:
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
logging.info("KDK download complete, validating with hdiutil")
|
||||||
|
self.kdk_checksum_result = False
|
||||||
|
def _validate_kdk_checksum_thread():
|
||||||
|
self.kdk_checksum_result = self.kdk_obj.validate_kdk_checksum()
|
||||||
|
|
||||||
|
kdk_checksum_thread = threading.Thread(target=_validate_kdk_checksum_thread)
|
||||||
|
kdk_checksum_thread.start()
|
||||||
|
|
||||||
|
while kdk_checksum_thread.is_alive():
|
||||||
|
wx.Yield()
|
||||||
|
|
||||||
|
if self.kdk_checksum_result is False:
|
||||||
|
logging.error("KDK checksum validation failed")
|
||||||
|
logging.error(self.kdk_obj.error_msg)
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
logging.info("KDK checksum validation passed")
|
||||||
|
|
||||||
|
logging.info("Mounting KDK")
|
||||||
|
if not Path(self.constants.kdk_download_path).exists():
|
||||||
|
logging.error("KDK download path does not exist")
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
self.kdk_install_result = False
|
||||||
|
def _install_kdk_thread():
|
||||||
|
self.kdk_install_result = kdk_handler.KernelDebugKitUtilities().install_kdk_dmg(self.constants.kdk_download_path, only_install_backup=True)
|
||||||
|
|
||||||
|
kdk_install_thread = threading.Thread(target=_install_kdk_thread)
|
||||||
|
kdk_install_thread.start()
|
||||||
|
|
||||||
|
while kdk_install_thread.is_alive():
|
||||||
|
wx.Yield()
|
||||||
|
|
||||||
|
if self.kdk_install_result is False:
|
||||||
|
logging.info("Failed to install KDK")
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
logging.info("KDK installed successfully")
|
||||||
|
self._exit()
|
||||||
|
|
||||||
|
|
||||||
|
def _generate_ui(self) -> None:
|
||||||
|
"""
|
||||||
|
Display frame
|
||||||
|
|
||||||
|
|
||||||
|
Title: OpenCore Legacy Patcher is preparing to update your system
|
||||||
|
Body: Please wait while we prepare your system for the update.
|
||||||
|
This may take a few minutes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
header = wx.StaticText(self.frame, label="Preparing for macOS Software Update", pos=(-1,5))
|
||||||
|
header.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
||||||
|
header.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
|
# list OS
|
||||||
|
label = wx.StaticText(self.frame, label=f"macOS {self.os_data[0]} ({self.os_data[1]})", pos=(-1, 35))
|
||||||
|
label.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
||||||
|
label.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
|
# this may take a few minutes
|
||||||
|
label = wx.StaticText(self.frame, label="This may take a few minutes.", pos=(-1, 55))
|
||||||
|
label.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
||||||
|
label.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
|
# Add a progress bar
|
||||||
|
self.progress_bar = wx.Gauge(self.frame, range=100, pos=(10, 75), size=(340, 20))
|
||||||
|
self.progress_bar.SetValue(0)
|
||||||
|
self.progress_bar.Pulse()
|
||||||
|
|
||||||
|
# Set frame size below progress bar
|
||||||
|
self.frame.SetSize((360, 140))
|
||||||
|
|
||||||
|
|
||||||
|
def _notifyUser(self) -> None:
|
||||||
|
"""
|
||||||
|
Notify user of what OCLP is doing
|
||||||
|
Note will be spawned through wx.CallAfter
|
||||||
|
"""
|
||||||
|
threading.Thread(target=self._notifyUserThread).start()
|
||||||
|
|
||||||
|
|
||||||
|
def _notifyUserThread(self) -> None:
|
||||||
|
"""
|
||||||
|
Notify user of what OCLP is doing
|
||||||
|
"""
|
||||||
|
message=f"OpenCore Legacy Patcher has detected that a macOS update is being downloaded:\n{self.os_data[0]} ({self.os_data[1]})\n\nThe patcher needs to prepare the system for the update, and will download any additional resources it may need post-update.\n\nThis may take a few minutes, the patcher will exit when it is done."
|
||||||
|
# Yes/No for caching
|
||||||
|
dlg = wx.MessageDialog(self.frame, message=message, caption="OpenCore Legacy Patcher", style=wx.YES_NO | wx.ICON_INFORMATION)
|
||||||
|
dlg.SetYesNoLabels("&Ok", "&Cancel")
|
||||||
|
result = dlg.ShowModal()
|
||||||
|
if result == wx.ID_NO:
|
||||||
|
logging.info("User cancelled OS caching")
|
||||||
|
self.kdk_download_obj.stop()
|
||||||
|
self.did_cancel = 1
|
||||||
|
else:
|
||||||
|
self.did_cancel = 0
|
||||||
|
|
||||||
|
def _exit(self):
|
||||||
|
"""
|
||||||
|
Exit the frame
|
||||||
|
"""
|
||||||
|
self.frame.Close()
|
||||||
|
sys.exit()
|
||||||
@@ -50,7 +50,7 @@ class DownloadFrame(wx.Frame):
|
|||||||
title_label.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
title_label.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
||||||
title_label.Centre(wx.HORIZONTAL)
|
title_label.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
progress_bar = wx.Gauge(frame, range=100, pos=(-1, title_label.GetPosition()[1] + title_label.GetSize()[1] + 5), size=(300, 20))
|
progress_bar = wx.Gauge(frame, range=100, pos=(-1, title_label.GetPosition()[1] + title_label.GetSize()[1] + 5), size=(300, 20), style=wx.GA_SMOOTH|wx.GA_PROGRESS)
|
||||||
progress_bar.Centre(wx.HORIZONTAL)
|
progress_bar.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
label_amount = wx.StaticText(frame, label="Preparing download", pos=(-1, progress_bar.GetPosition()[1] + progress_bar.GetSize()[1]))
|
label_amount = wx.StaticText(frame, label="Preparing download", pos=(-1, progress_bar.GetPosition()[1] + progress_bar.GetSize()[1]))
|
||||||
@@ -68,7 +68,9 @@ class DownloadFrame(wx.Frame):
|
|||||||
self.download_obj.download()
|
self.download_obj.download()
|
||||||
while self.download_obj.is_active():
|
while self.download_obj.is_active():
|
||||||
|
|
||||||
percentage: int = self.download_obj.get_percent()
|
percentage: int = round(self.download_obj.get_percent())
|
||||||
|
if percentage == 0:
|
||||||
|
percentage = 1
|
||||||
|
|
||||||
if percentage == -1:
|
if percentage == -1:
|
||||||
amount_str = f"{utilities.human_fmt(self.download_obj.downloaded_file_size)} downloaded ({utilities.human_fmt(self.download_obj.get_speed())}/s)"
|
amount_str = f"{utilities.human_fmt(self.download_obj.downloaded_file_size)} downloaded ({utilities.human_fmt(self.download_obj.get_speed())}/s)"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import logging
|
|||||||
|
|
||||||
from resources import constants
|
from resources import constants
|
||||||
from resources.wx_gui import (
|
from resources.wx_gui import (
|
||||||
|
gui_cache_os_update,
|
||||||
gui_main_menu,
|
gui_main_menu,
|
||||||
gui_build,
|
gui_build,
|
||||||
gui_install_oc,
|
gui_install_oc,
|
||||||
@@ -24,6 +25,7 @@ class SupportedEntryPoints:
|
|||||||
INSTALL_OC = gui_install_oc.InstallOCFrame
|
INSTALL_OC = gui_install_oc.InstallOCFrame
|
||||||
SYS_PATCH = gui_sys_patch_start.SysPatchStartFrame
|
SYS_PATCH = gui_sys_patch_start.SysPatchStartFrame
|
||||||
UPDATE_APP = gui_update.UpdateFrame
|
UPDATE_APP = gui_update.UpdateFrame
|
||||||
|
OS_CACHE = gui_cache_os_update.OSUpdateFrame
|
||||||
|
|
||||||
|
|
||||||
class EntryPoint:
|
class EntryPoint:
|
||||||
@@ -58,7 +60,7 @@ class EntryPoint:
|
|||||||
|
|
||||||
self.frame: wx.Frame = entry(
|
self.frame: wx.Frame = entry(
|
||||||
None,
|
None,
|
||||||
title=f"{self.constants.patcher_name} ({self.constants.patcher_version})",
|
title=f"{self.constants.patcher_name} {self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}",
|
||||||
global_constants=self.constants,
|
global_constants=self.constants,
|
||||||
screen_location=None,
|
screen_location=None,
|
||||||
**({"patches": patches} if "--gui_patch" in sys.argv or "--gui_unpatch" in sys.argv else {})
|
**({"patches": patches} if "--gui_patch" in sys.argv or "--gui_unpatch" in sys.argv else {})
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
# Generate GUI for main menu
|
# Generate GUI for main menu
|
||||||
|
# Portions of this file Copyright (c) 2023 Jazzzny
|
||||||
|
|
||||||
import wx
|
import wx
|
||||||
|
import wx.html2
|
||||||
|
import markdown2
|
||||||
|
import requests
|
||||||
import sys
|
import sys
|
||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
@@ -65,7 +70,7 @@ class MainFrame(wx.Frame):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Title label: OpenCore Legacy Patcher v{X.Y.Z}
|
# Title label: OpenCore Legacy Patcher v{X.Y.Z}
|
||||||
title_label = wx.StaticText(self, label=f"OpenCore Legacy Patcher {'' if self.constants.special_build else 'v'}{self.constants.patcher_version}", pos=(-1, 10))
|
title_label = wx.StaticText(self, label=f"OpenCore Legacy Patcher {'' if self.constants.special_build else ''}{self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}", pos=(-1, 10))
|
||||||
title_label.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
title_label.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
||||||
title_label.Centre(wx.HORIZONTAL)
|
title_label.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
@@ -285,20 +290,8 @@ class MainFrame(wx.Frame):
|
|||||||
|
|
||||||
version = dict["Version"]
|
version = dict["Version"]
|
||||||
logging.info(f"New version: {version}")
|
logging.info(f"New version: {version}")
|
||||||
dialog = wx.MessageDialog(
|
|
||||||
parent=self,
|
|
||||||
message=f"Current Version: {self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}\nNew version: {version}\nWould you like to update?",
|
|
||||||
caption="Update Available for OpenCore Legacy Patcher!",
|
|
||||||
style=wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION
|
|
||||||
)
|
|
||||||
dialog.SetYesNoCancelLabels("Download and install", "Ignore", "View on Github")
|
|
||||||
response = dialog.ShowModal()
|
|
||||||
|
|
||||||
if response == wx.ID_YES:
|
|
||||||
wx.CallAfter(self.on_update, dict["Link"], version)
|
|
||||||
elif response == wx.ID_CANCEL:
|
|
||||||
webbrowser.open(dict["Github Link"])
|
|
||||||
|
|
||||||
|
wx.CallAfter(self.on_update, dict["Link"], version, dict["Github Link"])
|
||||||
|
|
||||||
def on_build_and_install(self, event: wx.Event = None):
|
def on_build_and_install(self, event: wx.Event = None):
|
||||||
self.Hide()
|
self.Hide()
|
||||||
@@ -345,7 +338,86 @@ class MainFrame(wx.Frame):
|
|||||||
screen_location=self.GetPosition()
|
screen_location=self.GetPosition()
|
||||||
)
|
)
|
||||||
|
|
||||||
def on_update(self, oclp_url: str, oclp_version: str):
|
def on_update(self, oclp_url: str, oclp_version: str, oclp_github_url: str):
|
||||||
|
|
||||||
|
ID_GITHUB = wx.NewId()
|
||||||
|
ID_UPDATE = wx.NewId()
|
||||||
|
|
||||||
|
url = "https://api.github.com/repos/dortania/OpenCore-Legacy-Patcher/releases/latest"
|
||||||
|
response = requests.get(url).json()
|
||||||
|
try:
|
||||||
|
changelog = response["body"].split("## Asset Information")[0]
|
||||||
|
except: #if user constantly checks for updates, github will rate limit them
|
||||||
|
changelog = """## Unable to fetch changelog
|
||||||
|
|
||||||
|
Please check the Github page for more information about this release."""
|
||||||
|
|
||||||
|
html_markdown = markdown2.markdown(changelog)
|
||||||
|
html_css = """
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 20px;
|
||||||
|
background-color: rgb(238,238,238);
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
line-height: 0.5;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
color: -apple-system-control-accent;
|
||||||
|
}
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body {
|
||||||
|
color: #fff;
|
||||||
|
background-color: rgb(47,47,47);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
"""
|
||||||
|
frame = wx.Dialog(None, -1, title="", size=(650, 500))
|
||||||
|
frame.SetMinSize((650, 500))
|
||||||
|
frame.SetWindowStyle(wx.STAY_ON_TOP)
|
||||||
|
panel = wx.Panel(frame)
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
sizer.AddSpacer(10)
|
||||||
|
self.title_text = wx.StaticText(panel, label="A new version of OpenCore Legacy Patcher is available!")
|
||||||
|
self.description = wx.StaticText(panel, label=f"OpenCore Legacy Patcher {oclp_version} is now available - You have {self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}. Would you like to update?")
|
||||||
|
self.title_text.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
||||||
|
self.description.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
||||||
|
self.web_view = wx.html2.WebView.New(panel, style=wx.BORDER_SUNKEN)
|
||||||
|
html_code = html_css+html_markdown.replace("<a href=", "<a target='_blank' href=")
|
||||||
|
self.web_view.SetPage(html_code, "")
|
||||||
|
self.web_view.Bind(wx.html2.EVT_WEBVIEW_NEWWINDOW, self._onWebviewNav)
|
||||||
|
self.web_view.EnableContextMenu(False)
|
||||||
|
self.close_button = wx.Button(panel, label="Dismiss")
|
||||||
|
self.close_button.Bind(wx.EVT_BUTTON, lambda event: frame.EndModal(wx.ID_CANCEL))
|
||||||
|
self.view_button = wx.Button(panel, ID_GITHUB, label="View on GitHub")
|
||||||
|
self.view_button.Bind(wx.EVT_BUTTON, lambda event: frame.EndModal(ID_GITHUB))
|
||||||
|
self.install_button = wx.Button(panel, label="Download and Install")
|
||||||
|
self.install_button.Bind(wx.EVT_BUTTON, lambda event: frame.EndModal(ID_UPDATE))
|
||||||
|
self.install_button.SetDefault()
|
||||||
|
|
||||||
|
buttonsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
buttonsizer.Add(self.close_button, 0, wx.ALIGN_CENTRE | wx.RIGHT, 5)
|
||||||
|
buttonsizer.Add(self.view_button, 0, wx.ALIGN_CENTRE | wx.LEFT|wx.RIGHT, 5)
|
||||||
|
buttonsizer.Add(self.install_button, 0, wx.ALIGN_CENTRE | wx.LEFT, 5)
|
||||||
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
sizer.Add(self.title_text, 0, wx.ALIGN_CENTRE | wx.TOP, 20)
|
||||||
|
sizer.Add(self.description, 0, wx.ALIGN_CENTRE | wx.BOTTOM, 20)
|
||||||
|
sizer.Add(self.web_view, 1, wx.EXPAND | wx.LEFT|wx.RIGHT, 10)
|
||||||
|
sizer.Add(buttonsizer, 0, wx.ALIGN_RIGHT | wx.ALL, 20)
|
||||||
|
panel.SetSizer(sizer)
|
||||||
|
frame.Centre()
|
||||||
|
|
||||||
|
result = frame.ShowModal()
|
||||||
|
|
||||||
|
|
||||||
|
if result == ID_GITHUB:
|
||||||
|
webbrowser.open(oclp_github_url)
|
||||||
|
elif result == ID_UPDATE:
|
||||||
gui_update.UpdateFrame(
|
gui_update.UpdateFrame(
|
||||||
parent=self,
|
parent=self,
|
||||||
title=self.title,
|
title=self.title,
|
||||||
@@ -354,3 +426,9 @@ class MainFrame(wx.Frame):
|
|||||||
url=oclp_url,
|
url=oclp_url,
|
||||||
version_label=oclp_version
|
version_label=oclp_version
|
||||||
)
|
)
|
||||||
|
|
||||||
|
frame.Destroy()
|
||||||
|
|
||||||
|
def _onWebviewNav(self, event):
|
||||||
|
url = event.GetURL()
|
||||||
|
webbrowser.open(url)
|
||||||
@@ -277,16 +277,16 @@ class SettingsFrame(wx.Frame):
|
|||||||
"wrap_around 2": {
|
"wrap_around 2": {
|
||||||
"type": "wrap_around",
|
"type": "wrap_around",
|
||||||
},
|
},
|
||||||
"APFS Trim": {
|
"OpenCore Vaulting": {
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"value": self.constants.apfs_trim_timeout,
|
"value": self.constants.vault,
|
||||||
"variable": "apfs_trim_timeout",
|
"variable": "vault",
|
||||||
"description": [
|
"description": [
|
||||||
"Recommended for all users, however faulty",
|
"Digitally sign OpenCore to prevent",
|
||||||
"SSDs may benefit from disabling this.",
|
"tampering or corruption."
|
||||||
],
|
],
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
"Show OpenCore Boot Picker": {
|
"Show OpenCore Boot Picker": {
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"value": self.constants.showpicker,
|
"value": self.constants.showpicker,
|
||||||
@@ -443,6 +443,16 @@ class SettingsFrame(wx.Frame):
|
|||||||
],
|
],
|
||||||
"condition": not bool(self.constants.computer.third_party_sata_ssd is False and not self.constants.custom_model)
|
"condition": not bool(self.constants.computer.third_party_sata_ssd is False and not self.constants.custom_model)
|
||||||
},
|
},
|
||||||
|
"APFS Trim": {
|
||||||
|
"type": "checkbox",
|
||||||
|
"value": self.constants.apfs_trim_timeout,
|
||||||
|
"variable": "apfs_trim_timeout",
|
||||||
|
"description": [
|
||||||
|
"Recommended for all users, however faulty",
|
||||||
|
"SSDs may benefit from disabling this.",
|
||||||
|
],
|
||||||
|
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"Advanced": {
|
"Advanced": {
|
||||||
"Miscellaneous": {
|
"Miscellaneous": {
|
||||||
@@ -745,6 +755,16 @@ class SettingsFrame(wx.Frame):
|
|||||||
"override_function": self._update_system_defaults,
|
"override_function": self._update_system_defaults,
|
||||||
"condition": gui_support.CheckProperties(self.constants).host_is_non_metal(general_check=True)
|
"condition": gui_support.CheckProperties(self.constants).host_is_non_metal(general_check=True)
|
||||||
},
|
},
|
||||||
|
"Disable Color Widgets Enforcement": {
|
||||||
|
"type": "checkbox",
|
||||||
|
"value": self._get_system_settings("Moraea_ColorWidgetDisabled"),
|
||||||
|
"variable": "Moraea_ColorWidgetDisabled",
|
||||||
|
"description": [
|
||||||
|
"Control Color Desktop Widgets Enforcement.",
|
||||||
|
],
|
||||||
|
"override_function": self._update_system_defaults,
|
||||||
|
"condition": gui_support.CheckProperties(self.constants).host_is_non_metal(general_check=True)
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"App": {
|
"App": {
|
||||||
"General": {
|
"General": {
|
||||||
@@ -836,6 +856,7 @@ class SettingsFrame(wx.Frame):
|
|||||||
"Export constants.py values to a txt file.",
|
"Export constants.py values to a txt file.",
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
"Developer Root Volume Patching": {
|
"Developer Root Volume Patching": {
|
||||||
"type": "title",
|
"type": "title",
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user