static void VBoxSeamlessInstallHook() { if (gCtx.pfnVBoxHookInstallWindowTracker) { /* Check current visible region state */ VBoxSeamlessCheckWindows(true); HMODULE hMod = (HMODULE)RTLdrGetNativeHandle(gCtx.hModHook); Assert(hMod != (HMODULE)~(uintptr_t)0); gCtx.pfnVBoxHookInstallWindowTracker(hMod); } }
static void VBoxSeamlessInstallHook(void) { PVBOXSEAMLESSCONTEXT pCtx = &g_Ctx; /** @todo r=andy Use instance data via service lookup (add void *pInstance). */ AssertPtr(pCtx); if (pCtx->pfnVBoxHookInstallWindowTracker) { /* Check current visible region state */ VBoxSeamlessCheckWindows(true); HMODULE hMod = (HMODULE)RTLdrGetNativeHandle(pCtx->hModHook); Assert(hMod != (HMODULE)~(uintptr_t)0); pCtx->pfnVBoxHookInstallWindowTracker(hMod); } }
int VBoxMMRInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread) { LogFlowFuncEnter(); int rc = RTLdrLoadAppPriv(g_pszMMRDLL, &gCtx.hModHook); if (RT_SUCCESS(rc)) { HOOKPROC pHook = (HOOKPROC)RTLdrGetFunction(gCtx.hModHook, g_pszMMRPROC); if (pHook) { HMODULE hMod = (HMODULE)RTLdrGetNativeHandle(gCtx.hModHook); Assert(hMod != (HMODULE)~(uintptr_t)0); gCtx.hHook = SetWindowsHookEx(WH_CBT, pHook, hMod, 0); if (gCtx.hHook) { *ppInstance = &gCtx; return VINF_SUCCESS; } rc = RTErrConvertFromWin32(GetLastError()); LogFlowFunc(("Error installing hooking proc: %Rrc\n", rc)); } else { LogFlowFunc(("Hooking proc not found\n")); rc = VERR_NOT_FOUND; } RTLdrClose(gCtx.hModHook); gCtx.hModHook = NIL_RTLDRMOD; } else LogFlowFunc(("Hooking library not found (%Rrc)\n", rc)); return rc; }