forked from Public-Mirror/Textractor
remove linking (useless and a pain to update) and continue rewriting hookman
This commit is contained in:
parent
97bca014e4
commit
aaf33094d1
@ -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);
|
||||
|
@ -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\
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
for (auto i : threadTable)
|
||||
{
|
||||
if (i.second->Number() == number)
|
||||
{
|
||||
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;
|
||||
{
|
||||
remove(i.second);
|
||||
}
|
||||
|
||||
if (flag) {
|
||||
current = nullptr;
|
||||
number = head.Left ? head.Left->data : 0;
|
||||
SetCurrent(thread_table->FindThread(number));
|
||||
if (reset && current)
|
||||
reset(current);
|
||||
//it->ResetEditText();
|
||||
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() <new_thread_number)
|
||||
new_thread_number = it->Number();
|
||||
thread_table->SetThread(i,0);
|
||||
for (auto i : threadTable)
|
||||
{
|
||||
if (i.second->PID() == pid)
|
||||
{
|
||||
if (remove)
|
||||
remove(it);
|
||||
delete it;
|
||||
{
|
||||
remove(i.second);
|
||||
}
|
||||
|
||||
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;
|
||||
delete i.second;
|
||||
threadTable[i.first] = 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);
|
||||
//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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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<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; }
|
||||
|
||||
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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user