diff --git a/gui/command.cpp b/gui/command.cpp index b652bb7..4c275ab 100644 --- a/gui/command.cpp +++ b/gui/command.cpp @@ -43,17 +43,6 @@ DWORD ProcessCommand(const std::wstring& cmd, DWORD pid) if (Parse(m[1].str(), hp)) Host_InsertHook(pid, &hp); } - else if (regex_match(cmd, m, wregex(L":l([[:xdigit:]]+)-([[:xdigit:]]+)", wregex::icase))) - { - DWORD from = std::stoul(m[1].str(), NULL, 16); - DWORD to = std::stoul(m[2].str(), NULL, 16); - Host_AddLink(from, to); - } - else if (regex_match(cmd, m, wregex(L":u([[:xdigit:]]+)", wregex::icase))) - { - DWORD from = std::stoul(m[1].str(), NULL, 16); - Host_UnLink(from); - } else if (regex_match(cmd, m, wregex(L":(?:h|help)", wregex::icase))) { ConsoleOutput(Usage); diff --git a/gui/language.cpp b/gui/language.cpp index 6149eb9..66ad8fb 100644 --- a/gui/language.cpp +++ b/gui/language.cpp @@ -20,11 +20,6 @@ const wchar_t* ErrorSyntax=L"Syntax error"; const wchar_t* Usage = L"Syntax:\r\n\ \r\n\ :H[ELP] - print help\r\n\ -:Lfrom-to - link from thread 'from' to thread 'to'\r\n\ -:Ufrom - unlink link from thread 'from'\r\n\ -\r\n\ -'from' and 'to' and hexadecimal thread numbers. The thread number is the first number in the combo box.\r\n\ -\r\n\ Loader options:\r\n\ /P[{process_id|Nprocess_name}] - attach to process\r\n\ \r\n\ diff --git a/gui/window.cpp b/gui/window.cpp index b35b31c..687a3c3 100644 --- a/gui/window.cpp +++ b/gui/window.cpp @@ -365,16 +365,6 @@ void ClickButton(HWND hWnd, HWND h) } pfman->SaveProfiles(); } - else if (h == hwndRemoveLink) - { - WCHAR str[32]; - if (GetWindowText(hwndCombo, str, 32)) - { - DWORD from = std::stoul(str, NULL, 16); - if (from != 0) - Host_UnLink(from); - } - } else if (h == hwndRemoveHook) { WCHAR str[32]; @@ -508,8 +498,6 @@ std::wstring GetEntryString(TextThread& thread) std::wstring CreateEntryWithLink(TextThread& thread, std::wstring& entry) { std::wstring entryWithLink = entry; - if (thread.Link()) - entryWithLink += L"->" + ToHexString(thread.LinkNumber()); if (thread.PID() == 0) entryWithLink += L"ConsoleOutput"; HookParam hp = {}; @@ -609,7 +597,6 @@ DWORD AddRemoveLink(TextThread* thread) } bool IsUnicodeHook(const ProcessRecord& pr, DWORD hook); -void AddLinksToHookManager(const Profile* pf, size_t thread_index, const TextThread* thread); DWORD ThreadCreate(TextThread* thread) { @@ -631,7 +618,6 @@ DWORD ThreadCreate(TextThread* thread) { (*thread_profile)->HookManagerIndex() = thread->Number(); auto thread_index = thread_profile - pf->Threads().begin(); - AddLinksToHookManager(pf, thread_index, thread); if (pf->IsThreadSelected(thread_profile)) ThreadReset(thread); } @@ -655,25 +641,6 @@ bool IsUnicodeHook(const ProcessRecord& pr, DWORD hook) return res; } -void AddLinksToHookManager(const Profile* pf, size_t thread_index, const TextThread* thread) -{ - for (auto lp = pf->Links().begin(); lp != pf->Links().end(); ++lp) - { - if ((*lp)->FromIndex() == thread_index) - { - WORD to_index = pf->Threads()[(*lp)->ToIndex()]->HookManagerIndex(); - if (to_index != 0) - man->AddLink(thread->Number(), to_index); - } - if ((*lp)->ToIndex() == thread_index) - { - WORD from_index = pf->Threads()[(*lp)->FromIndex()]->HookManagerIndex(); - if (from_index != 0) - man->AddLink(from_index, thread->Number()); - } - } -} - DWORD ThreadRemove(TextThread* thread) { RemoveFromCombo(thread); diff --git a/vnr/texthook/host/hookman.cc b/vnr/texthook/host/hookman.cc index 84c89ff..2c61a96 100644 --- a/vnr/texthook/host/hookman.cc +++ b/vnr/texthook/host/hookman.cc @@ -266,120 +266,43 @@ void HookManager::RemoveSingleHook(DWORD pid, DWORD addr) } } SetCurrent(0); - //ConsoleOutput("vnrhost:RemoveSingleHook: lock"); - //EnterCriticalSection(&hmcs); - DWORD max = thread_table->Used(); - bool flag = false; - for (DWORD i = 1; i <= max; i++) - if (TextThread *it = thread_table->FindThread(i)) - if (it->PID() == pid && it->Addr() == addr) { - flag |= (it == current); - //flag|=it->RemoveFromCombo(); - thread_table->SetThread(i, 0); - if (it->Number() < new_thread_number) - new_thread_number = it->Number(); - Delete(it->GetThreadParameter()); - if (remove) - remove(it); - delete it; - } - - for (DWORD i = 0; i <= max; i++) - if (TextThread *it = thread_table->FindThread(i)) - if (it->Link() && thread_table->FindThread(it->LinkNumber()) == nullptr) { - it->LinkNumber() = -1; - it->Link() = nullptr; - } - - if (flag) { - current = nullptr; - DWORD number = head.Left ? head.Left->data : 0; - SetCurrent(thread_table->FindThread(number)); - if (reset && current) - reset(current); - //it->ResetEditText(); - } - //LeaveCriticalSection(&hmcs); - //ConsoleOutput("vnrhost:RemoveSingleHook: unlock"); } void HookManager::RemoveSingleThread(DWORD number) { if (number == 0) return; HM_LOCK; - //ConsoleOutput("vnrhost:RemoveSingleThread: lock"); - //EnterCriticalSection(&hmcs); - if (TextThread *it = thread_table->FindThread(number)) { - thread_table->SetThread(number, 0); - Delete(it->GetThreadParameter()); - if (remove) - remove(it); - bool flag = (it == current); - if (it->Number() < new_thread_number) - new_thread_number = it->Number(); - delete it; - for (int i = 0; i <= thread_table->Used(); i++) - if (TextThread *t = thread_table->FindThread(i)) - if (t->LinkNumber() == number) { - t->Link() = 0; - t->LinkNumber() = -1; - } - - if (flag) { - current = nullptr; - number = head.Left ? head.Left->data : 0; - SetCurrent(thread_table->FindThread(number)); - if (reset && current) - reset(current); - //it->ResetEditText(); - } + for (auto i : threadTable) + { + if (i.second->Number() == number) + { + if (remove) + { + remove(i.second); + } + delete i.second; + threadTable[i.first] = nullptr; + } } - //LeaveCriticalSection(&hmcs); - //ConsoleOutput("vnrhost:RemoveSingleThread: unlock"); + SetCurrent(0); } void HookManager::RemoveProcessContext(DWORD pid) { HM_LOCK; - bool flag = false; - //ConsoleOutput("vnrhost:RemoveProcessContext: lock"); - //EnterCriticalSection(&hmcs); - for (int i = 1; i < thread_table->Used(); i++) - if (TextThread *it = thread_table->FindThread(i)) - if (it->PID() == pid) { - Delete(it->GetThreadParameter()); - //if (false == Delete(it->GetThreadParameter())) { - // // jichi 11/26/2013: Remove debugging instructions - // //if (debug) - // // __asm int 3 - //} - flag |= (it == current); - //flag|=it->RemoveFromCombo(); - if (it->Number() Number(); - thread_table->SetThread(i,0); - if (remove) - remove(it); - delete it; - } - - for (int i = 0; i < thread_table->Used(); i++) - if (TextThread *it=thread_table->FindThread(i)) - if (it->Link() && thread_table->FindThread(it->LinkNumber()) == nullptr) { - it->LinkNumber()=-1; - it->Link() = nullptr; - } - - if (flag) { - current = nullptr; - DWORD number = head.Left ? head.Left->data : 0; - SetCurrent(thread_table->FindThread(number)); - if (reset && current) - reset(current); - //if (it) it->ResetEditText(); + for (auto i : threadTable) + { + if (i.second->PID() == pid) + { + if (remove) + { + remove(i.second); + } + delete i.second; + threadTable[i.first] = nullptr; + } } - //LeaveCriticalSection(&hmcs); - //ConsoleOutput("vnrhost:RemoveProcessContext: unlock"); + SetCurrent(0); } void HookManager::RegisterThread(TextThread* it, DWORD num) { thread_table->SetThread(num, it); } @@ -535,75 +458,6 @@ void HookManager::UnRegisterProcess(DWORD pid) // //swprintf(user_entry,L"UserHook%c",c); //} -void HookManager::AddLink(WORD from, WORD to) -{ - HM_LOCK; - //bool flag=false; - //ConsoleOutput("vnrhost:AddLink: lock"); - //EnterCriticalSection(&hmcs); - TextThread *from_thread = thread_table->FindThread(from), - *to_thread = thread_table->FindThread(to); - if (to_thread && from_thread) { - if (from_thread->GetThreadParameter()->pid != to_thread->GetThreadParameter()->pid) - DOUT("link to different process"); - else if (from_thread->Link()==to_thread) - DOUT("link already exists"); - else if (to_thread->CheckCycle(from_thread)) - DOUT("cyclic link"); - else { - from_thread->Link()=to_thread; - from_thread->LinkNumber()=to; - DOUT("thread linked"); - if (addRemoveLink) - addRemoveLink(from_thread); - //WCHAR str[0x40]; - //swprintf(str,FormatLink,from,to); - //AddConsoleOutput(str); - } - } else - DOUT("error link"); - //else - // AddConsoleOutput(ErrorLink); - //LeaveCriticalSection(&hmcs); - //ConsoleOutput("vnrhost:AddLink: unlock"); -} -void HookManager::UnLink(WORD from) -{ - HM_LOCK; - //bool flag=false; - //ConsoleOutput("vnrhost:UnLink: lock"); - //EnterCriticalSection(&hmcs); - if (TextThread *from_thread = thread_table->FindThread(from)) { - from_thread->Link() = nullptr; - from_thread->LinkNumber() = 0xffff; - DOUT("link deleted"); - if (addRemoveLink) - addRemoveLink(from_thread); - } - //else // jichi 12/25/2013: This could happen when the game exist - // ConsoleOutput("vnrhost:UnLink: thread does not exist"); - //LeaveCriticalSection(&hmcs); - //ConsoleOutput("vnrhost:UnLink: unlock"); -} -void HookManager::UnLinkAll(WORD from) -{ - HM_LOCK; - //bool flag=false; - //ConsoleOutput("vnrhost:UnLinkAll: lock"); - //EnterCriticalSection(&hmcs); - if (TextThread *from_thread = thread_table->FindThread(from)) { - from_thread->UnLinkAll(); - DOUT("link deleted"); - } - //else // jichi 12/25/2013: This could happen after the process exists - // ConsoleOutput("vnrhost:UnLinkAll: thread not exist"); - //AddConsoleOutput(L"Link deleted."); - //} else - // AddConsoleOutput(L"Thread not exist."); - //LeaveCriticalSection(&hmcs); - //ConsoleOutput("vnrhost:UnLinkAll: unlock"); -} - void HookManager::DispatchText(DWORD pid, const BYTE *text, DWORD hook, DWORD retn, DWORD spl, int len, bool space) { // jichi 20/27/2013: When PID is zero, the text comes from console, which I don't need diff --git a/vnr/texthook/host/hookman.h b/vnr/texthook/host/hookman.h index 97c02c1..5e5a388 100644 --- a/vnr/texthook/host/hookman.h +++ b/vnr/texthook/host/hookman.h @@ -62,9 +62,6 @@ public: //void UnlockHookman(); void ResetRepeatStatus(); void ClearCurrent(); - void AddLink(WORD from, WORD to); - void UnLink(WORD from); - void UnLinkAll(WORD from); void SelectCurrent(DWORD num); void SetCurrent(TextThread *it); void AddConsoleOutput(LPCWSTR text); @@ -107,8 +104,6 @@ public: ProcessEventCallback RegisterProcessDetachCallback(ProcessEventCallback cf) { return (ProcessEventCallback)_InterlockedExchange((long*)&detach,(long)cf); } - ThreadTable *Table() { return thread_table; } // private - void OnThreadCreate(pugi::xml_node profile_node, TextThread* thread); void GetProfile(DWORD pid, pugi::xml_node profile_node); diff --git a/vnr/texthook/host/host.cc b/vnr/texthook/host/host.cc index b82240b..d947705 100644 --- a/vnr/texthook/host/host.cc +++ b/vnr/texthook/host/host.cc @@ -289,23 +289,4 @@ IHFSERVICE DWORD IHFAPI Host_RemoveHook(DWORD pid, DWORD addr) return 0; } -// 4/30/2015: Removed as not needed. Going to change to json -IHFSERVICE DWORD IHFAPI Host_AddLink(DWORD from, DWORD to) -{ - man->AddLink(from & 0xffff, to & 0xffff); - return 0; -} - -IHFSERVICE DWORD IHFAPI Host_UnLink(DWORD from) -{ - man->UnLink(from & 0xffff); - return 0; -} - -IHFSERVICE DWORD IHFAPI Host_UnLinkAll(DWORD from) -{ - man->UnLinkAll(from & 0xffff); - return 0; -} - // EOF diff --git a/vnr/texthook/host/textthread.cc b/vnr/texthook/host/textthread.cc index 91af4cc..eaa331b 100644 --- a/vnr/texthook/host/textthread.cc +++ b/vnr/texthook/host/textthread.cc @@ -468,29 +468,6 @@ void TextThread::AddText(const BYTE *con, int len, bool new_line, bool space) sentence_length = 0; } else { SetNewLineTimer(); - if (link) { - const BYTE *send = con; - int l = len; - if (status & USING_UNICODE) { // Although unlikely, a thread and its link may have different encoding. - if ((link->Status() & USING_UNICODE) == 0) { - send = new BYTE[l]; - //::memset(send, 0, l); // jichi 9/26/2013: zero memory - l = WC_MB((LPWSTR)con, (char *)send); - } - link->AddTextDirect(send, l, space); - } else { - if (link->Status() & USING_UNICODE) { - size_t sz = len * 2 + 2; - send = new BYTE[sz]; - //::memset(send, 0, sz); // jichi 9/26/2013: zero memory - l = MB_WC((char *)con, (LPWSTR)send) << 1; - } - link->AddTextDirect(send, l, space); - } - link->SetNewLineTimer(); - if (send != con) - delete[] send; - } sentence_length += len; } @@ -514,29 +491,6 @@ void TextThread::AddTextDirect(const BYTE* con, int len, bool space) // Add to s if (status & BUFF_NEWLINE) AddLineBreak(); //SetNewLineTimer(); - if (link) { - const BYTE *send = con; - int l = len; - if (status & USING_UNICODE) { - if ((link->Status()&USING_UNICODE) == 0) { - send = new BYTE[l]; - //::memset(send, 0, l); // jichi 9/26/2013: zero memory - l = WC_MB((LPWSTR)con,(char*)send); - } - link->AddText(send, l, false, space); // new_line is false - } else { - if (link->Status()&USING_UNICODE) { - size_t sz = len * 2 + 2; - send = new BYTE[sz]; - //::memset(send, 0, sz); // jichi 9/26/2013: zero memory - l = MB_WC((char *)con, (LPWSTR)send) << 1; - } - link->AddText(send, l, false, space); // new_line is false - } - link->SetNewLineTimer(); - if (send != con) - delete[] send; - } sentence_length += len; BYTE *data = const_cast(con); // jichi 10/27/2013: TODO: Figure out where con is modified @@ -723,12 +677,6 @@ void TextThread::DispatchLastSentence() void TextThread::SetNewLineFlag() { status |= BUFF_NEWLINE; } -bool TextThread::CheckCycle(TextThread* start) -{ - if (link==start||this==start) return true; - if (link==0) return false; - return link->CheckCycle(start); -} void TextThread::SetNewLineTimer() { if (thread_number == 0) @@ -765,11 +713,5 @@ DWORD TextThread::GetThreadString(LPSTR str, DWORD max) return len; } -void TextThread::UnLinkAll() -{ - if (link) link->UnLinkAll(); - link = 0; - link_number = -1; -} // EOF diff --git a/vnr/texthook/host/textthread.h b/vnr/texthook/host/textthread.h index 1f6f5f9..ef4c2ee 100644 --- a/vnr/texthook/host/textthread.h +++ b/vnr/texthook/host/textthread.h @@ -83,7 +83,6 @@ public: WORD &LinkNumber() { return link_number; } UINT_PTR &Timer() { return timer; } ThreadParameter *GetThreadParameter() { return &tp; } - TextThread *&Link() { return link; } //LPCWSTR GetComment() { return comment; } ThreadOutputFilterCallback RegisterOutputCallBack(ThreadOutputFilterCallback cb, PVOID data)