VirtualBox

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

Last change on this file since 7104 was 5999, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change.

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 (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will 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