mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-14 00:56:35 +00:00
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
#!/usr/bin/env python
|
|
import sys, os
|
|
from struct import pack as pk, unpack as up
|
|
|
|
def make_standard(exp):
|
|
std = exp[:]
|
|
_, metadata_offset, is_exp = up('<III', exp[:12])
|
|
assert is_exp == 1
|
|
|
|
# Patch the experimental flag to zero.
|
|
std = std[:8] + pk('<I', 0) + std[12:]
|
|
|
|
# Locate the mesosphere content header, patch to be experimental.
|
|
magic, size, code_ofs, content_ofs, num_contents, ver, sup_ver, rev = up('<IIIIIIII', exp[metadata_offset:metadata_offset + 0x20])
|
|
for i in range(num_contents):
|
|
start, size, cnt_type, flag0, flag1, flag2, pad = up('<IIBBBBI', exp[content_ofs + 0x20 * i:content_ofs + 0x20 * i + 0x10])
|
|
if cnt_type == 10: # CONTENT_TYPE_KRN
|
|
assert exp[content_ofs + 0x20 * i + 0x10:content_ofs + 0x20 * i + 0x10 + len(b'mesosphere') + 1] == (b'mesosphere\x00')
|
|
assert flag0 == 0 and flag1 == 0 and flag2 == 0
|
|
std = std[:content_ofs + 0x20 * i] + pk('<IIBBBBI', start, size, cnt_type, flag0 | 0x1, flag1, flag2, pad) + std[content_ofs + 0x20 * i + 0x10:]
|
|
|
|
return std
|
|
|
|
|
|
def main(argc, argv):
|
|
if argc != 3:
|
|
print('Usage: %s input output' % argv[0])
|
|
return 1
|
|
with open(argv[1], 'rb') as f:
|
|
experimental = f.read()
|
|
with open(argv[2], 'wb') as f:
|
|
f.write(make_standard(experimental))
|
|
return 0
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(len(sys.argv), sys.argv))
|