Skip to content

Commit 7295a08

Browse files
committed
Reduce code duplication
1 parent e0f2616 commit 7295a08

File tree

1 file changed

+32
-152
lines changed

1 file changed

+32
-152
lines changed

dllmain.cpp

Lines changed: 32 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -361,18 +361,23 @@ void add_entry(unlink_entry e)
361361
}
362362
}
363363

364-
struct ahandler_unlink_t : public action_handler_t
364+
bool unlink_action(ea_t ea, bool bulk)
365365
{
366-
virtual int idaapi activate(action_activation_ctx_t*) override
366+
if (ea != BADADDR)
367367
{
368-
ea_t ea = get_screen_ea();
368+
int i = -1;
369+
if (bulk) {
370+
i = get_module();
371+
}
369372
if (is_code(get_flags(ea)))
370373
{
371374
qstring func_name;
372375
if (get_func_name(&func_name, ea) > 0)
373376
{
374377
iterate_func_chunks(get_func(ea), get_func_chunks, nullptr);
375-
int i = get_module();
378+
if (!bulk) {
379+
i = get_module();
380+
}
376381
if (i != -1)
377382
{
378383
unlink_entry e;
@@ -383,7 +388,7 @@ struct ahandler_unlink_t : public action_handler_t
383388
int func_size = func_end - func_start;
384389
add_entry(e);
385390
insn_t insn;
386-
int insn_size;
391+
int insn_size = 0;
387392
for (ea_t k = func_start; k < func_start + func_size; k += insn_size)
388393
{
389394
flags_t _flags = get_flags(k);
@@ -520,7 +525,9 @@ struct ahandler_unlink_t : public action_handler_t
520525
if (get_name(&data_name, ea) > 0)
521526
{
522527
ea_t data_start = get_item_head(ea);
523-
int i = get_module();
528+
if (!bulk) {
529+
i = get_module();
530+
}
524531
if (i != -1)
525532
{
526533
unlink_entry e;
@@ -534,6 +541,17 @@ struct ahandler_unlink_t : public action_handler_t
534541
}
535542
return true;
536543
}
544+
return false;
545+
}
546+
547+
struct ahandler_unlink_t : public action_handler_t
548+
{
549+
virtual int idaapi activate(action_activation_ctx_t*) override
550+
{
551+
ea_t ea = get_screen_ea();
552+
unlink_action(ea, false);
553+
return true;
554+
}
537555

538556
virtual action_state_t idaapi update(action_update_ctx_t*) override
539557
{
@@ -553,147 +571,7 @@ struct ahandler_unlink_func_t : public action_handler_t
553571
{
554572
func_t* func = getn_func(ctx->chooser_selection[x]);
555573
ea_t ea = func->start_ea;
556-
qstring func_name;
557-
if (get_func_name(&func_name, ea) > 0)
558-
{
559-
iterate_func_chunks(get_func(ea), get_func_chunks, nullptr);
560-
unlink_entry e;
561-
e.ea = func_start;
562-
e.is_extern = false;
563-
e.is_local = false;
564-
e.module_index = i;
565-
int func_size = func_end - func_start;
566-
add_entry(e);
567-
insn_t insn;
568-
int insn_size;
569-
for (ea_t k = func_start; k < func_start + func_size; k += insn_size)
570-
{
571-
flags_t _flags = get_flags(k);
572-
if (is_code(_flags) || is_align(_flags))
573-
{
574-
insn_size = decode_insn(&insn, k);
575-
for (int index = 0; index < 2; index++)
576-
{
577-
switch (insn.ops[index].type)
578-
{
579-
case o_mem:
580-
case o_displ:
581-
if (!is_numop(_flags, index))
582-
{
583-
if (is_code(get_flags(insn.ops[index].addr)))
584-
{
585-
qstring func_name2;
586-
if (get_func_name(&func_name2, insn.ops[index].addr) > 0)
587-
{
588-
unlink_entry e2;
589-
e2.ea = insn.ops[index].addr;
590-
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
591-
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
592-
e2.module_index = i;
593-
add_entry(e2);
594-
}
595-
}
596-
else if (is_data(get_flags(insn.ops[index].addr)))
597-
{
598-
qstring data_name2;
599-
if (get_name(&data_name2, insn.ops[index].addr) > 0)
600-
{
601-
ea_t data_start = get_item_head(insn.ops[index].addr);
602-
unlink_entry e2;
603-
e2.ea = data_start;
604-
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
605-
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
606-
e2.module_index = i;
607-
add_entry(e2);
608-
}
609-
}
610-
}
611-
break;
612-
case o_imm:
613-
if (!is_numop(_flags, index))
614-
{
615-
if (is_code(get_flags(insn.ops[index].value)))
616-
{
617-
qstring func_name2;
618-
if (get_func_name(&func_name2, insn.ops[index].value) > 0)
619-
{
620-
unlink_entry e2;
621-
e2.ea = insn.ops[index].value;
622-
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
623-
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
624-
e2.module_index = i;
625-
add_entry(e2);
626-
}
627-
}
628-
else if (is_data(get_flags(insn.ops[index].value)))
629-
{
630-
qstring data_name2;
631-
if (get_name(&data_name2, insn.ops[index].value) > 0)
632-
{
633-
ea_t data_start = get_item_head(insn.ops[index].value);
634-
unlink_entry e2;
635-
e2.ea = data_start;
636-
e2.is_extern = (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size);
637-
e2.is_local = (insn.ops[index].addr > func_start && insn.ops[index].addr < func_start + func_size);
638-
e2.module_index = i;
639-
add_entry(e2);
640-
}
641-
}
642-
}
643-
break;
644-
case o_near:
645-
if (insn.ops[index].dtype == dt_dword && (insn.ops[index].addr < func_start || insn.ops[index].addr > func_start + func_size))
646-
{
647-
if (is_code(get_flags(insn.ops[index].addr)))
648-
{
649-
qstring func_name2;
650-
if (get_func_name(&func_name2, insn.ops[index].addr) > 0)
651-
{
652-
unlink_entry e2;
653-
e2.ea = insn.ops[index].addr;
654-
e2.is_extern = true;
655-
e2.is_local = false;
656-
e2.module_index = i;
657-
add_entry(e2);
658-
}
659-
}
660-
else if (is_data(get_flags(insn.ops[index].addr)))
661-
{
662-
qstring data_name2;
663-
if (get_name(&data_name2, insn.ops[index].addr) > 0)
664-
{
665-
ea_t data_start = get_item_head(insn.ops[index].addr);
666-
unlink_entry e2;
667-
e2.ea = data_start;
668-
e2.is_extern = true;
669-
e2.is_local = false;
670-
e2.module_index = i;
671-
add_entry(e2);
672-
}
673-
}
674-
}
675-
break;
676-
}
677-
}
678-
}
679-
else
680-
{
681-
uint32 address = get_dword(k);
682-
683-
if ((address > func_start && address < func_start + func_size))
684-
{
685-
unlink_entry e2;
686-
e2.ea = address;
687-
e2.is_extern = false;
688-
e2.is_local = true;
689-
e2.module_index = i;
690-
add_entry(e2);
691-
}
692-
693-
insn_size = 4;
694-
}
695-
}
696-
}
574+
unlink_action(ea, true);
697575
}
698576
}
699577

@@ -769,7 +647,8 @@ bool IsSymbol(ea_t address)
769647
{
770648
for (size_t i = 0; i < CodeSymbols.size(); i++)
771649
{
772-
if (address >= CodeSymbols[CodeSymbols.size() - i - 1].Address && address < CodeSymbols[CodeSymbols.size() - i - 1].Address + CodeSymbols[CodeSymbols.size() - i - 1].Size)
650+
size_t index = CodeSymbols.size() - i - 1;
651+
if (address >= CodeSymbols[index].Address && address < CodeSymbols[index].Address + CodeSymbols[index].Size)
773652
{
774653
return true;
775654
}
@@ -809,11 +688,12 @@ Symbol& FindSymbol(ea_t address, bool local = true)
809688
{
810689
for (size_t i = 0; i < CodeSymbols.size(); i++)
811690
{
812-
if (address >= CodeSymbols[CodeSymbols.size() - i - 1].Address && address < CodeSymbols[CodeSymbols.size() - i - 1].Address + CodeSymbols[CodeSymbols.size() - i - 1].Size)
691+
size_t index = CodeSymbols.size() - i - 1;
692+
if (address >= CodeSymbols[index].Address && address < CodeSymbols[index].Address + CodeSymbols[index].Size)
813693
{
814-
if (local || !CodeSymbols[CodeSymbols.size() - i - 1].IsLocal)
694+
if (local || !CodeSymbols[index].IsLocal)
815695
{
816-
return CodeSymbols[CodeSymbols.size() - i - 1];
696+
return CodeSymbols[index];
817697
}
818698
}
819699
}
@@ -1022,7 +902,7 @@ void export_unlinked_module(qstring name, qvector<unlink_entry>& vector)
1022902
if (!CodeSymbols[j].IsData)
1023903
{
1024904
insn_t insn;
1025-
int insn_size;
905+
int insn_size = 0;
1026906
for (ea_t k = CodeSymbols[j].Address; k < CodeSymbols[j].Address + CodeSymbols[j].Size; k += insn_size)
1027907
{
1028908
int pos = k - CodeSymbols[j].Address;

0 commit comments

Comments
 (0)