diff --git a/gui/window.cpp b/gui/window.cpp index a3ed7d9..66f4e27 100644 --- a/gui/window.cpp +++ b/gui/window.cpp @@ -424,7 +424,7 @@ void ClickButton(HWND hWnd, HWND h) // return len; //} -DWORD ThreadOutput(TextThread* thread, BYTE* out, DWORD len, DWORD new_line, PVOID data, bool space) +DWORD ThreadOutput(TextThread* thread, BYTE* out, DWORD len, DWORD new_line, bool space) { if (len == 0) return len; diff --git a/vnr/texthook/host/hookman.cc b/vnr/texthook/host/hookman.cc index 36ce260..7b64138 100644 --- a/vnr/texthook/host/hookman.cc +++ b/vnr/texthook/host/hookman.cc @@ -88,21 +88,21 @@ bool operator==(const ThreadParameter& one, const ThreadParameter& two) #define NAMED_PIPE_DISCONNECT 1 //Class member of HookManger HookManager::HookManager() : - // jichi 9/21/2013: Zero memory - //CRITICAL_SECTION hmcs; - current(nullptr) - , create(nullptr) - , remove(nullptr) - , reset(nullptr) - , attach(nullptr) - , detach(nullptr) - , hook(nullptr) - , current_pid(0) - , new_thread_number(0) + // jichi 9/21/2013: Zero memory + //CRITICAL_SECTION hmcs; + current(nullptr) + , create(nullptr) + , remove(nullptr) + , reset(nullptr) + , attach(nullptr) + , detach(nullptr) + , hook(nullptr) + , current_pid(0) + , new_thread_number(0) , threadTable() , processRecordsByIds() { - TextThread* consoleTextThread = threadTable[{0, -1UL, -1UL, -1UL}] = new TextThread(0, -1, -1, -1, new_thread_number++); + TextThread* consoleTextThread = threadTable[{0, -1UL, -1UL, -1UL}] = new TextThread({ 0, -1UL, -1UL, -1UL }, new_thread_number++); consoleTextThread->Status() |= USING_UNICODE; SetCurrent(consoleTextThread); } @@ -304,7 +304,7 @@ void HookManager::DispatchText(DWORD pid, const BYTE *text, DWORD hook, DWORD re TextThread *it; if (!(it = threadTable[tp])) { - it = threadTable[tp] = new TextThread(pid, hook, retn, spl, new_thread_number++); + it = threadTable[tp] = new TextThread(tp, new_thread_number++); if (create) { create(it); diff --git a/vnr/texthook/host/textthread.cc b/vnr/texthook/host/textthread.cc index 4033024..c8db23b 100644 --- a/vnr/texthook/host/textthread.cc +++ b/vnr/texthook/host/textthread.cc @@ -43,82 +43,19 @@ void CALLBACK NewLineBuff(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) id->SetNewLineFlag(); } -// jichi 10/27/2013: removed -//void CALLBACK NewLineConsole(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) -//{ -// KillTimer(hwnd,idEvent); -// TextThread *id=(TextThread*)idEvent; -// if (id->Status()&USING_UNICODE) -// id->AddText((BYTE*)L"\r\n",4,true,true); -// if (id->Status()&CURRENT_SELECT) -// { -// //texts->SetLine(); -// } -//} - -// jichi 10/27/2013: removed -//void ReplaceSentence(BYTE* text, int len) -//{ -// __asm int 3 -//} - -TextThread::TextThread(DWORD id, DWORD hook, DWORD retn, DWORD spl, WORD num) : +TextThread::TextThread(ThreadParameter tp, WORD num) : //,tp thread_number(num) - // jichi 9/21/2013: zero all fields - , link_number(-1) - , last (0) - , align_space(0) - , repeat_single(0) - , repeat_single_current(0) - , repeat_single_count(0) - , repeat_detect_count(0) - , head(new RepeatCountNode()) - , link(nullptr) - //, filter(nullptr) , output(nullptr) - , app_data(nullptr) //, comment(nullptr) - , thread_string(nullptr) , timer(0) , status (0) - , repeat_detect_limit(0x80) , last_sentence(0) - , prev_sentence(0) , sentence_length(0) - , repeat_index(0) - , last_time(0) -// , tp({id, hook, retn, spl}) + , tp(tp) { - tp.pid = id; - tp.hook = hook; - tp.retn = retn; - tp.spl = spl; - //head = new RepeatCountNode; - //::memset(head, 0, sizeof(RepeatCountNode)); // jichi 9/21/2013: zero memory - //link_number = -1; - //repeat_detect_limit = 0x80; - //filter = nullptr; - //output = nullptr; -} -TextThread::~TextThread() -{ - //KillTimer(dummyWindow,timer); - RepeatCountNode *t = head, - *tt; - while (t) { - tt = t; - t = tt->next; - delete tt; - } - head = nullptr; - //if (comment) { - // delete[] comment; - // comment = nullptr; - //} - if (thread_string) - delete[] thread_string; } + void TextThread::Reset() { //timer=0; @@ -129,165 +66,31 @@ void TextThread::Reset() //} MyVector::Reset(); } -void TextThread::RemoveSingleRepeatAuto(const BYTE *con, int &len) -{ -#ifdef ITH_DISABLE_REPEAT // jichi 9/28/2013: only for debugging purpose - return; -#endif // ITH_DISABLE_REPEAT - WORD *text = (WORD *)con; - if (len <= 2) { - if (repeat_single) { - if (repeat_single_countMIN_REDETECT) { - repeat_detect_count = 0; - status ^= REPEAT_NUMBER_DECIDED; - last = 0; - RepeatCountNode *t = head, - *tt; - while (t) { - tt = t; - t = tt->next; - delete tt; - } - head = new RepeatCountNode; - ::memset(head, 0, sizeof(RepeatCountNode)); // jichi 9/21/2013: zero memory - } - } else { - repeat_detect_count++; - if (last == *text) - repeat_single_current++; - else { - if (last == 0) { - last = *text; - return; - } - if (repeat_single_current == 0) { - status |= REPEAT_NUMBER_DECIDED; - repeat_single = 0; - return; - } - last = *text; - RepeatCountNode *it = head; - if (repeat_detect_count > MIN_DETECT) { - while (it = it->next) - if (it->count>head->count) { - head->count=it->count; - head->repeat=it->repeat; - } - repeat_single = head->repeat; - repeat_single_current = 0; - repeat_detect_count = 0; - status |= REPEAT_NUMBER_DECIDED; - DWORD repeat_sc = repeat_single*4; - if (repeat_sc > MIN_DETECT) { - MIN_DETECT <<= 1; - MIN_REDETECT <<= 1; - } - } else { - bool flag=true; - while (it) { - if (it->repeat == repeat_single_current) { - it->count++; - flag = false; - break; - } - it=it->next; - } - if (flag) { - RepeatCountNode *n = new RepeatCountNode; - n->count = 1; - n->repeat = repeat_single_current; - n->next = head->next; - head->next = n; - } - repeat_single_current = 0; - } //Decide repeat_single - } //Check Repeat - } //repeat_single decided? - } //len - else { - status |= REPEAT_NUMBER_DECIDED; - repeat_single = 0; - } -} void TextThread::AddLineBreak() { if (sentence_length == 0) return; if (status&BUFF_NEWLINE) { - prev_sentence=last_sentence; sentence_length=0; if (status & USING_UNICODE) AddToStore((BYTE *)L"\r\n\r\n", 8); else AddToStore((BYTE *)"\r\n\r\n", 4); if (output) - output(this, 0, 8, TRUE, app_data, false); // jichi 10/27/2013: space is false + output(this, 0, 8, TRUE, false); // jichi 10/27/2013: space is false last_sentence = used; status &= ~BUFF_NEWLINE; } } void TextThread::AddText(const BYTE *con, int len, bool new_line, bool space) { - if (!con || (len <= 0 && !space)) - return; - if (len && !new_line) { - // jichi 9/1/2013: manual repetition count removed - //if (setman->GetValue(SETTING_REPEAT_COUNT)) { - // status|=REPEAT_NUMBER_DECIDED; - // RemoveSingleRepeatForce(con,len); - //} - //else - RemoveSingleRepeatAuto(con, len); - if (len <= 0 && !space) - return; - } - - // jichi 9/1/2013: manual repetition count removed - //if(setman->GetValue(SETTING_CYCLIC_REMOVE)) { - // //if (status & REPEAT_NUMBER_DECIDED) - // RemoveCyclicRepeat(con,len); - //} - //if (len <= 0) - // return; - - // jichi 10/27/2013: User-defined filter callback is disabled - //if (filter) - // len = filter(this, con,len, new_line, app_data); - //if (len <= 0) - // return; - - if (len && sentence_length == 0) { - if (status & USING_UNICODE) { - if (*(WORD *)con == 0x3000) { // jichi 10/27/2013: why skip unicode space?! - con += 2; - len -= 2; - } - } else if (*(WORD *)con == 0x4081) { - con += 2; - len -= 2; - } - - if (len <= 0 && !space) - return; - } if (status & BUFF_NEWLINE) AddLineBreak(); if (len) if (new_line) { - prev_sentence = last_sentence; last_sentence = used + 4; if (status & USING_UNICODE) last_sentence += 4; @@ -297,9 +100,10 @@ void TextThread::AddText(const BYTE *con, int len, bool new_line, bool space) sentence_length += len; } + if (len <= 0) return; BYTE *data = const_cast(con); // jichi 10/27/2013: TODO: Figure out where con is modified if (output) - len = output(this, data, len, new_line, app_data, space); + len = output(this, data, len, new_line, space); if (AddToStore(data, len)) { //sentence_length += len; /*ResetRepeatStatus(); @@ -311,40 +115,11 @@ void TextThread::AddText(const BYTE *con, int len, bool new_line, bool space) } } -DWORD TextThread::GetEntryString(LPSTR str, DWORD max) +void TextThread::GetEntryString(LPSTR buffer, DWORD max) { - DWORD len = 0; - if (str && max > 0x40) { - max--; - if (thread_string) { - len = ::strlen(thread_string); - len = len < max ? len : max; - memcpy(str, thread_string, len); - str[len] = 0; - - } else { - len = ::sprintf(str, "%.4X:%.4d:0x%08X:0x%08X:0x%08X:", + int len = sprintf(buffer, "%.4X:%.4d:0x%08X:0x%08X:0x%08X:", thread_number, tp. pid, tp.hook, tp.retn, tp.spl); - - len += GetHookName(str + len, tp.pid, tp.hook, max - len); - thread_string = new char[len + 1]; - //::memset(thread_string, 0, (len+1) * sizeof(wchar_t)); // jichi 9/26/2013: zero memory - thread_string[len] = 0; - ::memcpy(thread_string, str, len); - } - //if (comment) { - // str += len; - // max--; - // DWORD cl = wcslen(comment); - // if (len + cl >= max) - // cl = max - len; - // *str++ = L'-'; - // memcpy(str, comment, cl << 1); - // str[cl] = 0; - // len += cl; - //} - } - return len; + GetHookName(buffer + len, tp.pid, tp.hook, max - len); } // jichi 9/28/2013: removed //void TextThread::CopyLastSentence(LPWSTR str) @@ -443,50 +218,6 @@ void TextThread::DispatchLastSentence() } -//void TextThread::ResetEditText() -//{ -// //__asm int 3; -// WCHAR str[0x20]; -// swprintf(str,L"%.8X",_ReturnAddress()); -//} - -// jichi 9/25/2013: Removed -//void TextThread::ExportTextToFile(LPWSTR) //filename) -//{ -// HANDLE hFile=IthCreateFile(filename,FILE_WRITE_DATA,0,FILE_OPEN_IF); -// if (hFile==INVALID_HANDLE_VALUE) return; -// EnterCriticalSection(&cs_store); -// IO_STATUS_BLOCK ios; -// LPVOID buffer=storage; -// DWORD len=used; -// BYTE bom[4]={0xFF,0xFE,0,0}; -// LARGE_INTEGER offset={2,0}; -// if ((status&USING_UNICODE)==0) -// { -// len=MB_WC_count((char*)storage,used); -// buffer = new wchar_t[len+1]; -// MB_WC((char*)storage,(wchar_t*)buffer); -// len<<=1; -// } -// NtWriteFile(hFile,0,0,0,&ios,bom,2,0,0); -// NtWriteFile(hFile,0,0,0,&ios,buffer,len,&offset,0); -// NtFlushBuffersFile(hFile,&ios); -// if (buffer !=storage) -// delete[] buffer; -// NtClose(hFile); -// LeaveCriticalSection(&cs_store); -//} - -//void TextThread::SetComment(LPWSTR str) -//{ -// if (comment) -// delete[] comment; -// size_t sz = wcslen(str); -// comment = new wchar_t[sz + 1]; -// comment[sz] = 0; -// wcscpy(comment, str); -//} - void TextThread::SetNewLineFlag() { status |= BUFF_NEWLINE; } void TextThread::SetNewLineTimer() diff --git a/vnr/texthook/host/textthread.h b/vnr/texthook/host/textthread.h index 0998b5a..2771bc4 100644 --- a/vnr/texthook/host/textthread.h +++ b/vnr/texthook/host/textthread.h @@ -34,7 +34,7 @@ struct ThreadParameter { class TextThread; typedef void (* ConsoleCallback)(LPCSTR text); typedef void (* ConsoleWCallback)(LPCWSTR text); -typedef DWORD (* ThreadOutputFilterCallback)(TextThread *, BYTE *, DWORD, DWORD, PVOID, bool space); // jichi 10/27/2013: Add space +typedef DWORD (* ThreadOutputFilterCallback)(TextThread *, BYTE *, DWORD, DWORD, bool space); // jichi 10/27/2013: Add space typedef DWORD (* ThreadEventCallback)(TextThread *); //extern DWORD split_time,repeat_count,global_filter,cyclic_remove; @@ -42,14 +42,12 @@ typedef DWORD (* ThreadEventCallback)(TextThread *); class TextThread : public MyVector { public: - TextThread(DWORD pid, DWORD hook, DWORD retn, DWORD spl, WORD num); - ~TextThread(); + TextThread(ThreadParameter tp, WORD num); - virtual DWORD GetEntryString(LPSTR str, DWORD max = 0x200); + virtual void GetEntryString(LPSTR buffer, DWORD max); void Reset(); void AddText(const BYTE *con,int len, bool new_line, bool space); // jichi 10/27/2013: add const; remove console; add space - void RemoveSingleRepeatAuto(const BYTE *con, int &len); // jichi 10/27/2013: add const void AddLineBreak(); void DispatchLastSentence(); @@ -67,35 +65,18 @@ public: ThreadOutputFilterCallback RegisterOutputCallBack(ThreadOutputFilterCallback cb, PVOID data) { - app_data = data; return (ThreadOutputFilterCallback)_InterlockedExchange((long*)&output,(long)cb); } private: ThreadParameter tp; - WORD thread_number, - link_number; - WORD last, - align_space; - WORD repeat_single; - WORD repeat_single_current; - WORD repeat_single_count; - WORD repeat_detect_count; - RepeatCountNode *head; - - TextThread *link; - ThreadOutputFilterCallback filter; // jichi 10/27/2013: Remove filter + WORD thread_number; ThreadOutputFilterCallback output; - PVOID app_data; - LPSTR thread_string; UINT_PTR timer; - DWORD status,repeat_detect_limit; + DWORD status; DWORD last_sentence, - prev_sentence, - sentence_length, - repeat_index, - last_time; + sentence_length; }; // EOF