void ThreadCreate(CREATE_THREAD_DEBUG_INFO* CreateThread) { THREADINFO curInfo; memset(&curInfo, 0, sizeof(THREADINFO)); curInfo.ThreadNumber = ThreadGetCount(); curInfo.Handle = INVALID_HANDLE_VALUE; curInfo.ThreadId = ((DEBUG_EVENT*)GetDebugData())->dwThreadId; curInfo.ThreadStartAddress = (duint)CreateThread->lpStartAddress; curInfo.ThreadLocalBase = (duint)CreateThread->lpThreadLocalBase; // Duplicate the debug thread handle -> thread handle DuplicateHandle(GetCurrentProcess(), CreateThread->hThread, GetCurrentProcess(), &curInfo.Handle, 0, FALSE, DUPLICATE_SAME_ACCESS); // The first thread (#0) is always the main program thread if(curInfo.ThreadNumber <= 0) strcpy_s(curInfo.threadName, "Main Thread"); // Modify global thread list EXCLUSIVE_ACQUIRE(LockThreads); threadList.insert(std::make_pair(curInfo.ThreadId, curInfo)); EXCLUSIVE_RELEASE(); // Notify GUI GuiUpdateThreadView(); }
BRIDGE_IMPEXP void GuiUpdateAllViews() { GuiUpdateRegisterView(); GuiUpdateDisassemblyView(); GuiUpdateBreakpointsView(); GuiUpdateDumpView(); GuiUpdateThreadView(); GuiUpdateSideBar(); GuiRepaintTableView(); }
void ThreadClear() { EXCLUSIVE_ACQUIRE(LockThreads); // Close all handles first for(auto & itr : threadList) CloseHandle(itr.second.Handle); // Empty the array threadList.clear(); // Update the GUI's list EXCLUSIVE_RELEASE(); GuiUpdateThreadView(); }
void ThreadExit(DWORD ThreadId) { EXCLUSIVE_ACQUIRE(LockThreads); // Erase element using native functions auto itr = threadList.find(ThreadId); if(itr != threadList.end()) { CloseHandle(itr->second.Handle); threadList.erase(itr); } EXCLUSIVE_RELEASE(); GuiUpdateThreadView(); }