Ejemplo n.º 1
0
//--------------------------------------------------------------------------
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
}
Ejemplo n.º 2
0
//--------------------------------------------------------------------------
// 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();
}