@@ -14,19 +14,39 @@ import Foundation
14
14
class CelesteScanner {
15
15
var enableDebugPrinting : Bool = false
16
16
17
- var header : UInt64 = 0
17
+ var pid : pid_t
18
+ var headerInfo : HeaderInfo ? = nil {
19
+ didSet {
20
+ if let info = headerInfo {
21
+ self . headerSignature = MemscanSignature ( from: info. signatureData)
22
+ } else {
23
+ self . headerSignature = nil
24
+ }
25
+ }
26
+ }
18
27
var headerSignature : MemscanSignature ? = nil
19
28
var pointer : vm_address_t = 0
20
29
let target : MemscanTarget
21
30
let filter : MemscanFilter
22
31
23
32
init ( pid: pid_t ) throws {
33
+ self . pid = pid
24
34
target = try MemscanTarget ( pid: pid)
25
35
filter = MemscanFilter ( startAddress: 0 , endAddress: 0x0000700000000000 )
26
36
}
27
37
28
38
func findHeader( ) throws {
29
39
print ( " Scanning for the AutoSplitterData object header " )
40
+
41
+ if let data = UserDefaults . standard. value ( forKey: " lastHeader " ) as? Data ,
42
+ let lastHeader = try ? PropertyListDecoder ( ) . decode ( HeaderInfo . self, from: data) {
43
+ if lastHeader. pid == pid {
44
+ print ( " Found existing header for pid \( pid) " )
45
+ headerInfo = lastHeader
46
+ return
47
+ }
48
+ }
49
+
30
50
let bigboisignature = MemscanSignature ( parsing:
31
51
" 7f00000000000000000000????????????????ffffffffffffffff000000000000000000000 " +
32
52
" 000000000000000000000000000000000000000000000000000000000000000000000000000 "
@@ -36,8 +56,9 @@ class CelesteScanner {
36
56
let address = match. address - 5
37
57
print ( String ( format: " Found a candiate object at %016llx " , address) )
38
58
let data = try target. read ( at: address, count: 16 )
39
- headerSignature = MemscanSignature ( from: data. buffer)
40
- header = try readData ( at: address) . header
59
+ let info = HeaderInfo ( pid: pid, signatureData: Array ( data. buffer. bindMemory ( to: UInt8 . self) ) , header: try readData ( at: address) . header)
60
+ headerInfo = info
61
+ UserDefaults . standard. set ( try ? PropertyListEncoder ( ) . encode ( info) , forKey: " lastHeader " )
41
62
return
42
63
}
43
64
}
@@ -62,14 +83,17 @@ class CelesteScanner {
62
83
if let match = try scanner. next ( ) {
63
84
self . pointer = match. address
64
85
print ( String ( format: " Found the instance at %llx " , match. address) )
86
+ } else {
87
+ pointer = 0
65
88
}
66
89
}
67
90
68
91
func getInfo( ) throws -> AutoSplitterInfo ? {
69
92
if pointer == 0 { try findData ( ) }
70
93
if pointer == 0 { return nil }
94
+ guard let headerInfo = self . headerInfo else { return nil }
71
95
var data = try readData ( at: pointer)
72
- if data. header != self . header || data. headerPad != 0 {
96
+ if data. header != headerInfo . header || data. headerPad != 0 {
73
97
try findData ( )
74
98
if pointer == 0 { return nil }
75
99
data = try readData ( at: pointer)
@@ -141,6 +165,18 @@ class CelesteScanner {
141
165
}
142
166
}
143
167
168
+ struct HeaderInfo : Codable {
169
+ var pid : pid_t
170
+ var signatureData : [ UInt8 ]
171
+ var header : UInt64
172
+
173
+ init ( pid: pid_t , signatureData: [ UInt8 ] , header: UInt64 ) {
174
+ self . pid = pid
175
+ self . signatureData = signatureData
176
+ self . header = header
177
+ }
178
+ }
179
+
144
180
/**
145
181
A representation of the C# AutoSplitterInfo memory.
146
182
0 commit comments