Textractor_test/texthook/hookman.h

78 lines
2.2 KiB
C
Raw Normal View History

#pragma once
// hookman.h
// 8/23/2013 jichi
// Branch: ITH/HookManager.h, rev 133
2018-07-19 12:46:52 +08:00
#include <Windows.h>
2018-07-19 04:18:43 +08:00
#include "textthread.h"
#include <unordered_map>
#include <string>
2018-07-21 04:26:27 +08:00
#include "../vnrhook/include/types.h"
2018-07-19 13:43:31 +08:00
struct ProcessRecord
2018-07-19 12:46:52 +08:00
{
2018-07-19 13:43:31 +08:00
HANDLE process_handle;
HANDLE hookman_mutex;
HANDLE hookman_section;
LPVOID hookman_map;
HANDLE hostPipe;
};
2018-07-19 13:05:15 +08:00
typedef void(*ProcessEventCallback)(DWORD pid);
typedef void(*ThreadEventCallback)(TextThread*);
struct ThreadParameterHasher
{
size_t operator()(const ThreadParameter& tp) const
{
return std::hash<DWORD>()(tp.pid << 6) + std::hash<DWORD>()(tp.hook) + std::hash<DWORD>()(tp.retn) + std::hash<DWORD>()(tp.spl);
}
};
2018-07-20 01:34:26 +08:00
// Artikash 7/19/2018: This should probably be broken up into 2-4 classes...
2018-07-19 12:46:52 +08:00
class __declspec(dllexport) HookManager
{
public:
2018-07-19 13:43:31 +08:00
HookManager();
~HookManager();
2018-07-19 12:46:52 +08:00
2018-07-19 13:43:31 +08:00
TextThread *FindSingle(DWORD number);
HANDLE GetHostPipe(DWORD pid);
void ClearCurrent();
void SelectCurrent(DWORD num);
void SetCurrent(TextThread *it);
void AddConsoleOutput(LPCWSTR text);
void DispatchText(DWORD pid, DWORD hook, DWORD retn, DWORD split, const BYTE *text, int len);
void RemoveProcessContext(DWORD pid); // private
void RemoveSingleHook(DWORD pid, DWORD addr);
void RegisterProcess(DWORD pid, HANDLE hostPipe);
void UnRegisterProcess(DWORD pid);
HookParam GetHookParam(DWORD pid, DWORD addr);
std::wstring GetHookName(DWORD pid, DWORD addr);
2018-07-19 13:43:31 +08:00
void RegisterThreadCreateCallback(ThreadEventCallback cf) { create = cf; }
void RegisterThreadRemoveCallback(ThreadEventCallback cf) { remove = cf; }
void RegisterThreadResetCallback(ThreadEventCallback cf) { reset = cf; }
void RegisterProcessAttachCallback(ProcessEventCallback cf) { attach = cf; }
void RegisterProcessDetachCallback(ProcessEventCallback cf) { detach = cf; }
2018-07-19 13:43:31 +08:00
void SetSplitInterval(unsigned int splitDelay) { this->splitDelay = splitDelay; }
2018-07-18 05:01:56 +08:00
private:
std::unordered_map<ThreadParameter, TextThread*, ThreadParameterHasher> textThreadsByParams;
std::unordered_map<DWORD, ProcessRecord> processRecordsByIds;
2018-07-19 13:43:31 +08:00
CRITICAL_SECTION hmCs;
2018-07-19 13:43:31 +08:00
TextThread *current;
2018-07-19 13:43:31 +08:00
ThreadEventCallback create, remove, reset;
ProcessEventCallback attach, detach;
2018-07-19 12:46:52 +08:00
2018-07-19 13:43:31 +08:00
WORD nextThreadNumber;
unsigned int splitDelay;
};
// EOF