12
12
#include " xex_headerids.hpp"
13
13
#include < typeinf.hpp>
14
14
#include < bytes.hpp>
15
+ #include < filesystem>
15
16
16
17
netnode ignore_micro;
17
18
@@ -48,7 +49,7 @@ void label_regsaveloads(ea_t start, ea_t end)
48
49
savef_pattern,
49
50
loadf_pattern
50
51
};
51
- char * pattern_labels[] = {
52
+ const char * pattern_labels[] = {
52
53
" __savegprlr_%d" ,
53
54
" __restgprlr_%d" ,
54
55
" __savefpr_%d" ,
@@ -158,7 +159,7 @@ void pe_add_sections(XEXFile& file)
158
159
bool has_code = (section.Characteristics & IMAGE_SCN_CNT_CODE);
159
160
bool has_data = (section.Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) || (section.Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA);
160
161
161
- char * seg_class = has_code ? " CODE" : " DATA" ;
162
+ const char * seg_class = has_code ? " CODE" : " DATA" ;
162
163
ea_t seg_addr = (ea_t )file.base_address () + (ea_t )section.VirtualAddress ;
163
164
164
165
segment_t segm;
@@ -224,8 +225,9 @@ void pe_add_sections(XEXFile& file)
224
225
offset += 8 ;
225
226
}
226
227
227
- // display messagebox prompt to user, since pdata labelling can take a little while
228
+ msg ( " Parsing .pdata and creating %lld functions... \n " , funcs. size ());
228
229
230
+ // display messagebox prompt to user, since pdata labelling can take a little while
229
231
// ida printf formatter tends to crash, too bad, use sprintf to rewrite just the number portion
230
232
char msg_text[256 ] = " Marking functions from .pdata... (" ;
231
233
int num_pos = strlen (msg_text);
@@ -244,7 +246,7 @@ void pe_add_sections(XEXFile& file)
244
246
break ;
245
247
246
248
// update every few funcs
247
- if (++num % 10 == 0 )
249
+ if (++num % 50 == 0 )
248
250
{
249
251
sprintf_s (msg_text_write, 256 - num_pos, " %lld/%lld)" , num, funcs.size ());
250
252
replace_wait_box (msg_text);
@@ -255,6 +257,56 @@ void pe_add_sections(XEXFile& file)
255
257
}
256
258
}
257
259
260
+ #define PE_NODE " $ PE header" // netnode name for PE header
261
+ // value() -> peheader_t
262
+ // altval(segnum) -> s->start_ea
263
+ #define PE_ALT_DBG_FPOS nodeidx_t (-1 ) // altval() -> translated fpos of debuginfo
264
+ #define PE_ALT_IMAGEBASE nodeidx_t (-2 ) // altval() -> loading address (usually pe.imagebase)
265
+ #define PE_ALT_PEHDR_OFF nodeidx_t (-3 ) // altval() -> offset of PE header
266
+ #define PE_ALT_NEFLAGS nodeidx_t (-4 ) // altval() -> neflags
267
+ #define PE_ALT_TDS_LOADED nodeidx_t (-5 ) // altval() -> tds already loaded(1) or invalid(-1)
268
+ #define PE_ALT_PSXDLL nodeidx_t (-6 ) // altval() -> if POSIX(x86) imports from PSXDLL netnode
269
+ #define PE_ALT_OVRVA nodeidx_t (-7 ) // altval() -> overlay rva (if present)
270
+ #define PE_ALT_OVRSZ nodeidx_t (-8 ) // altval() -> overlay size (if present)
271
+ #define PE_SUPSTR_PDBNM nodeidx_t (-9 ) // supstr() -> pdb file name
272
+ // supval(segnum) -> pesection_t
273
+ // blob(0, PE_NODE_RELOC) -> relocation info
274
+ // blob(0, RSDS_TAG) -> rsds_t structure
275
+ // blob(0, NB10_TAG) -> cv_info_pdb20_t structure
276
+ #define PE_ALT_NTAPI nodeidx_t (-10 ) // altval() -> uses Native API
277
+ #define PE_EMBED_PDB_OFF nodeidx_t (-11 ) // altval() -> offset of embedded PDB file
278
+ #define PE_NODE_RELOC ' r'
279
+ #define RSDS_TAG ' s'
280
+ #define NB10_TAG ' n'
281
+ #define UTDS_TAG ' t'
282
+
283
+ void pe_setup_netnode (XEXFile& file)
284
+ {
285
+ netnode penode;
286
+ penode.create (PE_NODE);
287
+
288
+ penode.altset (PE_ALT_IMAGEBASE, file.base_address ());
289
+
290
+ size_t cv_length = 0 ;
291
+ auto * cv_data = file.codeview_data (0 , &cv_length);
292
+ if (cv_data)
293
+ {
294
+ // Set PDB filename to whatever cv_data[0] says
295
+ // (only use filename instead of full path, else it may fail to load it)
296
+ char * pdb_path_ptr = (char *)(cv_data + sizeof (CV_INFO_PDB70));
297
+ std::filesystem::path pdb_path = pdb_path_ptr;
298
+ penode.supset (PE_SUPSTR_PDBNM, pdb_path.filename ().string ().c_str ());
299
+
300
+ // Copy cv_data into RSDS tag
301
+ penode.setblob (cv_data, cv_length, 0 , RSDS_TAG);
302
+
303
+ // Prompt for PDB load
304
+ msg (" Prompting for PDB load...\n (full X360 type loading may require pdb.cfg PDB_PROVIDER = PDB_PROVIDER_MSDIA !)\n " );
305
+ auto * plugin = find_plugin (" pdb" , 1LL );
306
+ run_plugin (plugin, 1LL );
307
+ }
308
+ }
309
+
258
310
bool load_application (linput_t * li)
259
311
{
260
312
qlseek (li, 0 );
@@ -264,6 +316,7 @@ bool load_application(linput_t* li)
264
316
if (!file.load (li))
265
317
return false ;
266
318
319
+ inf_set_filetype (f_PE);
267
320
inf_set_baseaddr (file.base_address () >> 4 );
268
321
set_imagebase (file.base_address ());
269
322
@@ -431,6 +484,8 @@ bool load_application(linput_t* li)
431
484
}
432
485
}
433
486
487
+ pe_setup_netnode (file);
488
+
434
489
return true ;
435
490
}
436
491
0 commit comments