📄 commhookex.cpp
字号:
#include "stdafx.h"
#include "CommHook.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define DEVICE_MAIN
#include "commhookex.h"
#undef DEVICE_MAIN
Declare_Virtual_Device(COMMHOOK)
HDSC_Thunk AddPortThunk;
BOOL bAlreadyInitialized = FALSE;
LISTHANDLE hOpenInfoList;
ADDPORTADDR OriginalAddPortAddress;
DefineControlHandler(DEVICE_INIT, OnDeviceInit);
DefineControlHandler(SYS_DYNAMIC_DEVICE_INIT, OnSysDynamicDeviceInit);
DefineControlHandler(SYS_DYNAMIC_DEVICE_EXIT, OnSysDynamicDeviceExit);
BOOL Init(void);
BOOL Exit(void);
BOOL LocalAddPort(PVOID RefData, PCOMMPORTOPENFUNC pPortOpen, PCHAR szPortName);
PPORTDATA LocalPortOpen(PCHAR szPortName, VMHANDLE hVM, PDWORD pError);
POPENINFO FindPortByName(PCHAR szPortName);
VOID SetUpHooks(POPENINFO p);
VOID Release(POPENINFO p);
BOOL __cdecl LocalPortClose(PPORTDATA hPort);
BOOL __cdecl LocalPortRead(PPORTDATA hPort, PCHAR buffer, DWORD requested,PDWORD pReceived);
BOOL __cdecl LocalPortWrite(PPORTDATA hPort, PCHAR buffer, DWORD requested,PDWORD pWritten);
BOOL __cdecl ControlDispatcher(DWORD dwControlMessage, DWORD EBX, DWORD EDX,DWORD ESI, DWORD EDI, DWORD ECX)
{
START_CONTROL_DISPATCH ON_DEVICE_INIT(OnDeviceInit);
ON_SYS_DYNAMIC_DEVICE_INIT(OnSysDynamicDeviceInit);
ON_SYS_DYNAMIC_DEVICE_EXIT(OnSysDynamicDeviceExit);
END_CONTROL_DISPATCH
return TRUE;
}
BOOL OnDeviceInit(VMHANDLE hVM, PCHAR CommandTail)
{
return Init();
}
BOOL OnSysDynamicDeviceInit()
{
return Init();
}
BOOL OnSysDynamicDeviceExit()
{
if (List_Get_First(hOpenInfoList) != NULL)
return FALSE;
return Exit();
}
BOOL Init(void)
{
if (!bAlreadyInitialized)
{
OriginalAddPortAddress = (ADDPORTADDR)
Hook_Device_Service_C(___VCOMM_Add_Port,LocalAddPort, &AddPortThunk);
bAlreadyInitialized = TRUE;
hOpenInfoList = List_Create(0, sizeof(OPENINFO));
}
return OriginalAddPortAddress != NULL;
}
BOOL Exit(void)
{
bAlreadyInitialized = FALSE;
List_Destroy(hOpenInfoList);
return Unhook_Device_Service_C(___VCOMM_Add_Port, &AddPortThunk);
}
BOOL LocalAddPort(PVOID RefData, PCOMMPORTOPENFUNC pPortOpen, PCHAR szPortName)
{
POPENINFO pOpenInfo = (POPENINFO) List_Allocate(hOpenInfoList);
pOpenInfo->oi_portname = strdup(szPortName);
pOpenInfo->oi_openfunc = pPortOpen;
List_Attach(hOpenInfoList, (PNODE) pOpenInfo);
return OriginalAddPortAddress(RefData, LocalPortOpen, szPortName);
}
PPORTDATA LocalPortOpen(PCHAR szPortName, VMHANDLE hVM, PDWORD pError)
{
POPENINFO p = FindPortByName(szPortName);
PPORTDATA pData;
if (p == NULL)
return NULL;
pData = p->oi_openfunc(szPortName, hVM, pError);
p->oi_portdata = pData;
if (pData)
SetUpHooks(p);
return pData;
}
POPENINFO FindPortByName(PCHAR szPortName)
{
POPENINFO p = (POPENINFO) List_Get_First(hOpenInfoList);
while (p != NULL)
{
if (stricmp(p->oi_portname, szPortName) == 0)
return p;
else
p = List_Get_Next(hOpenInfoList, p);
}
return NULL;
}
POPENINFO FindPortByHandle(PPORTDATA pData)
{
POPENINFO p = (POPENINFO) List_Get_First(hOpenInfoList);
while (p != NULL)
{
if (p->oi_portdata == pData)
return p;
else
p = List_Get_Next(hOpenInfoList, p);
}
return NULL;
}
VOID SetUpHooks(POPENINFO p)
{
PortFunctions* pFuncs;
pFuncs = p->oi_portdata->PDfunctions;
p->oi_originalfuncs = pFuncs;
memcpy(&p->oi_localfuncs, pFuncs, sizeof(PortFunctions));
p->oi_portdata->PDfunctions = &p->oi_localfuncs;
p->oi_localfuncs.pPortClose = LocalPortClose;
p->oi_localfuncs.pPortWrite = LocalPortWrite;
p->oi_localfuncs.pPortRead = LocalPortRead;
}
BOOL __cdecl LocalPortClose(PPORTDATA hPort)
{
POPENINFO p = FindPortByHandle(hPort);
PCLOSEFUNC TheRealClose;
if (p == NULL)
return FALSE;
TheRealClose = (PCLOSEFUNC) p->oi_originalfuncs->pPortClose;
Release(p);
return TheRealClose(hPort);
}
VOID Release(POPENINFO p)
{
p->oi_portdata->PDfunctions = p->oi_originalfuncs;
free(p->oi_portname);
List_Remove(hOpenInfoList, (PNODE) p);
List_Deallocate(hOpenInfoList, (PNODE) p);
}
BOOL __cdecl LocalPortRead(PPORTDATA hPort, PCHAR buffer, DWORD requested,PDWORD pReceived)
{
POPENINFO p = FindPortByHandle(hPort);
PREADFUNC TheRealRead = (PREADFUNC) p->oi_originalfuncs->pPortRead;
BOOL b = TheRealRead(hPort, buffer, requested, pReceived);
return b;
}
BOOL __cdecl LocalPortWrite(PPORTDATA hPort, PCHAR buffer, DWORD requested,PDWORD pWritten)
{
POPENINFO p = FindPortByHandle(hPort);
PWRITEFUNC TheRealWrite = (PWRITEFUNC) p->oi_originalfuncs->pPortWrite;
BOOL b = TheRealWrite(hPort, buffer, requested, pWritten);
if (b)
dprintf("COMMHOOK: wrote %x/%x bytes to %s\n", *pWritten, requested,p->oi_portname);
return b;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -