VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/VBoxService/VBoxRestore.cpp@ 5025

Last change on this file since 5025 was 4686, checked in by vboxsync, 17 years ago

Adjusted timeout. VBoxGuest used to wait 10 times longer than it should.

File size: 4.9 KB
Line 
1/** @file
2 *
3 * VBoxRestore - Restore notification
4 *
5 */
6
7/*
8 * Copyright (C) 2006-2007 innotek GmbH
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License as published by the Free Software Foundation,
14 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
15 * distribution. VirtualBox OSE is distributed in the hope that it will
16 * be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18#define _WIN32_WINNT 0x0500
19#include <windows.h>
20#include "VBoxService.h"
21#include "VBoxRestore.h"
22#include <VBoxDisplay.h>
23#include <VBox/VBoxDev.h>
24#include <VBoxGuestInternal.h>
25#include <iprt/assert.h>
26#include "helpers.h"
27
28typedef struct _VBOXRESTORECONTEXT
29{
30 const VBOXSERVICEENV *pEnv;
31
32 BOOL fRDPState;
33} VBOXRESTORECONTEXT;
34
35
36static VBOXRESTORECONTEXT gCtx = {0};
37
38
39int VBoxRestoreInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread)
40{
41 dprintf(("VBoxRestoreInit\n"));
42
43 gCtx.pEnv = pEnv;
44 gCtx.fRDPState = FALSE;
45
46 VBoxRestoreCheckVRDP();
47
48 *pfStartThread = true;
49 *ppInstance = &gCtx;
50 return VINF_SUCCESS;
51}
52
53
54void VBoxRestoreDestroy(const VBOXSERVICEENV *pEnv, void *pInstance)
55{
56 dprintf(("VBoxRestoreDestroy\n"));
57 return;
58}
59
60void VBoxRestoreSession()
61{
62 VBoxRestoreCheckVRDP();
63}
64
65void VBoxRestoreCheckVRDP()
66{
67 HDC hdc;
68 BOOL ret;
69
70 /* Check VRDP activity */
71 hdc = GetDC(HWND_DESKTOP);
72
73 /* send to display driver */
74 ret = ExtEscape(hdc, VBOXESC_ISVRDPACTIVE, 0, NULL, 0, NULL);
75 dprintf(("VBoxRestoreSession -> VRDP activate state = %d\n", ret));
76 ReleaseDC(HWND_DESKTOP, hdc);
77
78 if (ret != gCtx.fRDPState)
79 {
80 DWORD cbReturned;
81
82 if (!DeviceIoControl (gCtx.pEnv->hDriver, (ret) ? IOCTL_VBOXGUEST_ENABLE_VRDP_SESSION : IOCTL_VBOXGUEST_DISABLE_VRDP_SESSION, NULL, 0, NULL, 0, &cbReturned, NULL))
83 {
84 dprintf(("VBoxRestoreThread: DeviceIOControl(CtlMask) failed, SeamlessChangeThread exited\n"));
85 }
86 gCtx.fRDPState = ret;
87 }
88}
89
90/**
91 * Thread function to wait for and process seamless mode change
92 * requests
93 */
94unsigned __stdcall VBoxRestoreThread(void *pInstance)
95{
96 VBOXRESTORECONTEXT *pCtx = (VBOXRESTORECONTEXT *)pInstance;
97 HANDLE gVBoxDriver = pCtx->pEnv->hDriver;
98 bool fTerminate = false;
99 VBoxGuestFilterMaskInfo maskInfo;
100 DWORD cbReturned;
101
102 maskInfo.u32OrMask = VMMDEV_EVENT_RESTORED;
103 maskInfo.u32NotMask = 0;
104 if (DeviceIoControl (gVBoxDriver, IOCTL_VBOXGUEST_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
105 {
106 dprintf(("VBoxRestoreThread: DeviceIOControl(CtlMask - or) succeeded\n"));
107 }
108 else
109 {
110 dprintf(("VBoxRestoreThread: DeviceIOControl(CtlMask) failed, SeamlessChangeThread exited\n"));
111 return 0;
112 }
113
114 do
115 {
116 /* wait for a seamless change event */
117 VBoxGuestWaitEventInfo waitEvent;
118 waitEvent.u32TimeoutIn = 5000;
119 waitEvent.u32EventMaskIn = VMMDEV_EVENT_RESTORED;
120 if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL))
121 {
122 dprintf(("VBoxRestoreThread: DeviceIOControl succeded\n"));
123
124 /* are we supposed to stop? */
125 if (WaitForSingleObject(pCtx->pEnv->hStopEvent, 0) == WAIT_OBJECT_0)
126 break;
127
128 dprintf(("VBoxRestoreThread: checking event\n"));
129
130 /* did we get the right event? */
131 if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_RESTORED)
132 PostMessage(gToolWindow, WM_VBOX_RESTORED, 0, 0);
133 else
134 /** @todo Don't poll, but wait for connect/disconnect events */
135 PostMessage(gToolWindow, WM_VBOX_CHECK_VRDP, 0, 0);
136 }
137 else
138 {
139 dprintf(("VBoxService: error 0 from DeviceIoControl IOCTL_VBOXGUEST_WAITEVENT\n"));
140
141 /* sleep a bit to not eat too much CPU in case the above call always fails */
142 if (WaitForSingleObject(pCtx->pEnv->hStopEvent, 10) == WAIT_OBJECT_0)
143 {
144 fTerminate = true;
145 break;
146 }
147 }
148 }
149 while (!fTerminate);
150
151 maskInfo.u32OrMask = 0;
152 maskInfo.u32NotMask = VMMDEV_EVENT_RESTORED;
153 if (DeviceIoControl (gVBoxDriver, IOCTL_VBOXGUEST_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
154 {
155 dprintf(("VBoxRestoreThread: DeviceIOControl(CtlMask - not) succeeded\n"));
156 }
157 else
158 {
159 dprintf(("VBoxRestoreThread: DeviceIOControl(CtlMask) failed\n"));
160 }
161
162 dprintf(("VBoxRestoreThread: finished seamless change request thread\n"));
163 return 0;
164}
165
166
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette