remove linking (useless and a pain to update) and continue rewriting hookman

This commit is contained in:
Akash Mozumdar 2018-05-31 06:17:14 -04:00
parent 97bca014e4
commit aaf33094d1
8 changed files with 24 additions and 302 deletions

View File

@ -43,17 +43,6 @@ DWORD ProcessCommand(const std::wstring& cmd, DWORD pid)
if (Parse(m[1].str(), hp)) if (Parse(m[1].str(), hp))
Host_InsertHook(pid, &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))) else if (regex_match(cmd, m, wregex(L":(?:h|help)", wregex::icase)))
{ {
ConsoleOutput(Usage); ConsoleOutput(Usage);

View File

@ -20,11 +20,6 @@ const wchar_t* ErrorSyntax=L"Syntax error";
const wchar_t* Usage = L"Syntax:\r\n\ const wchar_t* Usage = L"Syntax:\r\n\
\r\n\ \r\n\
:H[ELP] - print help\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\ Loader options:\r\n\
/P[{process_id|Nprocess_name}] - attach to process\r\n\ /P[{process_id|Nprocess_name}] - attach to process\r\n\
\r\n\ \r\n\

View File

@ -365,16 +365,6 @@ void ClickButton(HWND hWnd, HWND h)
} }
pfman->SaveProfiles(); 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) else if (h == hwndRemoveHook)
{ {
WCHAR str[32]; WCHAR str[32];
@ -508,8 +498,6 @@ std::wstring GetEntryString(TextThread& thread)
std::wstring CreateEntryWithLink(TextThread& thread, std::wstring& entry) std::wstring CreateEntryWithLink(TextThread& thread, std::wstring& entry)
{ {
std::wstring entryWithLink = entry; std::wstring entryWithLink = entry;
if (thread.Link())
entryWithLink += L"->" + ToHexString(thread.LinkNumber());
if (thread.PID() == 0) if (thread.PID() == 0)
entryWithLink += L"ConsoleOutput"; entryWithLink += L"ConsoleOutput";
HookParam hp = {}; HookParam hp = {};
@ -609,7 +597,6 @@ DWORD AddRemoveLink(TextThread* thread)
} }
bool IsUnicodeHook(const ProcessRecord& pr, DWORD hook); bool IsUnicodeHook(const ProcessRecord& pr, DWORD hook);
void AddLinksToHookManager(const Profile* pf, size_t thread_index, const TextThread* thread);
DWORD ThreadCreate(TextThread* thread) DWORD ThreadCreate(TextThread* thread)
{ {
@ -631,7 +618,6 @@ DWORD ThreadCreate(TextThread* thread)
{ {
(*thread_profile)->HookManagerIndex() = thread->Number(); (*thread_profile)->HookManagerIndex() = thread->Number();
auto thread_index = thread_profile - pf->Threads().begin(); auto thread_index = thread_profile - pf->Threads().begin();
AddLinksToHookManager(pf, thread_index, thread);
if (pf->IsThreadSelected(thread_profile)) if (pf->IsThreadSelected(thread_profile))
ThreadReset(thread); ThreadReset(thread);
} }
@ -655,25 +641,6 @@ bool IsUnicodeHook(const ProcessRecord& pr, DWORD hook)
return res; 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) DWORD ThreadRemove(TextThread* thread)
{ {
RemoveFromCombo(thread); RemoveFromCombo(thread);

View File

@ -266,120 +266,43 @@ void HookManager::RemoveSingleHook(DWORD pid, DWORD addr)
} }
} }
SetCurrent(0); 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) void HookManager::RemoveSingleThread(DWORD number)
{ {
if (number == 0) if (number == 0)
return; return;
HM_LOCK; HM_LOCK;
//ConsoleOutput("vnrhost:RemoveSingleThread: lock"); for (auto i : threadTable)
//EnterCriticalSection(&hmcs); {
if (TextThread *it = thread_table->FindThread(number)) { if (i.second->Number() == number)
thread_table->SetThread(number, 0); {
Delete(it->GetThreadParameter());
if (remove) if (remove)
remove(it); {
bool flag = (it == current); remove(i.second);
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;
} }
delete i.second;
if (flag) { threadTable[i.first] = nullptr;
current = nullptr;
number = head.Left ? head.Left->data : 0;
SetCurrent(thread_table->FindThread(number));
if (reset && current)
reset(current);
//it->ResetEditText();
} }
} }
//LeaveCriticalSection(&hmcs); SetCurrent(0);
//ConsoleOutput("vnrhost:RemoveSingleThread: unlock");
} }
void HookManager::RemoveProcessContext(DWORD pid) void HookManager::RemoveProcessContext(DWORD pid)
{ {
HM_LOCK; HM_LOCK;
bool flag = false; for (auto i : threadTable)
//ConsoleOutput("vnrhost:RemoveProcessContext: lock"); {
//EnterCriticalSection(&hmcs); if (i.second->PID() == pid)
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() <new_thread_number)
new_thread_number = it->Number();
thread_table->SetThread(i,0);
if (remove) if (remove)
remove(it); {
delete it; remove(i.second);
} }
delete i.second;
for (int i = 0; i < thread_table->Used(); i++) threadTable[i.first] = nullptr;
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();
} }
//LeaveCriticalSection(&hmcs); SetCurrent(0);
//ConsoleOutput("vnrhost:RemoveProcessContext: unlock");
} }
void HookManager::RegisterThread(TextThread* it, DWORD num) void HookManager::RegisterThread(TextThread* it, DWORD num)
{ thread_table->SetThread(num, it); } { thread_table->SetThread(num, it); }
@ -535,75 +458,6 @@ void HookManager::UnRegisterProcess(DWORD pid)
// //swprintf(user_entry,L"UserHook%c",c); // //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) 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 // jichi 20/27/2013: When PID is zero, the text comes from console, which I don't need

View File

@ -62,9 +62,6 @@ public:
//void UnlockHookman(); //void UnlockHookman();
void ResetRepeatStatus(); void ResetRepeatStatus();
void ClearCurrent(); void ClearCurrent();
void AddLink(WORD from, WORD to);
void UnLink(WORD from);
void UnLinkAll(WORD from);
void SelectCurrent(DWORD num); void SelectCurrent(DWORD num);
void SetCurrent(TextThread *it); void SetCurrent(TextThread *it);
void AddConsoleOutput(LPCWSTR text); void AddConsoleOutput(LPCWSTR text);
@ -107,8 +104,6 @@ public:
ProcessEventCallback RegisterProcessDetachCallback(ProcessEventCallback cf) ProcessEventCallback RegisterProcessDetachCallback(ProcessEventCallback cf)
{ return (ProcessEventCallback)_InterlockedExchange((long*)&detach,(long)cf); } { return (ProcessEventCallback)_InterlockedExchange((long*)&detach,(long)cf); }
ThreadTable *Table() { return thread_table; } // private
void OnThreadCreate(pugi::xml_node profile_node, TextThread* thread); void OnThreadCreate(pugi::xml_node profile_node, TextThread* thread);
void GetProfile(DWORD pid, pugi::xml_node profile_node); void GetProfile(DWORD pid, pugi::xml_node profile_node);

View File

@ -289,23 +289,4 @@ IHFSERVICE DWORD IHFAPI Host_RemoveHook(DWORD pid, DWORD addr)
return 0; 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 // EOF

View File

@ -468,29 +468,6 @@ void TextThread::AddText(const BYTE *con, int len, bool new_line, bool space)
sentence_length = 0; sentence_length = 0;
} else { } else {
SetNewLineTimer(); 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; sentence_length += len;
} }
@ -514,29 +491,6 @@ void TextThread::AddTextDirect(const BYTE* con, int len, bool space) // Add to s
if (status & BUFF_NEWLINE) if (status & BUFF_NEWLINE)
AddLineBreak(); AddLineBreak();
//SetNewLineTimer(); //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; sentence_length += len;
BYTE *data = const_cast<BYTE *>(con); // jichi 10/27/2013: TODO: Figure out where con is modified BYTE *data = const_cast<BYTE *>(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; } 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() void TextThread::SetNewLineTimer()
{ {
if (thread_number == 0) if (thread_number == 0)
@ -765,11 +713,5 @@ DWORD TextThread::GetThreadString(LPSTR str, DWORD max)
return len; return len;
} }
void TextThread::UnLinkAll()
{
if (link) link->UnLinkAll();
link = 0;
link_number = -1;
}
// EOF // EOF

View File

@ -83,7 +83,6 @@ public:
WORD &LinkNumber() { return link_number; } WORD &LinkNumber() { return link_number; }
UINT_PTR &Timer() { return timer; } UINT_PTR &Timer() { return timer; }
ThreadParameter *GetThreadParameter() { return &tp; } ThreadParameter *GetThreadParameter() { return &tp; }
TextThread *&Link() { return link; }
//LPCWSTR GetComment() { return comment; } //LPCWSTR GetComment() { return comment; }
ThreadOutputFilterCallback RegisterOutputCallBack(ThreadOutputFilterCallback cb, PVOID data) ThreadOutputFilterCallback RegisterOutputCallBack(ThreadOutputFilterCallback cb, PVOID data)