VBoxHook.cpp revision e3cc59c2dca7d5a7f54ee27b9fbb68fe42d158ed
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * VBoxHook -- Global windows hook dll
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * Copyright (C) 2006-2007 innotek GmbH
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * General Public License as published by the Free Software Foundation,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * If you received this file as part of a commercial VirtualBox
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * distribution, then only the terms of your commercial VirtualBox
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * license agreement apply instead of the previous paragraph.
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync#define dprintf(a) do {} while (0)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#endif /* DEBUG */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsynctypedef struct
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncvoid CALLBACK VBoxHandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_LOCATIONCHANGE for window %x\n", hwnd));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_CREATE for window %x\n", hwnd));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_HIDE for window %x\n", hwnd));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_SHOW for window %x\n", hwnd));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_DESTROY for window %x\n", hwnd));
22e281e75ed636601178296c6daebda8f1d17c59vboxsyncBOOL CALLBACK VBoxEnumFunc(HWND hwnd, LPARAM lParam)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync PVBOX_ENUM_PARAM lpParam = (PVBOX_ENUM_PARAM)lParam;
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* Only visible windows that are present on the desktop are interesting here */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync && IntersectRect(&rectVisible, &lpParam->rect, &rect))
22e281e75ed636601178296c6daebda8f1d17c59vboxsync GetWindowText(hwnd, szWindowText, sizeof(szWindowText));
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /* Filter out Windows XP shadow windows */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /** @todo still shows inside the guest */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync && dwStyle == (WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS)
22e281e75ed636601178296c6daebda8f1d17c59vboxsync && dwExStyle == (WS_EX_LAYERED|WS_EX_TOOLWINDOW|WS_EX_TRANSPARENT|WS_EX_TOPMOST))
22e281e75ed636601178296c6daebda8f1d17c59vboxsync dprintf(("Filter out shadow window style=%x exstyle=%x\n", dwStyle, dwExStyle));
22e281e75ed636601178296c6daebda8f1d17c59vboxsync /** @todo will this suffice? The Program Manager window covers the whole screen */
22e281e75ed636601178296c6daebda8f1d17c59vboxsync dprintf(("Enum hwnd=%x rect (%d,%d) (%d,%d)\n", hwnd, rect.left, rect.top, rect.right, rect.bottom));
22e281e75ed636601178296c6daebda8f1d17c59vboxsync dprintf(("title=%s style=%x\n", szWindowText, dwStyle));
22e281e75ed636601178296c6daebda8f1d17c59vboxsync dprintf(("GetWindowRgn failed with rc=%d\n", GetLastError()));
c17f5c90f2cb60b38ecabebce128724c6ff2d036vboxsync SetRectRgn(hrgn, rectVisible.left, rectVisible.top, rectVisible.right, rectVisible.bottom);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* this region is relative to the window origin instead of the desktop origin */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync OffsetRgn(hrgn, rectVisible.left, rectVisible.top);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* create a union of the current visible region and the visible rectangle of this window. */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync CombineRgn(lpParam->hrgn, lpParam->hrgn, hrgn, RGN_OR);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("Enum hwnd=%x rect (%d,%d) (%d,%d) (ignored)\n", hwnd, rect.left, rect.top, rect.right, rect.bottom));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("title=%s style=%x\n", szWindowText, dwStyle));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("VBoxRecheckVisibleWindows desktop=%x rect (%d,%d) (%d,%d)\n", GetDesktopWindow(), param.rect.left, param.rect.top, param.rect.right, param.rect.bottom));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync LPRGNDATA lpRgnData = (LPRGNDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbSize);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync cbSize = GetRegionData(param.hrgn, cbSize, lpRgnData);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync dprintf(("visible rect (%d,%d)(%d,%d)\n", lpRect[i].left, lpRect[i].top, lpRect[i].right, lpRect[i].bottom));
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* send to display driver */
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync ExtEscape(param.hdc, VBOXESC_SETVISIBLEREGION, cbSize, (LPCSTR)lpRgnData, 0, NULL);
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync/* Install the global message hook */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync /* Check current visible region state */
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync hEventHook[0] = SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync hEventHook[1] = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_HIDE,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync/* Remove the global message hook */
909f4391cc20b4a3a9a2d3f8718084b669663ab2vboxsync return true;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncVBGLR3DECL(int) VbglR3GRPerform(VMMDevRequestHeader *pReq)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, pReq, pReq->size,
3ecd8008b81f02a04220705ae0033142af363280vboxsync VMMDevReqLogString *pReq = (VMMDevReqLogString *)LogBuffer;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync /* open VBox guest driver */