LONG WINAPI Mine_RegCreateKeyExA(HKEY a0, LPCSTR a1, DWORD a2, LPSTR a3, DWORD a4, REGSAM a5, LPSECURITY_ATTRIBUTES a6, PHKEY a7, LPDWORD a8)
{
    if (CFilterMapper2::m_pFilterMapper2) {
        *a7 = FAKEHKEY;
        return ERROR_SUCCESS;
    }
    return Real_RegCreateKeyExA(a0, a1, a2, a3, a4, a5, a6, a7, a8);
}
Exemple #2
0
LONG WINAPI Replace_RegCreateKeyExA(HKEY hKey,LPCSTR lpSubKey,DWORD Reserved,LPSTR lpClass,DWORD dwOptions,REGSAM samDesired,
									LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition)
{
	LONG nRet;
	__try // 捕获异常
	{
		// Real_RegCreateKeyExA即替换 RegCreateKeyExA 的函数
		nRet = Real_RegCreateKeyExA(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired,
			lpSecurityAttributes, phkResult, lpdwDisposition);

		if(!HOOK_RegCreateKeyEx)// 判断是否监视
			return nRet;
		if(GetCurrentProcessId() == ExplorerPID)//判断是否为资源管理器进程ID  
			return nRet;
		if(GetCurrentProcessId() == RegMonPID)//是否为监视进程ID
			return nRet;
		// PID = 0 即监视所有进程  || 判断是否为要监视的进程
		if((PID == 0) || ((GetCurrentProcessId() == PID) && (PID>0)) ) 
		{
			if(lpSubKey == NULL)
				return nRet;
			COPYDATASTRUCT data; // 申明COPYDATASTRUCT结构 用于进程间发送数据
			PARAMS params;
			memset(&params,0,sizeof(PARAMS));
			params.PID = GetCurrentProcessId();// 得到当前进程 ID
			params.hKey = hKey;
			memcpy(params.buf1, lpSubKey, strlen(lpSubKey)); // 存储子键缓冲信息
			params.result = nRet; // 取得操作返回值
			
			data.cbData = sizeof(PARAMS); // 获得参数大小
			data.lpData =(void *)&params; // 赋值缓冲区指针
			data.dwData = TYPE_RegCreateKeyExA; // 定义动作类型
			/*这里涉及到进程间通信,通常有三种方法:
			 1,使用内存映射文件;
			 2,通过共享内存DLL共享内存
			 3,使用SendMessage 向另一进程发送WM_COPYDATA消息
			在此使用第三种方法
		     WM_COPYDATA消息用法见
              http://wenku.baidu.com/view/1a078b3283c4bb4cf7ecd1ae.html
          
			*/
			// 向监视窗口发送消息
			SendMessage(g_hWnd, WM_COPYDATA, (WPARAM)g_hWnd, (LPARAM)&data);
			
		}
	}__finally
	{
	};
	return nRet;
}