mirror of https://github.com/x64dbg/btparser
220 lines
5.6 KiB
Plaintext
220 lines
5.6 KiB
Plaintext
1:
|
|
2:
|
|
3:
|
|
4:
|
|
5:
|
|
6:
|
|
7:
|
|
8:
|
|
9:
|
|
10:
|
|
11:
|
|
12:
|
|
13:
|
|
14:
|
|
15:
|
|
16:
|
|
17:
|
|
18:
|
|
19:
|
|
20:
|
|
21:
|
|
22:
|
|
23:
|
|
24:
|
|
25:
|
|
26:
|
|
27:
|
|
28:
|
|
29:
|
|
30:
|
|
31:
|
|
32: typedef struct {
|
|
33: char signature [ 8 ] ;
|
|
34: ushort unknown1 < format = hex > ;
|
|
35: ushort unknown2 < format = hex > ;
|
|
36: uint psf_size_minus_1AFx < format = hex > ;
|
|
37: uint small_patch_offset < format = hex > ;
|
|
38: uint large_patch_offset < format = hex > ;
|
|
39: uint unknown3 < format = hex > ;
|
|
40: uint num_files ;
|
|
41: uint offset < format = hex > ;
|
|
42: uint num_offsets < format = hex > ;
|
|
43: uint zero1 < format = hex > ;
|
|
44: uint zero2 < format = hex > ;
|
|
45: uint random [ 4 ] < format = hex > ;
|
|
46: char description [ ] ;
|
|
47: uchar zeros [ offset - FTell ( ) ] ;
|
|
48: uint file_info_offsets [ num_offsets ] < format = hex > ;
|
|
49:
|
|
50: } PSFHeader < read = get_package_name > ;
|
|
51:
|
|
52: string get_package_name ( struct PSFHeader & h )
|
|
53: {
|
|
54: local char s [ 512 ] ;
|
|
55: SPrintf ( s , "%s" , exists ( h . name ) ? h . name : "" ) ;
|
|
56: return s ;
|
|
57:
|
|
58: }
|
|
59:
|
|
60: struct FileInfo ;
|
|
61:
|
|
62: string get_file_name ( struct FileInfo & fi )
|
|
63: {
|
|
64: local char s [ 512 ] ;
|
|
65: SPrintf ( s , "%s pit %Xh, %d patches + 1" , exists ( fi . name ) ? fi . name : "" , fi . patch_info_table_offset , fi . num_patches ) ;
|
|
66: return s ;
|
|
67:
|
|
68: }
|
|
69:
|
|
70: struct PatchInfo ;
|
|
71:
|
|
72: string get_patch_info ( struct PatchInfo & pi )
|
|
73: {
|
|
74: local char s [ 512 ] ;
|
|
75: SPrintf ( s , "index %Xh pos %Xh len %Xh" , pi . index , pi . position , pi . length ) ;
|
|
76: return s ;
|
|
77:
|
|
78: }
|
|
79:
|
|
80:
|
|
81: LittleEndian ( ) ;
|
|
82: SetBackColor ( cYellow ) ;
|
|
83: PSFHeader header ;
|
|
84:
|
|
85:
|
|
86: if ( 0 != Memcmp ( header . signature , "PSTREAM\0" ,
|
|
87: sizeof ( header . signature ) ) )
|
|
88: {
|
|
89: Printf ( "File is not a PSF file. Expected PSTREAM header.\n" ) ;
|
|
90: return - 1 ;
|
|
91:
|
|
92: }
|
|
93:
|
|
94:
|
|
95: local uint pos = 0 ;
|
|
96: local uint size = 0 ;
|
|
97: local uint align = 0 ;
|
|
98: local uint o = 0 ;
|
|
99: local uint offset = 0 ;
|
|
100: local uint f = 0 ;
|
|
101: local uint p = 0 ;
|
|
102:
|
|
103: for ( o = 0 ; o < header . num_offsets ; ++ o ) {
|
|
104: if ( header . file_info_offsets [ o ] == 0 )
|
|
105: continue ;
|
|
106: FSeek ( header . file_info_offsets [ o ] ) ;
|
|
107:
|
|
108: for ( ++ f ; true ; ++ f ) {
|
|
109: SetBackColor ( cLtGreen ) ;
|
|
110: struct FileInfo {
|
|
111: uchar unknown [ 3 ] ;
|
|
112: uchar name_len < format = hex > ;
|
|
113: ushort num_patches ;
|
|
114: ushort compression ;
|
|
115: uint dependant_file_info_offset < format = hex > ;
|
|
116: uint unknown_struct_offset < format = hex > ;
|
|
117: uint patch_info_table_offset < format = hex > ;
|
|
118: char name [ name_len ] ;
|
|
119:
|
|
120: pos = FTell ( ) ;
|
|
121: align = ( pos + 3 ) & ~ 3 ;
|
|
122: if ( pos != align ) {
|
|
123: uchar padding [ align - pos ] ;
|
|
124: }
|
|
125:
|
|
126:
|
|
127: for ( size = 0 , pos = FTell ( ) ; ReadUInt ( pos ) == 0 ; ++ size , pos += 4 ) {
|
|
128: }
|
|
129: if ( size > 0 ) {
|
|
130: SetBackColor ( cSilver ) ;
|
|
131: uint zeros [ size ] ;
|
|
132: }
|
|
133: } file_info < read = get_file_name > ;
|
|
134:
|
|
135: if ( file_info . compression != 3 ) {
|
|
136: Printf ( "File %d %s, num_patches %d, compression %X.\n" , f - 1 , file_info . name , file_info . num_patches , file_info . compression ) ;
|
|
137: }
|
|
138:
|
|
139: FSeek ( file_info . unknown_struct_offset ) ;
|
|
140: SetBackColor ( f & 1 ? 0x99FF : 0xFF9900 ) ;
|
|
141: struct Unknown {
|
|
142: uint unknown [ 5 ] < format = hex > ;
|
|
143: } unknown ;
|
|
144:
|
|
145:
|
|
146: FSeek ( file_info . patch_info_table_offset ) ;
|
|
147: for ( p = 0 ; p < file_info . num_patches + 1 ; ++ p ) {
|
|
148: SetBackColor ( p & 1 ? cLtRed : cLtPurple ) ;
|
|
149:
|
|
150: struct PatchInfo {
|
|
151: uchar index < format = hex > ;
|
|
152: uchar unknown [ 3 ] < format = hex > ;
|
|
153: uint length < format = hex > ;
|
|
154: uint position < format = hex > ;
|
|
155: } patch_info < read = get_patch_info > ;
|
|
156: }
|
|
157:
|
|
158:
|
|
159: for ( size = 0 , pos = FTell ( ) ; ReadUInt ( pos ) == 0 ; ++ size , pos += 4 ) {
|
|
160: }
|
|
161: if ( size > 0 ) {
|
|
162: SetBackColor ( cSilver ) ;
|
|
163: struct PIPadding {
|
|
164: uint zeros [ size ] ;
|
|
165: } pi_padding ;
|
|
166: }
|
|
167:
|
|
168: if ( file_info . dependant_file_info_offset == 0 )
|
|
169: break ;
|
|
170: FSeek ( file_info . dependant_file_info_offset ) ;
|
|
171: }
|
|
172:
|
|
173: }
|
|
174:
|
|
175: if ( f != header . num_files ) {
|
|
176: Printf ( "Only %d of %d files found.\n" , f , header . num_files ) ;
|
|
177: return - 1 ;
|
|
178:
|
|
179: }
|
|
180:
|
|
181:
|
|
182: local uint pi = 0 ;
|
|
183: for ( f = 0 ; f < header . num_files ; ++ f ) {
|
|
184: for ( p = 0 ; p < file_info [ f ] . num_patches + 1 ; ++ p , ++ pi ) {
|
|
185: SetBackColor ( pi & 1 ? cLtYellow : cLtBlue ) ;
|
|
186: FSeek ( patch_info [ pi ] . position ) ;
|
|
187:
|
|
188:
|
|
189:
|
|
190:
|
|
191:
|
|
192:
|
|
193: struct Patch {
|
|
194: char signature [ 4 ] ;
|
|
195: uchar flag1 < format = hex > ;
|
|
196: uchar flag2 < format = hex > ;
|
|
197: uchar flag3 < format = hex > ;
|
|
198: uchar flag4 < format = hex > ;
|
|
199:
|
|
200:
|
|
201: uint file1 < format = hex > ;
|
|
202: uint file2 < format = hex > ;
|
|
203: uint file3 < format = hex > ;
|
|
204: uint patch1 < format = hex > ;
|
|
205: uint patch2 < format = hex > ;
|
|
206: if ( patch_info [ pi ] . length > 7 * 4 ) {
|
|
207: uchar unknown [ patch_info [ pi ] . length - 7 * 4 ] ;
|
|
208: }
|
|
209: } patch ;
|
|
210:
|
|
211:
|
|
212: if ( 0 != Memcmp ( patch . signature , "PA19" , sizeof ( patch . signature ) ) ) {
|
|
213: Printf ( "Invalid patch signature. Expected 'PA19'. File %d %s, patch info %d (index %d, position %Xh, length %Xh).\n" , f , file_info [ f ] . name , pi , patch_info [ pi ] . index , patch_info [ pi ] . position , patch_info [ pi ] . length ) ;
|
|
214:
|
|
215: }
|
|
216: }
|
|
217:
|
|
218: }
|
|
219:
|
|
220: SetBackColor ( cNone ) ; tok_eof |