mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
# pylint: disable=undefined-variable,import-error,too-many-boolean-expressions
|
|
#
|
|
# Extract platform data from CCC
|
|
# Copyright (c) 2018 vit9696
|
|
#
|
|
|
|
import struct
|
|
import ida_bytes
|
|
|
|
|
|
def readaddr(ea):
|
|
a = ida_bytes.get_bytes(ea, 8)
|
|
if a == BADADDR:
|
|
return None
|
|
return struct.unpack("L", a)[0]
|
|
|
|
|
|
def readstr(ea, length=256):
|
|
if ea == BADADDR:
|
|
return None
|
|
|
|
string = ""
|
|
while 1:
|
|
c = ida_bytes.get_bytes(ea, 1)
|
|
if c == BADADDR:
|
|
if string == "":
|
|
return None
|
|
return string
|
|
if c == "\0":
|
|
return string
|
|
|
|
string += c
|
|
ea += 1
|
|
if len(string) > length:
|
|
return str
|
|
|
|
|
|
base = get_name_ea(0, "_show")
|
|
count = 0
|
|
print('typedef enum {')
|
|
while 1:
|
|
s = readstr(readaddr(base))
|
|
if s is None:
|
|
break
|
|
info = s.split('-', 1)
|
|
print(f" {info[0].strip().replace(',', '_')}, // {info[1].strip()}")
|
|
base += 8
|
|
count += 1
|
|
|
|
name = get_name(base)
|
|
if name is not None and name != "" and name != "_show":
|
|
break
|
|
print('} AppleModel;')
|
|
print(f'#define APPLE_MODEL_MAX {count}')
|
|
|
|
base = get_name_ea(0, "_ApplePlatformData")
|
|
print('static PLATFORMDATA ApplePlatformData[] = {')
|
|
while 1:
|
|
product_name = readstr(readaddr(base + 0))
|
|
firmware_version = readstr(readaddr(base + 8)) # board version
|
|
board_id = readstr(readaddr(base + 16))
|
|
product_family = readstr(readaddr(base + 24))
|
|
system_version = readstr(readaddr(base + 32)) # bios version
|
|
serial_number = readstr(readaddr(base + 40))
|
|
chassis_asset = readstr(readaddr(base + 48))
|
|
smc_revision = struct.unpack("BBBBBB", ida_bytes.get_bytes(base + 56, 6))
|
|
unknown_value = readaddr(base + 64)
|
|
smc_branch = readstr(readaddr(base + 72))
|
|
smc_platform = readstr(readaddr(base + 80))
|
|
smc_config = readaddr(base + 88)
|
|
|
|
if product_name is None or firmware_version is None or board_id is None or product_family is None or system_version is None or serial_number is None or chassis_asset is None or smc_branch is None or smc_config is None:
|
|
break
|
|
|
|
print(f' {{ "{product_name}", "{firmware_version}", "{board_id}",')
|
|
print(f' "{product_family}", "{system_version}", "{serial_number}", "{chassis_asset}",')
|
|
print(f' {{ 0x{smc_revision[0]:02X}, 0x{smc_revision[1]:02X}, 0x{smc_revision[2]:02X}, 0x{smc_revision[3]:02X}, 0x{smc_revision[4]:02X}, 0x{smc_revision[5]:02X} }}, "{smc_branch}", "{smc_platform}", 0x{smc_config:08X} }},')
|
|
|
|
base += 0x60
|
|
|
|
name = get_name(base)
|
|
if name is not None and name not in ["", "_ApplePlatformData"]:
|
|
break
|
|
print('};')
|
|
|
|
base = get_name_ea(0, "_ModelCode")
|
|
print('static const char *AppleModelCode[] = {')
|
|
while 1:
|
|
s = readstr(readaddr(base))
|
|
if s is None:
|
|
break
|
|
|
|
print(f' "{s}",')
|
|
base += 8
|
|
|
|
name = get_name(base)
|
|
if name not in [None, '', '_ModelCode']:
|
|
break
|
|
print('};')
|