基于名字查找的仿Hook钩子调用,或者说是信号与槽

typedef long (WINAPI *LIB_FUNC_HOOK)( LPVOID lp, char * szAction, char * szFmt, va_list v);
	
typedef struct _Hook
	{
		char szName[256];
		LIB_FUNC_HOOK func;
		int nPriority;
		LPVOID lp;
		_Hook & operator = ( _Hook & src)
		{
			memcpy( this, &src, sizeof(_Hook));
			return *this;
		}
#if defined(_DEBUG)
		char	szFile[MAX_PATH];
		int		nLine;
#endif
	}STRUCT_HOOK;

bool FUNC_CALL_TYPE LibAddHookEx( STRUCT_HOOK & hookItem)
{
	STRUCT_HOOK_A hookAItem;
	memset( &hookAItem, 0, sizeof(hookAItem));
	strcpy( hookAItem.szName, hookItem.szName);
	hookAItem.func = hookItem.func;
	hookAItem.nPriority = hookItem.nPriority;
	hookAItem.lp = hookItem.lp;
#ifdef _DEBUG
	//strcpy( hookAItem.szFile, hookItem.szFile);
	hookAItem.nLine = hookItem.nLine;
#endif
	m_HookTool.AddHook( hookAItem);
	return true;
}

bool FUNC_CALL_TYPE LibRemoveHookEx( STRUCT_HOOK & hookItem)
{
	STRUCT_HOOK_A hookAItem;
	strcpy( hookAItem.szName, hookItem.szName);
	hookAItem.func = hookItem.func;
	hookAItem.nPriority = hookItem.nPriority;
	hookAItem.lp = hookItem.lp;
#ifdef _DEBUG
	strcpy( hookAItem.szFile, hookItem.szFile);
	hookAItem.nLine = hookItem.nLine;
#endif
	m_HookTool.RemoveHook( hookAItem);
	return true;
}

 long FUNC_CALL_TYPE LibCallHook( char * szName, char * szAction, char * szFmt, ...)
{
	POSITION posHookItem = (POSITION)INVALID_HANDLE_VALUE;
	va_list vaList;
	va_start( vaList, szFmt);
	long nCall = -1;
	m_HookTool.HookCall( szName, szAction, szFmt, vaList);
	va_end( vaList);
	return nCall;
}



实现了可变参数的钩子调用,一切都用字符串实现查找,不用定义信号变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值