⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commhookex.cpp

📁 WINDOW下串口钩子技术
💻 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 + -