Subversion Repositories freemyipod

Rev

Rev 555 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 555 Rev 929
Line 22... Line 22...
22
#
22
#
23
 
23
 
24
import struct
24
import struct
25
 
25
 
26
def encode(addr, option):
26
def encode(addr, option):
27
    if option == None: return ""
27
    if option == None: return b""
28
    addr = addr + 16
28
    addr = addr + 16
29
    data1 = encode(addr, option[2])
29
    data1 = encode(addr, option[2])
30
    if len(data1) == 0: addr1 = 0
30
    if len(data1) == 0: addr1 = 0
31
    else: addr1 = addr
31
    else: addr1 = addr
32
    addr = addr + len(data1)
32
    addr = addr + len(data1)
33
    data2 = encode(addr, option[3])
33
    data2 = encode(addr, option[3])
34
    if len(data2) == 0: addr2 = 0
34
    if len(data2) == 0: addr2 = 0
35
    else: addr2 = addr
35
    else: addr2 = addr
36
    addr = addr + len(data2)
36
    addr = addr + len(data2)
37
    if type(option[1]).__name__ == "str":
37
    if type(option[1]) == type(b""):
38
        data = option[1] + '\0'
38
        data = option[1] + b"\0"
39
        data = data.ljust((len(data) + 3) & ~3, '\0')
39
        data = data.ljust((len(data) + 3) & ~3, b"\0")
40
    else:
40
    else:
41
        data = ""
41
        data = ""
42
        addr = option[1]
42
        addr = option[1]
43
    return struct.pack("<IIII", addr1, addr2, option[0], addr) + data1 + data2 + data
43
    return struct.pack("<IIII", addr1, addr2, option[0], addr) + data1 + data2 + data
44
    
44
    
45
 
45
 
46
def configure(binary, options):
46
def configure(binary, options):
47
    fileaddr =  binary.index("emCOboot")
47
    fileaddr =  binary.index(b"emCOboot")
48
    version = struct.unpack("<I", binary[fileaddr + 8 : fileaddr + 12])[0]
48
    version = struct.unpack("<I", binary[fileaddr + 8 : fileaddr + 12])[0]
49
    if version != 1: raise ValueError("Unknown boot configuration data version")
49
    if version != 1: raise ValueError("Unknown boot configuration data version")
50
    memaddr = struct.unpack("<I", binary[fileaddr + 12 : fileaddr + 16])[0]
50
    memaddr = struct.unpack("<I", binary[fileaddr + 12 : fileaddr + 16])[0]
51
    data = encode(memaddr + 24, options)
51
    data = encode(memaddr + 24, options)
52
    if len(data) == 0: addr = 0
52
    if len(data) == 0: addr = 0
53
    else: addr = memaddr + 24
53
    else: addr = memaddr + 24
54
    return binary[:fileaddr + 16] + struct.pack("<II", len(data) + 24, addr) + data
54
    return binary[:fileaddr + 16] + struct.pack("<II", len(data) + 24, addr) + data
55
    
-
 
56
55
    
-
 
56