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); }
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(¶ms,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 *)¶ms; // 赋值缓冲区指针 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; }