@@ -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