VirtualBox

source: vbox/trunk/src/VBox/Main/include/GuestImpl.h

Last change on this file was 102533, checked in by vboxsync, 5 months ago

Main/Guest Control: Fixed a shutdown race when uninitializing guest sessions via IGuestSession::Close(): There we need to check if its parent object (IGuest) still is around and in a working shape, and if not, do the cleanup stuff ourselves. Renamed Guest::i_sessionDestroy() -> Guest::i_sessionRemove() to make its function more clear. This race seemed to happen in combination with FE/Qt's guest file manager every now and then. bugref:9135

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.0 KB
Line 
1/* $Id: GuestImpl.h 102533 2023-12-08 10:15:02Z vboxsync $ */
2/** @file
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28#ifndef MAIN_INCLUDED_GuestImpl_h
29#define MAIN_INCLUDED_GuestImpl_h
30#ifndef RT_WITHOUT_PRAGMA_ONCE
31# pragma once
32#endif
33
34#include "GuestWrap.h"
35#include "VirtualBoxBase.h"
36#include <iprt/list.h>
37#include <iprt/time.h>
38#include <VBox/ostypes.h>
39#include <VBox/param.h>
40#include <VBox/vmm/stam.h>
41
42#include "AdditionsFacilityImpl.h"
43#ifdef VBOX_WITH_GUEST_CONTROL
44# include "GuestCtrlImplPrivate.h"
45# include "GuestSessionImpl.h"
46#endif
47#ifdef VBOX_WITH_DRAG_AND_DROP
48# include "GuestDnDSourceImpl.h"
49# include "GuestDnDTargetImpl.h"
50#endif
51#include "EventImpl.h"
52#include "HGCM.h"
53
54typedef enum
55{
56 GUESTSTATTYPE_CPUUSER = 0,
57 GUESTSTATTYPE_CPUKERNEL = 1,
58 GUESTSTATTYPE_CPUIDLE = 2,
59 GUESTSTATTYPE_MEMTOTAL = 3,
60 GUESTSTATTYPE_MEMFREE = 4,
61 GUESTSTATTYPE_MEMBALLOON = 5,
62 GUESTSTATTYPE_MEMCACHE = 6,
63 GUESTSTATTYPE_PAGETOTAL = 7,
64 GUESTSTATTYPE_PAGEFREE = 8,
65 GUESTSTATTYPE_MAX = 9
66} GUESTSTATTYPE;
67
68class Console;
69
70class ATL_NO_VTABLE Guest :
71 public GuestWrap
72{
73public:
74
75 DECLARE_COMMON_CLASS_METHODS (Guest)
76
77 HRESULT FinalConstruct();
78 void FinalRelease();
79
80 // Public initializer/uninitializer for internal purposes only.
81 HRESULT init(Console *aParent);
82 void uninit();
83
84
85public:
86 /** @name Static internal methods.
87 * @{ */
88#ifdef VBOX_WITH_GUEST_CONTROL
89 /** Static callback for handling guest control notifications. */
90 static DECLCALLBACK(int) i_notifyCtrlDispatcher(void *pvExtension, uint32_t u32Function, void *pvData, uint32_t cbData);
91#endif
92 static DECLCALLBACK(void) i_staticUpdateStats(RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
93 /** @} */
94
95public:
96 /** @name Public internal methods.
97 * @{ */
98 void i_enableVMMStatistics(BOOL aEnable) { mCollectVMMStats = aEnable; };
99 void i_setAdditionsInfo(const com::Utf8Str &aInterfaceVersion, VBOXOSTYPE aOsType);
100 void i_setAdditionsInfo2(uint32_t a_uFullVersion, const char *a_pszName, uint32_t a_uRevision, uint32_t a_fFeatures);
101 bool i_facilityIsActive(VBoxGuestFacilityType enmFacility);
102 bool i_facilityUpdate(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacilityStatus a_enmStatus,
103 uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
104 ComObjPtr<Console> i_getConsole(void) { return mParent; }
105 void i_setAdditionsStatus(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacilityStatus a_enmStatus,
106 uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS);
107 void i_onUserStateChanged(const Utf8Str &aUser, const Utf8Str &aDomain, VBoxGuestUserState enmState,
108 const uint8_t *puDetails, uint32_t cbDetails);
109 void i_setSupportedFeatures(uint32_t aCaps);
110 HRESULT i_setStatistic(ULONG aCpuId, GUESTSTATTYPE enmType, ULONG aVal);
111 BOOL i_isPageFusionEnabled();
112 void i_setCpuCount(uint32_t aCpus) { mCpus = aCpus; }
113 static HRESULT i_setErrorStatic(HRESULT aResultCode, const char *aText, ...)
114 {
115 va_list va;
116 va_start(va, aText);
117 HRESULT hrc = setErrorInternalV(aResultCode, getStaticClassIID(), getStaticComponentName(), aText, va, false, true);
118 va_end(va);
119 return hrc;
120 }
121 uint32_t i_getAdditionsRevision(void) { return mData.mAdditionsRevision; }
122 uint32_t i_getAdditionsVersion(void) { return mData.mAdditionsVersionFull; }
123 VBOXOSTYPE i_getGuestOSType(void) const { return mData.mOSType; }
124 /** Checks if the guest OS type is part of the windows NT family. */
125 bool i_isGuestInWindowsNtFamily(void) const
126 {
127 return mData.mOSType < VBOXOSTYPE_OS2 && mData.mOSType >= VBOXOSTYPE_WinNT;
128 }
129#ifdef VBOX_WITH_GUEST_CONTROL
130 int i_dispatchToSession(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
131 int i_sessionCreate(const GuestSessionStartupInfo &ssInfo, const GuestCredentials &guestCreds,
132 ComObjPtr<GuestSession> &pGuestSession);
133 int i_sessionRemove(uint32_t uSessionID);
134 inline bool i_sessionExists(uint32_t uSessionID);
135 /** Returns the VBOX_GUESTCTRL_GF_0_XXX mask reported by the guest. */
136 uint64_t i_getGuestControlFeatures0() const { return mData.mfGuestFeatures0; }
137 /** Returns the VBOX_GUESTCTRL_GF_1_XXX mask reported by the guest. */
138 uint64_t i_getGuestControlFeatures1() const { return mData.mfGuestFeatures1; }
139#endif
140 /** @} */
141
142private:
143
144 // wrapped IGuest properties
145 HRESULT getOSTypeId(com::Utf8Str &aOSTypeId);
146 HRESULT getAdditionsRunLevel(AdditionsRunLevelType_T *aAdditionsRunLevel);
147 HRESULT getAdditionsVersion(com::Utf8Str &aAdditionsVersion);
148 HRESULT getAdditionsRevision(ULONG *aAdditionsRevision);
149 HRESULT getDnDSource(ComPtr<IGuestDnDSource> &aDnDSource);
150 HRESULT getDnDTarget(ComPtr<IGuestDnDTarget> &aDnDTarget);
151 HRESULT getEventSource(ComPtr<IEventSource> &aEventSource);
152 HRESULT getFacilities(std::vector<ComPtr<IAdditionsFacility> > &aFacilities);
153 HRESULT getSessions(std::vector<ComPtr<IGuestSession> > &aSessions);
154 HRESULT getMemoryBalloonSize(ULONG *aMemoryBalloonSize);
155 HRESULT setMemoryBalloonSize(ULONG aMemoryBalloonSize);
156 HRESULT getStatisticsUpdateInterval(ULONG *aStatisticsUpdateInterval);
157 HRESULT setStatisticsUpdateInterval(ULONG aStatisticsUpdateInterval);
158 HRESULT internalGetStatistics(ULONG *aCpuUser,
159 ULONG *aCpuKernel,
160 ULONG *aCpuIdle,
161 ULONG *aMemTotal,
162 ULONG *aMemFree,
163 ULONG *aMemBalloon,
164 ULONG *aMemShared,
165 ULONG *aMemCache,
166 ULONG *aPagedTotal,
167 ULONG *aMemAllocTotal,
168 ULONG *aMemFreeTotal,
169 ULONG *aMemBalloonTotal,
170 ULONG *aMemSharedTotal);
171 HRESULT getFacilityStatus(AdditionsFacilityType_T aFacility,
172 LONG64 *aTimestamp,
173 AdditionsFacilityStatus_T *aStatus);
174 HRESULT getAdditionsStatus(AdditionsRunLevelType_T aLevel,
175 BOOL *aActive);
176 HRESULT setCredentials(const com::Utf8Str &aUserName,
177 const com::Utf8Str &aPassword,
178 const com::Utf8Str &aDomain,
179 BOOL aAllowInteractiveLogon);
180
181 // wrapped IGuest methods
182 HRESULT createSession(const com::Utf8Str &aUser,
183 const com::Utf8Str &aPassword,
184 const com::Utf8Str &aDomain,
185 const com::Utf8Str &aSessionName,
186 ComPtr<IGuestSession> &aGuestSession);
187
188 HRESULT findSession(const com::Utf8Str &aSessionName,
189 std::vector<ComPtr<IGuestSession> > &aSessions);
190 HRESULT shutdown(const std::vector<GuestShutdownFlag_T> &aFlags);
191 HRESULT updateGuestAdditions(const com::Utf8Str &aSource,
192 const std::vector<com::Utf8Str> &aArguments,
193 const std::vector<AdditionsUpdateFlag_T> &aFlags,
194 ComPtr<IProgress> &aProgress);
195
196
197 /** @name Private internal methods.
198 * @{ */
199 void i_updateStats(uint64_t iTick);
200 static DECLCALLBACK(int) i_staticEnumStatsCallback(const char *pszName, STAMTYPE enmType, void *pvSample,
201 STAMUNIT enmUnit, const char *pszUnit, STAMVISIBILITY enmVisiblity,
202 const char *pszDesc, void *pvUser);
203
204 /** @} */
205
206 typedef std::map< AdditionsFacilityType_T, ComObjPtr<AdditionsFacility> > FacilityMap;
207 typedef std::map< AdditionsFacilityType_T, ComObjPtr<AdditionsFacility> >::iterator FacilityMapIter;
208 typedef std::map< AdditionsFacilityType_T, ComObjPtr<AdditionsFacility> >::const_iterator FacilityMapIterConst;
209
210#ifdef VBOX_WITH_GUEST_CONTROL
211 /** Map for keeping the guest sessions. The primary key marks the guest session ID. */
212 typedef std::map <uint32_t, ComObjPtr<GuestSession> > GuestSessions;
213#endif
214
215 struct Data
216 {
217 Data() : mOSType(VBOXOSTYPE_Unknown), mAdditionsRunLevel(AdditionsRunLevelType_None)
218 , mAdditionsVersionFull(0), mAdditionsRevision(0), mAdditionsFeatures(0)
219#ifdef VBOX_WITH_GUEST_CONTROL
220 , mfGuestFeatures0(0), mfGuestFeatures1(0)
221#endif
222 { }
223
224 VBOXOSTYPE mOSType; /**@< For internal used. VBOXOSTYPE_Unknown if not reported. */
225 Utf8Str mOSTypeId;
226 FacilityMap mFacilityMap;
227 AdditionsRunLevelType_T mAdditionsRunLevel;
228 uint32_t mAdditionsVersionFull;
229 Utf8Str mAdditionsVersionNew;
230 uint32_t mAdditionsRevision;
231 uint32_t mAdditionsFeatures;
232 Utf8Str mInterfaceVersion;
233#ifdef VBOX_WITH_GUEST_CONTROL
234 GuestSessions mGuestSessions;
235 /** Guest control features (reported by the guest), VBOX_GUESTCTRL_GF_0_XXX. */
236 uint64_t mfGuestFeatures0;
237 /** Guest control features (reported by the guest), VBOX_GUESTCTRL_GF_1_XXX. */
238 uint64_t mfGuestFeatures1;
239#endif
240 } mData;
241
242 ULONG mMemoryBalloonSize;
243 ULONG mStatUpdateInterval; /**< In seconds. */
244 uint64_t mNetStatRx;
245 uint64_t mNetStatTx;
246 uint64_t mNetStatLastTs;
247 ULONG mCurrentGuestStat[GUESTSTATTYPE_MAX];
248 ULONG mCurrentGuestCpuUserStat[VMM_MAX_CPU_COUNT];
249 ULONG mCurrentGuestCpuKernelStat[VMM_MAX_CPU_COUNT];
250 ULONG mCurrentGuestCpuIdleStat[VMM_MAX_CPU_COUNT];
251 ULONG mVmValidStats;
252 BOOL mCollectVMMStats;
253 BOOL mfPageFusionEnabled;
254 uint32_t mCpus;
255
256 const ComObjPtr<Console> mParent;
257
258 /**
259 * This can safely be used without holding any locks.
260 * An AutoCaller suffices to prevent it being destroy while in use and
261 * internally there is a lock providing the necessary serialization.
262 */
263 const ComObjPtr<EventSource> mEventSource;
264#ifdef VBOX_WITH_GUEST_CONTROL
265 /** General extension callback for guest control. */
266 HGCMSVCEXTHANDLE mhExtCtrl;
267#endif
268
269#ifdef VBOX_WITH_DRAG_AND_DROP
270 /** The guest's DnD source. */
271 const ComObjPtr<GuestDnDSource> mDnDSource;
272 /** The guest's DnD target. */
273 const ComObjPtr<GuestDnDTarget> mDnDTarget;
274#endif
275
276 RTTIMERLR mStatTimer;
277 uint32_t mMagic; /** @todo r=andy Rename this to something more meaningful. */
278};
279#define GUEST_MAGIC 0xCEED2006u /** @todo r=andy Not very well defined!? */
280
281#endif /* !MAIN_INCLUDED_GuestImpl_h */
282
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use