fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync/* $Id$ */
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync/** @file
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync * VBoxHook -- Global windows hook dll
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync */
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync/*
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2010 Oracle Corporation
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync *
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync * available from http://www.virtualbox.org. This file is free software;
c98fb3e16fcd571a790eab772c0c66173d225205vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync */
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync
35396ee506ef68dd1c161f1ef2c3c0b68a146ff2vboxsync#include <Windows.h>
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#include <VBoxHook.h>
0758ccd1bec500cced35c8dfe52fcceacc2469d5vboxsync#include <VBox/VBoxGuestLib.h>
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#include <stdio.h>
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
35396ee506ef68dd1c161f1ef2c3c0b68a146ff2vboxsync#pragma data_seg("SHARED")
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncstatic HWINEVENTHOOK hWinEventHook[2] = {0};
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncstatic HWINEVENTHOOK hDesktopEventHook = NULL;
35396ee506ef68dd1c161f1ef2c3c0b68a146ff2vboxsync#pragma data_seg()
35396ee506ef68dd1c161f1ef2c3c0b68a146ff2vboxsync#pragma comment(linker, "/section:SHARED,RWS")
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncstatic HANDLE hWinNotifyEvent = 0;
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncstatic HANDLE hDesktopNotifyEvent = 0;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#ifdef DEBUG
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsyncstatic void WriteLog(const char *pszFormat, ...);
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync# define dprintf(a) do { WriteLog a; } while (0)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#else
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync# define dprintf(a) do {} while (0)
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync#endif /* !DEBUG */
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncstatic void CALLBACK VBoxHandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync LONG idObject, LONG idChild,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync DWORD dwEventThread, DWORD dwmsEventTime)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync{
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync DWORD dwStyle;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync if ( idObject != OBJID_WINDOW
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync || !hwnd)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync return;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync dwStyle = GetWindowLong(hwnd, GWL_STYLE);
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync if (dwStyle & WS_CHILD)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync return;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync switch(event)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync {
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_LOCATIONCHANGE:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync if (!(dwStyle & WS_VISIBLE))
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync return;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_CREATE:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_DESTROY:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_HIDE:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_SHOW:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#ifdef DEBUG
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync switch(event)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync {
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_LOCATIONCHANGE:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_LOCATIONCHANGE for window %x\n", hwnd));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync break;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_CREATE:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_CREATE for window %x\n", hwnd));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync break;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_HIDE:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_HIDE for window %x\n", hwnd));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync break;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_SHOW:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_SHOW for window %x\n", hwnd));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync break;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync case EVENT_OBJECT_DESTROY:
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync dprintf(("VBoxHandleWinEvent EVENT_OBJECT_DESTROY for window %x\n", hwnd));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync break;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync }
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#endif
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync if (!hWinNotifyEvent)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync {
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hWinNotifyEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, VBOXHOOK_GLOBAL_WT_EVENT_NAME);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync dprintf(("OpenEvent returned %x (last err=%x)\n", hWinNotifyEvent, GetLastError()));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync }
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync BOOL ret = SetEvent(hWinNotifyEvent);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync dprintf(("SetEvent %x returned %d (last error %x)\n", hWinNotifyEvent, ret, GetLastError()));
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync break;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync }
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync}
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncstatic void CALLBACK VBoxHandleDesktopEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync LONG idObject, LONG idChild,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync DWORD dwEventThread, DWORD dwmsEventTime)
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync{
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync if (!hDesktopNotifyEvent)
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync {
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hDesktopNotifyEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, VBOXHOOK_GLOBAL_DT_EVENT_NAME);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync dprintf(("OpenEvent returned %x (last err=%x)\n", hDesktopNotifyEvent, GetLastError()));
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync }
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync BOOL ret = SetEvent(hDesktopNotifyEvent);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync dprintf(("SetEvent %x returned %d (last error %x)\n", hDesktopNotifyEvent, ret, GetLastError()));
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync}
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncBOOL VBoxHookInstallActiveDesktopTracker(HMODULE hDll)
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync{
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync if (hDesktopEventHook)
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync return TRUE;
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync CoInitialize(NULL);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hDesktopEventHook = SetWinEventHook(EVENT_SYSTEM_DESKTOPSWITCH, EVENT_SYSTEM_DESKTOPSWITCH,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync hDll,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync VBoxHandleDesktopEvent,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync 0, 0,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync 0);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync return !!hDesktopEventHook;
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync}
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncBOOL VBoxHookRemoveActiveDesktopTracker()
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync{
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync if (hDesktopEventHook)
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync {
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync UnhookWinEvent(hDesktopEventHook);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync CoUninitialize();
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync }
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hDesktopEventHook = 0;
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync return TRUE;
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync}
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync/** Install the global message hook */
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncBOOL VBoxHookInstallWindowTracker(HMODULE hDll)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync{
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync if (hWinEventHook[0] || hWinEventHook[1])
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync return TRUE;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync CoInitialize(NULL);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hWinEventHook[0] = SetWinEventHook(EVENT_OBJECT_LOCATIONCHANGE, EVENT_OBJECT_LOCATIONCHANGE,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync hDll,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync VBoxHandleWinEvent,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync 0, 0,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync WINEVENT_INCONTEXT | WINEVENT_SKIPOWNPROCESS);
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hWinEventHook[1] = SetWinEventHook(EVENT_OBJECT_CREATE, EVENT_OBJECT_HIDE,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync hDll,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync VBoxHandleWinEvent,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync 0, 0,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync WINEVENT_INCONTEXT | WINEVENT_SKIPOWNPROCESS);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync return !!hWinEventHook[0];
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync}
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync/** Remove the global message hook */
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsyncBOOL VBoxHookRemoveWindowTracker()
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync{
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync if (hWinEventHook[0] && hWinEventHook[1])
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync {
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync UnhookWinEvent(hWinEventHook[0]);
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync UnhookWinEvent(hWinEventHook[1]);
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync CoUninitialize();
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync }
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync hWinEventHook[0] = hWinEventHook[1] = 0;
bd22ae3b86e9b0ed466109e988d302674ecf4aeevboxsync return TRUE;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync}
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync#ifdef DEBUG
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync# include <VBox/VBoxGuest.h>
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync# include <VBox/VMMDev.h>
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync/**
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync * dprintf worker using VBoxGuest.sys and VMMDevReq_LogString.
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync */
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsyncstatic void WriteLog(const char *pszFormat, ...)
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync{
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync /*
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync * Open VBox guest driver once.
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync */
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync static HANDLE s_hVBoxGuest = INVALID_HANDLE_VALUE;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync HANDLE hVBoxGuest = s_hVBoxGuest;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync if (hVBoxGuest == INVALID_HANDLE_VALUE)
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync {
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync hVBoxGuest = CreateFile(VBOXGUEST_DEVICE_NAME,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync GENERIC_READ | GENERIC_WRITE,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync FILE_SHARE_READ | FILE_SHARE_WRITE,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync NULL,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync OPEN_EXISTING,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync NULL);
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync if (hVBoxGuest == INVALID_HANDLE_VALUE)
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync return;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync s_hVBoxGuest = hVBoxGuest;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync }
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync /*
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync * We're apparently afraid of using stack here, so we use a static buffer
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync * instead and pray we won't be here at the same time on two threads...
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync */
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync static union
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync {
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync VMMDevReqLogString Req;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync uint8_t abBuf[1024];
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync } s_uBuf;
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync vmmdevInitRequest(&s_uBuf.Req.header, VMMDevReq_LogString);
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync va_list va;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync va_start(va, pszFormat);
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync size_t cch = vsprintf(s_uBuf.Req.szString, pszFormat, va);
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync va_end(va);
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync s_uBuf.Req.header.size += (uint32_t)cch;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync if (s_uBuf.Req.header.size > sizeof(s_uBuf))
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync __debugbreak();
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync DWORD cbReturned;
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync DeviceIoControl(hVBoxGuest, VBOXGUEST_IOCTL_VMMREQUEST(s_uBuf.Req.size),
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync &s_uBuf.Req, s_uBuf.Req.header.size,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync &s_uBuf.Req, s_uBuf.Req.header.size,
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync &cbReturned, NULL);
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync}
4604ab7d38c2bd2dfc255aa1facffdf81c1c9153vboxsync
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync#endif /* DEBUG */
fd5f006a327367e12b478fe849521f4581dd0cf7vboxsync