//-------------------------------------------------------------------------- void run(int /*arg*/) { if ( !autoIsOk() && askyn_c(-1, "HIDECANCEL\n" "The autoanalysis has not finished yet.\n" "The result might be incomplete. Do you want to continue?") < 0 ) return; // gather information about the entry points entrylist_t *li = new entrylist_t; size_t n = get_entry_qty(); for ( size_t i=0; i < n; i++ ) { asize_t ord = get_entry_ordinal((int)i); ea_t ea = get_entry(ord); if ( ord == ea ) continue; qtype type, fnames; char decl[MAXSTR]; char true_name[MAXSTR]; asize_t argsize = 0; get_entry_name(ord, true_name, sizeof(true_name)); if ( get_tinfo(ea, &type, &fnames) && print_type_to_one_line( decl, sizeof(decl), idati, type.c_str(), true_name, NULL, fnames.c_str()) == T_NORMAL ) { // found type info -- calc the args size func_type_info_t fi; int a = build_funcarg_info(idati, type.c_str(), fnames.c_str(), &fi, 0); if ( a != 0 ) { for ( int k=0; k < a; k++ ) { const type_t *ptr = fi[k].type.c_str(); int s1 = (int)get_type_size(idati, ptr); s1 = qmax(s1, inf.cc.size_i); argsize += s1; } } } else if ( get_long_name(BADADDR, ea, decl, sizeof(decl)) != NULL && get_true_name(BADADDR, ea, true_name, sizeof(true_name)) != NULL && strcmp(decl, true_name) != 0 ) { // found mangled name } else { // found nothing, just show the name const char *name = get_name(BADADDR, ea, true_name, sizeof(true_name)); if ( name == NULL ) continue; qstrncpy(decl, name, sizeof(decl)); } if ( argsize == 0 ) { func_t *pfn = get_func(ea); if ( pfn != NULL ) argsize = pfn->argsize; } item_t x; x.ord = (int)ord; x.ea = ea; x.decl = decl; x.argsize = (uint32)argsize; li->push_back(x); } // now open the window choose2(false, // non-modal window -1, -1, -1, -1, // position is determined by Windows li, // pass the created array qnumber(header), // number of columns widths, // widths of columns sizer, // function that returns number of lines desc, // function that generates a line "Exported functions", // window title -1, // use the default icon for the window 0, // position the cursor on the first line NULL, // "kill" callback NULL, // "new" callback NULL, // "update" callback NULL, // "edit" callback enter_cb, // function to call when the user pressed Enter destroy_cb, // function to call when the window is closed NULL, // use default popup menu items NULL); // use the same icon for all lines }
//-------------------------------------------------------------------------- // Generate text for the current location int ida_export class_place_t__generate( const cp_t *ths, void *ud, char *lines[], int maxsize, int *default_lnnum, color_t *prefix_color, bgcolor_t *bg_color) { strvec_t &sv = *(strvec_t *)ud; uval_t idx = ths->idx; if ( idx > get_last_class_idx() || maxsize <= 0 ) return 0; char name[MAXNAMESIZE]; tid_t tid = get_class_by_idx(idx); if (tid==BADNODE) return 0; switch (ths->section) { case 0: if (get_class_name(tid, name, MAXNAMESIZE)) { char line[MAXSTR]; class_t * clas = get_class(tid); if(!clas) return 0; if (clas->parents_tid.size()) qsnprintf(line, MAXSTR, "class %s: derived from: 0x%p", name, clas->parents_tid.front()); else qsnprintf(line, MAXSTR, "class %s", name ); lines[0] = qstrdup(line); *bg_color = 0xC0C0FF; } break; case 1: { char line[MAXSTR]; class_t * clas = get_class(tid); if(!clas) return 0; if (clas->virt_table_ea != BADADDR) qsnprintf(line, MAXSTR, "vftable: %p", clas->virt_table_ea); else qsnprintf(line, MAXSTR, "no virtual table"); lines[0] = qstrdup(line); *bg_color = 0xC0FFC0; } break; case 2: { char *line; class_t * clas = get_class(tid); if(!clas) return 0; ea_t ea = BADADDR; if (clas->functions_ea.size() && ths->subsection<=clas->functions_ea.size()) ea = clas->functions_ea[ths->subsection]; if (ea!=BADADDR) { qstring tmpline; get_colored_long_name(&tmpline, ea); qtype type; qtype fields; if (!get_tinfo(ea, &type, &fields)) { if (!guess_func_tinfo(get_func(ea), &type, &fields)) goto pokracuj; } line = qstrdup(tmpline.c_str()); print_type_to_one_line(line, MAXSTR, idati, type.c_str(), line, 0, fields.c_str(), 0); pokracuj: ; } else qsnprintf(line, MAXSTR, "bad func"); lines[0] = qstrdup(line); *bg_color = 0xC0FFFF; } break; } //*prefix_color = sv[idx%sv.size()].color; //*bg_color = sv[idx%sv.size()].bgcolor; *default_lnnum = 0; return 1; // generated one line //setup_makeline(-1, ..., save_line_in_array, 0) //finish_makeline(); }