@@ -620,6 +620,7 @@ MicrosoftRTTIProcessor::MicrosoftRTTIProcessor(const Ref<BinaryView> &view, bool
620620
621621void MicrosoftRTTIProcessor::ProcessRTTI ()
622622{
623+ auto bgTask = new BackgroundTask (" Scanning for Microsoft RTTI..." , true );
623624 auto start_time = std::chrono::high_resolution_clock::now ();
624625 uint64_t startAddr = m_view->GetOriginalImageBase ();
625626 uint64_t endAddr = m_view->GetEnd ();
@@ -630,6 +631,8 @@ void MicrosoftRTTIProcessor::ProcessRTTI()
630631 for (uint64_t coLocatorAddr = segment->GetStart (); coLocatorAddr < segment->GetEnd () - 0x18 ;
631632 coLocatorAddr += addrSize)
632633 {
634+ if (bgTask->IsCancelled ())
635+ break ;
633636 optReader.Seek (coLocatorAddr);
634637 uint32_t sigVal = optReader.Read32 ();
635638 if (sigVal == COL_SIG_REV1)
@@ -683,6 +686,7 @@ void MicrosoftRTTIProcessor::ProcessRTTI()
683686 }
684687 }
685688
689+ bgTask->Finish ();
686690 auto end_time = std::chrono::high_resolution_clock::now ();
687691 std::chrono::duration<double > elapsed_time = end_time - start_time;
688692 m_logger->LogDebug (" ProcessRTTI took %f seconds" , elapsed_time.count ());
@@ -691,6 +695,7 @@ void MicrosoftRTTIProcessor::ProcessRTTI()
691695
692696void MicrosoftRTTIProcessor::ProcessVFT ()
693697{
698+ auto bgTask = new BackgroundTask (" Scanning for Microsoft RTTI..." , true );
694699 std::map<uint64_t , uint64_t > vftMap = {};
695700 std::map<uint64_t , std::optional<VirtualFunctionTableInfo>> vftFinishedMap = {};
696701 auto start_time = std::chrono::high_resolution_clock::now ();
@@ -712,6 +717,8 @@ void MicrosoftRTTIProcessor::ProcessVFT()
712717 uint64_t endAddr = segment->GetEnd ();
713718 for (uint64_t vtableAddr = startAddr; vtableAddr < endAddr - 0x18 ; vtableAddr += addrSize)
714719 {
720+ if (bgTask->IsCancelled ())
721+ break ;
715722 optReader.Seek (vtableAddr);
716723 uint64_t coLocatorAddr = optReader.ReadPointer ();
717724 auto coLocator = m_classInfo.find (coLocatorAddr);
@@ -806,6 +813,7 @@ void MicrosoftRTTIProcessor::ProcessVFT()
806813 for (const auto &[coLocatorAddr, _]: vftMap)
807814 ProcessClassAndBases (coLocatorAddr);
808815
816+ bgTask->Finish ();
809817 auto end_time = std::chrono::high_resolution_clock::now ();
810818 std::chrono::duration<double > elapsed_time = end_time - start_time;
811819 m_logger->LogDebug (" ProcessVFT took %f seconds" , elapsed_time.count ());
0 commit comments