+ }
+
+ // 2nd pass over whole .text and .(ro)data segments
+ for (ea = inf.minEA; ea != BADADDR; ea = next_head(ea, inf.maxEA))
+ {
+ segment_t *seg = getseg(ea);
+ if (!seg)
+ break;
+ if (seg->type == SEG_XTRN)
+ continue;
+ if (seg->type != SEG_CODE && seg->type != SEG_DATA)
+ break;
+
+ ea_flags = get_flags_novalue(ea);
+ func = get_func(ea);
+ if (isCode(ea_flags))
+ {
+ if (!decode_insn(ea)) {
+ msg("%x: decode_insn() failed\n", ea);
+ continue;
+ }
+
+ // masm doesn't understand IDA's float/xmm types
+ if (cmd.itype == NN_fld || cmd.itype == NN_fst
+ || cmd.itype == NN_movapd || cmd.itype == NN_movlpd)
+ {
+ for (o = 0; o < UA_MAXOP; o++) {
+ if (cmd.Operands[o].type == o_void)
+ break;
+
+ if (cmd.Operands[o].type == o_mem) {
+ tmp_ea = cmd.Operands[o].addr;
+ flags_t tmp_ea_flags = get_flags_novalue(tmp_ea);
+ // ..but base float is ok..
+ int is_flt = isDwrd(tmp_ea_flags) || isFloat(tmp_ea_flags);
+ if (!is_flt && !isUnknown(tmp_ea_flags))
+ {
+ buf[0] = 0;
+ get_name(ea, tmp_ea, buf, sizeof(buf));
+ msg("%x: undefining %x '%s'\n", ea, tmp_ea, buf);
+ do_unknown(tmp_ea, DOUNK_EXPAND);
+ }
+ }
+ }
+ }
+ else if (cmd.itype == NN_lea) {
+ // detect code alignment
+ if (cmd.Operands[0].reg == cmd.Operands[1].reg
+ && cmd.Operands[1].type == o_displ
+ && cmd.Operands[1].addr == 0)
+ {
+ // lea eax, [eax+0]
+ make_align(ea);
+ }
+ else if (!isDefArg1(ea_flags)
+ && cmd.Operands[1].type == o_mem // why o_mem?
+ && cmd.Operands[1].dtyp == dt_dword)
+ {
+ if (inf.minEA <= cmd.Operands[1].addr
+ && cmd.Operands[1].addr < inf.maxEA)
+ {
+ // lea to segments, like ds:58D6A8h[edx*8]
+ msg("%x: lea offset to %x\n", ea, cmd.Operands[1].addr);
+ op_offset(ea, 1, REF_OFF32);
+ }
+ else
+ {
+ // ds:0[eax*8] -> [eax*8+0]
+ msg("%x: dropping ds: for %x\n", ea, cmd.Operands[1].addr);
+ op_hex(ea, 1);
+ }
+ }
+ }
+ else if (cmd.itype == NN_mov && cmd.segpref == 0x1e // 2e?
+ && cmd.Operands[0].type == o_reg
+ && cmd.Operands[1].type == o_reg
+ && cmd.Operands[0].dtyp == cmd.Operands[1].dtyp
+ && cmd.Operands[0].reg == cmd.Operands[1].reg)
+ {
+ // db 2Eh; mov eax, eax
+ make_align(ea);
+ }
+
+ // find non-local branches
+ if (is_insn_jmp(cmd.itype) && cmd.Operands[0].type == o_near)
+ {
+ target_ea = cmd.Operands[0].addr;
+ if (func == NULL)
+ nonlocal_add(target_ea);
+ else {
+ ret = get_func_chunknum(func, target_ea);
+ if (ret != 0) {
+ // a jump to another func or chunk
+ // check if it lands on func start
+ if (!isFunc(get_flags_novalue(target_ea)))
+ nonlocal_add(target_ea);
+ }
+ }
+ }
+ }
+ else { // not code
+ int do_undef = 0;
+ ea_size = get_item_size(ea);
+
+ if (func == NULL && isOff0(ea_flags)) {
+ for (tmp_ea = 0; tmp_ea < ea_size; tmp_ea += 4)
+ nonlocal_add(get_long(ea + tmp_ea));
+ }
+
+ // IDA vs masm float/mmx/xmm type incompatibility
+ if (isDouble(ea_flags) || isTbyt(ea_flags)
+ || isPackReal(ea_flags))
+ {
+ do_undef = 1;
+ }
+ else if (isOwrd(ea_flags)) {
+ buf[0] = 0;
+ get_name(BADADDR, ea, buf, sizeof(buf));
+ if (IS_START(buf, "xmm"))
+ do_undef = 1;
+ }
+ // masm doesn't understand IDA's unicode
+ else if (isASCII(ea_flags) && ea_size >= 4
+ && (get_long(ea) & 0xff00ff00) == 0) // lame..
+ {
+ do_undef = 1;
+ }
+ // masm doesn't understand large aligns
+ else if (isAlign(ea_flags) && ea_size > 0x10) {
+ msg("%x: undefining align %d\n", ea, ea_size);
+ do_unknown(ea, DOUNK_EXPAND);
+ }
+
+ if (do_undef) {
+ buf[0] = 0;
+ get_name(BADADDR, ea, buf, sizeof(buf));
+ msg("%x: undefining '%s'\n", ea, buf);
+ do_unknown(ea, DOUNK_EXPAND);
+ }
+ }
+ }
+
+ // check namelist for reserved names
+ n = get_nlist_size();
+ for (i = 0; i < n; i++) {
+ ea = get_nlist_ea(i);
+ name = get_nlist_name(i);
+ if (name == NULL) {
+ msg("%x: null name?\n", ea);
+ continue;
+ }
+
+ // rename vars with '?@' (funcs are ok)
+ int change_qat = 0;
+ ea_flags = get_flags_novalue(ea);
+ if (!isCode(ea_flags) && strpbrk(name, "?@"))
+ change_qat = 1;
+
+ if (change_qat || is_name_reserved(name)) {
+ msg("%x: renaming name '%s'\n", ea, name);
+ qsnprintf(buf, sizeof(buf), "%s", name);
+
+ if (change_qat) {
+ for (p = buf; *p != 0; p++) {
+ if (*p == '?' || *p == '@') {
+ qsnprintf(buf2, sizeof(buf2), "%02x", (unsigned char)*p);
+ memmove(p + 1, p, strlen(p) + 1);
+ memcpy(p, buf2, 2);
+ }
+ }
+ }
+
+ my_rename(ea, buf);
+ }
+ }
+
+ if (nonlocal_bt_cnt > 1) {
+ qsort(nonlocal_bt, nonlocal_bt_cnt,
+ sizeof(nonlocal_bt[0]), nonlocal_bt_cmp);