mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-04-24 03:50:14 +10:00
Merge branch 'dortania:main' into main
This commit is contained in:
6
.github/workflows/build-app-wxpython.yml
vendored
6
.github/workflows/build-app-wxpython.yml
vendored
@@ -11,9 +11,9 @@ jobs:
|
|||||||
name: Build wxPython
|
name: Build wxPython
|
||||||
runs-on: x86_64_mojave
|
runs-on: x86_64_mojave
|
||||||
env:
|
env:
|
||||||
branch: ${{ github.event.ref }}
|
branch: ${{ github.ref }}
|
||||||
commiturl: ${{ github.event.head_commit.url }}
|
commiturl: ${{ github.event.head_commit.url }}${{ github.event.release.html_url }}
|
||||||
commitdate: ${{ github.event.head_commit.timestamp }}
|
commitdate: ${{ github.event.head_commit.timestamp }}${{ github.event.release.published_at }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- run: /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 Build-Binary.command --reset_binaries --branch "${{ env.branch }}" --commit "${{ env.commiturl }}" --commit_date "${{ env.commitdate }}"
|
- run: /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 Build-Binary.command --reset_binaries --branch "${{ env.branch }}" --commit "${{ env.commiturl }}" --commit_date "${{ env.commitdate }}"
|
||||||
|
|||||||
6
.github/workflows/build-app.yml
vendored
6
.github/workflows/build-app.yml
vendored
@@ -11,9 +11,9 @@ jobs:
|
|||||||
name: Build TUI
|
name: Build TUI
|
||||||
runs-on: x86_64_mojave
|
runs-on: x86_64_mojave
|
||||||
env:
|
env:
|
||||||
branch: ${{ github.event.ref }}
|
branch: ${{ github.ref }}
|
||||||
commiturl: ${{ github.event.head_commit.url }}
|
commiturl: ${{ github.event.head_commit.url }}${{ github.event.release.html_url }}
|
||||||
commitdate: ${{ github.event.head_commit.timestamp }}
|
commitdate: ${{ github.event.head_commit.timestamp }}${{ github.event.release.published_at }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- run: /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 Build-Binary.command --build_tui --reset_binaries --branch "${{ env.branch }}" --commit "${{ env.commiturl }}" --commit_date "${{ env.commitdate }}"
|
- run: /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 Build-Binary.command --build_tui --reset_binaries --branch "${{ env.branch }}" --commit "${{ env.commiturl }}" --commit_date "${{ env.commitdate }}"
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ class create_binary:
|
|||||||
if file.name in delete_files:
|
if file.name in delete_files:
|
||||||
print(f" - Deleting {file.name}")
|
print(f" - Deleting {file.name}")
|
||||||
file.unlink()
|
file.unlink()
|
||||||
|
elif (Path(file) / Path("Contents/Resources/createinstallmedia")).exists():
|
||||||
|
print(f" - Deleting {file}")
|
||||||
|
subprocess.run(["rm", "-rf", file])
|
||||||
|
|
||||||
def download_resources(self):
|
def download_resources(self):
|
||||||
patcher_support_pkg_version = constants.Constants().patcher_support_pkg_version
|
patcher_support_pkg_version = constants.Constants().patcher_support_pkg_version
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
## 0.4.8
|
## 0.4.8
|
||||||
- Ensure Apple Silicon-specific installers are not listed
|
- Ensure Apple Silicon-specific installers are not listed
|
||||||
- ie. M2 specific build (21F2092)
|
- ie. M2 specific build (21F2092)
|
||||||
|
- Avoid adding OpenCore icon in boot picker if Windows bootloader on same partition
|
||||||
|
- Add error-handling to corrupt/non-standard NVRAM variables
|
||||||
|
- Add warning prompt when using 'Allow native models'
|
||||||
|
- Attempt to avoid misuse of option
|
||||||
|
- Work-around `Failed to extract AssetData` during installer creation
|
||||||
|
- Apple bug, resolved by using CoW into a different directory than `/Applications`
|
||||||
|
|
||||||
## 0.4.7
|
## 0.4.7
|
||||||
- Fix crashing on defaults parsing
|
- Fix crashing on defaults parsing
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ import enum
|
|||||||
|
|
||||||
class os_data(enum.IntEnum):
|
class os_data(enum.IntEnum):
|
||||||
# OS Versions, Based off Major Kernel Version
|
# OS Versions, Based off Major Kernel Version
|
||||||
|
cheetah = 4 # Actually 1.3.1
|
||||||
|
puma = 5
|
||||||
|
jaguar = 6
|
||||||
|
panther = 7
|
||||||
tiger = 8
|
tiger = 8
|
||||||
leopard = 9
|
leopard = 9
|
||||||
snow_leopard = 10
|
snow_leopard = 10
|
||||||
@@ -46,3 +50,31 @@ class os_conversion:
|
|||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def convert_kernel_to_marketing_name(kernel):
|
||||||
|
# Convert major XNU version to Marketing Name
|
||||||
|
try:
|
||||||
|
# Find os_data enum name
|
||||||
|
os_name = os_data(kernel).name
|
||||||
|
|
||||||
|
# Remove "_" from the string
|
||||||
|
os_name = os_name.replace("_", " ")
|
||||||
|
|
||||||
|
# Upper case the first letter of each word
|
||||||
|
os_name = os_name.title()
|
||||||
|
except ValueError:
|
||||||
|
# Handle cases where no enum value exists
|
||||||
|
# Pass kernel_to_os() as a substitute for a proper OS name
|
||||||
|
os_name = os_conversion.kernel_to_os(kernel)
|
||||||
|
|
||||||
|
return os_name
|
||||||
|
|
||||||
|
def convert_marketing_name_to_kernel(marketing_name):
|
||||||
|
# Convert Marketing Name to major XNU version
|
||||||
|
try:
|
||||||
|
# Find os_data enum value
|
||||||
|
os_kernel = os_data[marketing_name.lower().replace(" ", "_")]
|
||||||
|
except KeyError:
|
||||||
|
os_kernel = 0
|
||||||
|
|
||||||
|
return int(os_kernel)
|
||||||
@@ -7,6 +7,7 @@ To remove OpenCore is actually quite simply:
|
|||||||
* You'll need to mount the drive's EFI partition, and delete the `EFI/OC` and `System` folders
|
* You'll need to mount the drive's EFI partition, and delete the `EFI/OC` and `System` folders
|
||||||
* Note **do not** delete the entire EFI folder, this will likely break any existing Windows and Linux installations
|
* Note **do not** delete the entire EFI folder, this will likely break any existing Windows and Linux installations
|
||||||
* [See here for an example on how to mount](https://dortania.github.io/OpenCore-Post-Install/universal/oc2hdd.html)
|
* [See here for an example on how to mount](https://dortania.github.io/OpenCore-Post-Install/universal/oc2hdd.html)
|
||||||
|
* For 5k iMac users, you will also need to delete `boot.efi` on the root of the EFI partition
|
||||||
|
|
||||||
2. [Reset NVRAM](https://support.apple.com/HT204063)
|
2. [Reset NVRAM](https://support.apple.com/HT204063)
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class wx_python_gui:
|
|||||||
self.finished_cim_process = False
|
self.finished_cim_process = False
|
||||||
self.target_disk = ""
|
self.target_disk = ""
|
||||||
self.pulse_forward = False
|
self.pulse_forward = False
|
||||||
|
self.prepare_result = False
|
||||||
self.non_metal_required = self.use_non_metal_alternative()
|
self.non_metal_required = self.use_non_metal_alternative()
|
||||||
self.hyperlink_colour = (25, 179, 231)
|
self.hyperlink_colour = (25, 179, 231)
|
||||||
|
|
||||||
@@ -1832,9 +1833,8 @@ class wx_python_gui:
|
|||||||
20
|
20
|
||||||
)
|
)
|
||||||
self.progress_bar.Centre(wx.HORIZONTAL)
|
self.progress_bar.Centre(wx.HORIZONTAL)
|
||||||
self.progress_bar.SetValue(0)
|
|
||||||
|
|
||||||
self.progress_label = wx.StaticText(self.frame, label="Bytes Written: 0")
|
self.progress_label = wx.StaticText(self.frame, label="Preparing files, beginning shortly...")
|
||||||
self.progress_label.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
|
self.progress_label.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
|
||||||
self.progress_label.SetPosition(
|
self.progress_label.SetPosition(
|
||||||
wx.Point(
|
wx.Point(
|
||||||
@@ -1863,7 +1863,18 @@ class wx_python_gui:
|
|||||||
print("- Creating installer.sh script")
|
print("- Creating installer.sh script")
|
||||||
print(f"- Disk: {disk}")
|
print(f"- Disk: {disk}")
|
||||||
print(f"- Installer: {installer_path}")
|
print(f"- Installer: {installer_path}")
|
||||||
if installer.generate_installer_creation_script(self.constants.installer_sh_path, installer_path, disk):
|
|
||||||
|
self.prepare_script_thread = threading.Thread(target=self.prepare_script, args=(installer_path,disk))
|
||||||
|
self.prepare_script_thread.start()
|
||||||
|
self.progress_bar.Pulse()
|
||||||
|
|
||||||
|
while self.prepare_script_thread.is_alive():
|
||||||
|
self.pulse_alternative(self.progress_bar)
|
||||||
|
wx.GetApp().Yield()
|
||||||
|
|
||||||
|
if self.prepare_result is True:
|
||||||
|
self.progress_label.SetLabel("Bytes Written: 0")
|
||||||
|
self.progress_label.Centre(wx.HORIZONTAL)
|
||||||
print("- Sucessfully generated creation script")
|
print("- Sucessfully generated creation script")
|
||||||
print("- Starting creation script as admin")
|
print("- Starting creation script as admin")
|
||||||
wx.GetApp().Yield()
|
wx.GetApp().Yield()
|
||||||
@@ -1875,6 +1886,7 @@ class wx_python_gui:
|
|||||||
self.download_thread = threading.Thread(target=self.download_and_unzip_pkg)
|
self.download_thread = threading.Thread(target=self.download_and_unzip_pkg)
|
||||||
self.download_thread.start()
|
self.download_thread.start()
|
||||||
default_output = float(utilities.monitor_disk_output(disk))
|
default_output = float(utilities.monitor_disk_output(disk))
|
||||||
|
self.progress_bar.SetValue(0)
|
||||||
while True:
|
while True:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
output = float(utilities.monitor_disk_output(disk))
|
output = float(utilities.monitor_disk_output(disk))
|
||||||
@@ -1918,8 +1930,15 @@ class wx_python_gui:
|
|||||||
self.build_install_menu()
|
self.build_install_menu()
|
||||||
else:
|
else:
|
||||||
print("- Failed to create installer script")
|
print("- Failed to create installer script")
|
||||||
|
self.progress_label.SetLabel("Failed to copy files to tmp directory")
|
||||||
|
self.progress_label.Centre(wx.HORIZONTAL)
|
||||||
|
popup_message = wx.MessageDialog(self.frame, "Failed to prepare the base files for installer creation.\n\nPlease ensure you have 20GB~ free on-disk before starting to ensure the installer has enough room to work.", "Error", wx.OK)
|
||||||
|
popup_message.ShowModal()
|
||||||
self.return_to_main_menu.Enable()
|
self.return_to_main_menu.Enable()
|
||||||
|
|
||||||
|
def prepare_script(self, installer_path, disk):
|
||||||
|
self.prepare_result = installer.generate_installer_creation_script(self.constants.payload_path, installer_path, disk)
|
||||||
|
|
||||||
def start_script(self):
|
def start_script(self):
|
||||||
utilities.disable_sleep_while_running()
|
utilities.disable_sleep_while_running()
|
||||||
args = [self.constants.oclp_helper_path, "/bin/sh", self.constants.installer_sh_path]
|
args = [self.constants.oclp_helper_path, "/bin/sh", self.constants.installer_sh_path]
|
||||||
@@ -2175,6 +2194,21 @@ class wx_python_gui:
|
|||||||
|
|
||||||
def allow_native_models_click(self, event=None):
|
def allow_native_models_click(self, event=None):
|
||||||
if self.checkbox_allow_native_models.GetValue():
|
if self.checkbox_allow_native_models.GetValue():
|
||||||
|
# Throw a prompt warning about this
|
||||||
|
dlg = wx.MessageDialog(self.frame_modal, "This option should only be used if your Mac natively supports the OSes you wish to run.\n\nIf you are currently running an unsupported OS, this option will break booting. Only toggle for enabling OS features on a native Mac.\n\nAre you sure you want to continue?", "Warning", wx.YES_NO | wx.ICON_WARNING)
|
||||||
|
if dlg.ShowModal() == wx.ID_NO:
|
||||||
|
self.checkbox_allow_native_models.SetValue(False)
|
||||||
|
return
|
||||||
|
# If the system is running an unsupported OS, throw a second warning
|
||||||
|
if self.constants.computer.real_model in smbios_data.smbios_dictionary:
|
||||||
|
if self.constants.detected_os > smbios_data.smbios_dictionary[self.constants.computer.real_model]["Max OS Supported"]:
|
||||||
|
chassis_type = "aluminum"
|
||||||
|
if self.constants.computer.real_model in ["MacBook4,1", "MacBook5,2", "MacBook6,1", "MacBook7,1"]:
|
||||||
|
chassis_type = "plastic"
|
||||||
|
dlg = wx.MessageDialog(self.frame_modal, f"This model, {self.constants.computer.real_model}, does not natively support macOS {os_data.os_conversion.kernel_to_os(self.constants.detected_os)}, {os_data.os_conversion.convert_kernel_to_marketing_name(self.constants.detected_os)}. The last native OS was macOS {os_data.os_conversion.kernel_to_os(smbios_data.smbios_dictionary[self.constants.computer.real_model]['Max OS Supported'])}, {os_data.os_conversion.convert_kernel_to_marketing_name(smbios_data.smbios_dictionary[self.constants.computer.real_model]['Max OS Supported'])}\n\nToggling this option will breaking booting on this OS. Are you absolutely certain this is desired?\n\nYou may end up with a nice {chassis_type} brick 🧱", "Are you certain?", wx.YES_NO | wx.ICON_WARNING)
|
||||||
|
if dlg.ShowModal() == wx.ID_NO:
|
||||||
|
self.checkbox_allow_native_models.SetValue(False)
|
||||||
|
return
|
||||||
print("Allow Native Models")
|
print("Allow Native Models")
|
||||||
self.constants.allow_oc_everywhere = True
|
self.constants.allow_oc_everywhere = True
|
||||||
self.constants.serial_settings = "None"
|
self.constants.serial_settings = "None"
|
||||||
@@ -2745,6 +2779,10 @@ class wx_python_gui:
|
|||||||
self.constants.custom_board_serial_number = self.smbios_board_serial_textbox.GetValue()
|
self.constants.custom_board_serial_number = self.smbios_board_serial_textbox.GetValue()
|
||||||
|
|
||||||
def generate_new_serials_clicked(self, event):
|
def generate_new_serials_clicked(self, event):
|
||||||
|
# Throw pop up warning about misusing this feature
|
||||||
|
dlg = wx.MessageDialog(self.frame_modal, "Please take caution when using serial spoofing. This should only be used on machines that were legally obtained and require reserialization.\n\nNote: new serials are only overlayed through OpenCore and are not permanently installed into ROM.\n\nMisuse of this setting can break power management and other aspects of the OS if the system does not need spoofing\n\nDortania does not condone the use of our software on stolen devices.", "Warning", wx.YES_NO | wx.ICON_WARNING)
|
||||||
|
if dlg.ShowModal() == wx.ID_NO:
|
||||||
|
return
|
||||||
macserial_output = subprocess.run([self.constants.macserial_path] + f"-g -m {self.constants.custom_model or self.computer.real_model} -n 1".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
macserial_output = subprocess.run([self.constants.macserial_path] + f"-g -m {self.constants.custom_model or self.computer.real_model} -n 1".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
macserial_output = macserial_output.stdout.decode().strip().split(" | ")
|
macserial_output = macserial_output.stdout.decode().strip().split(" | ")
|
||||||
if len(macserial_output) == 2:
|
if len(macserial_output) == 2:
|
||||||
|
|||||||
@@ -1181,6 +1181,8 @@ class BuildOpenCore:
|
|||||||
self.config["UEFI"]["ProtocolOverrides"]["DataHub"] = True
|
self.config["UEFI"]["ProtocolOverrides"]["DataHub"] = True
|
||||||
self.config["PlatformInfo"]["Generic"]["SystemSerialNumber"] = self.constants.custom_serial_number
|
self.config["PlatformInfo"]["Generic"]["SystemSerialNumber"] = self.constants.custom_serial_number
|
||||||
self.config["PlatformInfo"]["Generic"]["MLB"] = self.constants.custom_board_serial_number
|
self.config["PlatformInfo"]["Generic"]["MLB"] = self.constants.custom_board_serial_number
|
||||||
|
self.config["PlatformInfo"]["Generic"]["MaxBIOSVersion"] = False
|
||||||
|
self.config["PlatformInfo"]["Generic"]["SystemProductName"] = self.spoofed_model
|
||||||
self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Spoofed-SN"] = self.constants.custom_serial_number
|
self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Spoofed-SN"] = self.constants.custom_serial_number
|
||||||
self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Spoofed-MLB"] = self.constants.custom_board_serial_number
|
self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Spoofed-MLB"] = self.constants.custom_board_serial_number
|
||||||
|
|
||||||
|
|||||||
@@ -229,6 +229,10 @@ Please build OpenCore first!"""
|
|||||||
Path(mount_path / Path("EFI/BOOT")).mkdir()
|
Path(mount_path / Path("EFI/BOOT")).mkdir()
|
||||||
shutil.move(mount_path / Path("System/Library/CoreServices/boot.efi"), mount_path / Path("EFI/BOOT/BOOTx64.efi"))
|
shutil.move(mount_path / Path("System/Library/CoreServices/boot.efi"), mount_path / Path("EFI/BOOT/BOOTx64.efi"))
|
||||||
shutil.rmtree(mount_path / Path("System"), onerror=rmtree_handler)
|
shutil.rmtree(mount_path / Path("System"), onerror=rmtree_handler)
|
||||||
|
# Due to how OpenCore processes on-volume icons, Windows may appear as OC's icon
|
||||||
|
if (mount_path / Path("EFI/Microsoft")).exists():
|
||||||
|
print("- Windows Boot Loader detected, skipping volume icon")
|
||||||
|
else:
|
||||||
if determine_sd_card(sd_type) is True:
|
if determine_sd_card(sd_type) is True:
|
||||||
print("- Adding SD Card icon")
|
print("- Adding SD Card icon")
|
||||||
shutil.copy(self.constants.icon_path_sd, mount_path)
|
shutil.copy(self.constants.icon_path_sd, mount_path)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from pathlib import Path
|
|||||||
import plistlib
|
import plistlib
|
||||||
import subprocess
|
import subprocess
|
||||||
import requests
|
import requests
|
||||||
|
import tempfile
|
||||||
from resources import utilities, tui_helpers
|
from resources import utilities, tui_helpers
|
||||||
|
|
||||||
def list_local_macOS_installers():
|
def list_local_macOS_installers():
|
||||||
@@ -331,8 +332,10 @@ def list_disk_to_format():
|
|||||||
})
|
})
|
||||||
return list_disks
|
return list_disks
|
||||||
|
|
||||||
|
# Create global tmp directory
|
||||||
|
tmp_dir = tempfile.TemporaryDirectory()
|
||||||
|
|
||||||
def generate_installer_creation_script(script_location, installer_path, disk):
|
def generate_installer_creation_script(tmp_location, installer_path, disk):
|
||||||
# Creates installer.sh to be piped to OCLP-Helper and run as admin
|
# Creates installer.sh to be piped to OCLP-Helper and run as admin
|
||||||
# Goals:
|
# Goals:
|
||||||
# - Format provided disk as HFS+ GPT
|
# - Format provided disk as HFS+ GPT
|
||||||
@@ -341,6 +344,29 @@ def generate_installer_creation_script(script_location, installer_path, disk):
|
|||||||
# OCLP-Helper once to avoid nagging the user about permissions
|
# OCLP-Helper once to avoid nagging the user about permissions
|
||||||
|
|
||||||
additional_args = ""
|
additional_args = ""
|
||||||
|
script_location = Path(tmp_location) / Path("Installer.sh")
|
||||||
|
|
||||||
|
# Due to a bug in createinstallmedia, running from '/Applications' may sometimes error:
|
||||||
|
# 'Failed to extract AssetData/boot/Firmware/Manifests/InstallerBoot/*'
|
||||||
|
# This affects native Macs as well even when manually invoking createinstallmedia
|
||||||
|
|
||||||
|
# To resolve, we'll copy into our temp directory and run from there
|
||||||
|
|
||||||
|
# Create a new tmp directory
|
||||||
|
# Our current one is a disk image, thus CoW will not work
|
||||||
|
global tmp_dir
|
||||||
|
ia_tmp = tmp_dir.name
|
||||||
|
|
||||||
|
print(f"Creating temporary directory at {ia_tmp}")
|
||||||
|
# Delete all files in tmp_dir
|
||||||
|
for file in Path(ia_tmp).glob("*"):
|
||||||
|
subprocess.run(["rm", "-rf", str(file)])
|
||||||
|
|
||||||
|
# Copy installer to tmp (use CoW to avoid extra disk writes)
|
||||||
|
subprocess.run(["cp", "-cR", installer_path, ia_tmp])
|
||||||
|
|
||||||
|
# Adjust installer_path to point to the copied installer
|
||||||
|
installer_path = Path(ia_tmp) / Path(Path(installer_path).name)
|
||||||
|
|
||||||
createinstallmedia_path = str(Path(installer_path) / Path("Contents/Resources/createinstallmedia"))
|
createinstallmedia_path = str(Path(installer_path) / Path("Contents/Resources/createinstallmedia"))
|
||||||
plist_path = str(Path(installer_path) / Path("Contents/Info.plist"))
|
plist_path = str(Path(installer_path) / Path("Contents/Info.plist"))
|
||||||
|
|||||||
@@ -28,10 +28,13 @@ class sys_patch_helpers:
|
|||||||
board_to_patch_hex = bytes.fromhex(board_to_patch.encode('utf-8').hex())
|
board_to_patch_hex = bytes.fromhex(board_to_patch.encode('utf-8').hex())
|
||||||
reported_board_hex = bytes.fromhex(self.constants.computer.reported_board_id.encode('utf-8').hex())
|
reported_board_hex = bytes.fromhex(self.constants.computer.reported_board_id.encode('utf-8').hex())
|
||||||
|
|
||||||
if len(board_to_patch_hex) != len(reported_board_hex):
|
if len(board_to_patch_hex) > len(reported_board_hex):
|
||||||
print(f"- Error: Board ID {self.constants.computer.reported_board_id} is not the same length as {board_to_patch}")
|
# Pad the reported Board ID with zeros to match the length of the board to patch
|
||||||
raise Exception("Host's Board ID is not the same length as the kext's Board ID, cannot patch!!!")
|
reported_board_hex = reported_board_hex + bytes(len(board_to_patch_hex) - len(reported_board_hex))
|
||||||
else:
|
elif len(board_to_patch_hex) < len(reported_board_hex):
|
||||||
|
print(f"- Error: Board ID {self.constants.computer.reported_board_id} is longer than {board_to_patch}")
|
||||||
|
raise Exception("Host's Board ID is longer than the kext's Board ID, cannot patch!!!")
|
||||||
|
|
||||||
path = source_files_path + "/10.13.6/System/Library/Extensions/AppleIntelSNBGraphicsFB.kext/Contents/MacOS/AppleIntelSNBGraphicsFB"
|
path = source_files_path + "/10.13.6/System/Library/Extensions/AppleIntelSNBGraphicsFB.kext/Contents/MacOS/AppleIntelSNBGraphicsFB"
|
||||||
if Path(path).exists():
|
if Path(path).exists():
|
||||||
with open(path, 'rb') as f:
|
with open(path, 'rb') as f:
|
||||||
|
|||||||
@@ -346,7 +346,12 @@ def get_nvram(variable: str, uuid: str = None, *, decode: bool = False):
|
|||||||
|
|
||||||
if decode:
|
if decode:
|
||||||
if isinstance(value, bytes):
|
if isinstance(value, bytes):
|
||||||
|
try:
|
||||||
value = value.strip(b"\0").decode()
|
value = value.strip(b"\0").decode()
|
||||||
|
except UnicodeDecodeError:
|
||||||
|
# Some sceanrios the firmware will throw garbage in
|
||||||
|
# ie. iMac12,2 with FireWire boot-path
|
||||||
|
value = None
|
||||||
elif isinstance(value, str):
|
elif isinstance(value, str):
|
||||||
value = value.strip("\0")
|
value = value.strip("\0")
|
||||||
return value
|
return value
|
||||||
|
|||||||
Reference in New Issue
Block a user