1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
/* $Id: VBoxServiceInternal.h $ */
/** @file
* VBoxService - Guest Additions Services.
*/
/*
* Copyright (C) 2007-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#ifndef ___VBoxServiceInternal_h
#define ___VBoxServiceInternal_h
#include <stdio.h>
#ifdef RT_OS_WINDOWS
# include <Windows.h>
# include <process.h> /* Needed for file version information. */
#endif
#include <iprt/list.h>
#include <iprt/critsect.h>
#include <VBox/VBoxGuestLib.h>
#include <VBox/HostServices/GuestControlSvc.h>
/**
* A service descriptor.
*/
typedef struct
{
/** The short service name. */
const char *pszName;
/** The longer service name. */
const char *pszDescription;
/** The usage options stuff for the --help screen. */
const char *pszUsage;
/** The option descriptions for the --help screen. */
const char *pszOptions;
/**
* Called before parsing arguments.
* @returns VBox status code.
*/
DECLCALLBACKMEMBER(int, pfnPreInit)(void);
/**
* Tries to parse the given command line option.
*
* @returns 0 if we parsed, -1 if it didn't and anything else means exit.
* @param ppszShort If not NULL it points to the short option iterator. a short argument.
* If NULL examine argv[*pi].
* @param argc The argument count.
* @param argv The argument vector.
* @param pi The argument vector index. Update if any value(s) are eaten.
*/
DECLCALLBACKMEMBER(int, pfnOption)(const char **ppszShort, int argc, char **argv, int *pi);
/**
* Called before parsing arguments.
* @returns VBox status code.
*/
DECLCALLBACKMEMBER(int, pfnInit)(void);
/** Called from the worker thread.
*
* @returns VBox status code.
* @retval VINF_SUCCESS if exitting because *pfTerminate was set.
* @param pfTerminate Pointer to a per service termination flag to check
* before and after blocking.
*/
DECLCALLBACKMEMBER(int, pfnWorker)(bool volatile *pfTerminate);
/**
* Stop an service.
*/
DECLCALLBACKMEMBER(void, pfnStop)(void);
/**
* Does termination cleanups.
*
* @remarks This may be called even if pfnInit hasn't been called!
*/
DECLCALLBACKMEMBER(void, pfnTerm)(void);
} VBOXSERVICE;
/** Pointer to a VBOXSERVICE. */
typedef VBOXSERVICE *PVBOXSERVICE;
/** Pointer to a const VBOXSERVICE. */
typedef VBOXSERVICE const *PCVBOXSERVICE;
/** The service name.
* @note Used on windows to name the service as well as the global mutex. */
#define VBOXSERVICE_NAME "VBoxService"
#ifdef RT_OS_WINDOWS
/** The friendly service name. */
# define VBOXSERVICE_FRIENDLY_NAME "VirtualBox Guest Additions Service"
/** The service description (only W2K+ atm) */
# define VBOXSERVICE_DESCRIPTION "Manages VM runtime information, time synchronization, guest control execution and miscellaneous utilities for guest operating systems."
/** The following constant may be defined by including NtStatus.h. */
# define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#endif /* RT_OS_WINDOWS */
#ifdef VBOX_WITH_GUEST_PROPS
/**
* A guest property cache.
*/
typedef struct VBOXSERVICEVEPROPCACHE
{
/** The client ID for HGCM communication. */
uint32_t uClientID;
/** Head in a list of VBOXSERVICEVEPROPCACHEENTRY nodes. */
RTLISTANCHOR NodeHead;
/** Critical section for thread-safe use. */
RTCRITSECT CritSect;
} VBOXSERVICEVEPROPCACHE;
/** Pointer to a guest property cache. */
typedef VBOXSERVICEVEPROPCACHE *PVBOXSERVICEVEPROPCACHE;
/**
* An entry in the property cache (VBOXSERVICEVEPROPCACHE).
*/
typedef struct VBOXSERVICEVEPROPCACHEENTRY
{
/** Node to successor.
* @todo r=bird: This is not really the node to the successor, but
* rather the OUR node in the list. If it helps, remember that
* its a doubly linked list. */
RTLISTNODE NodeSucc;
/** Name (and full path) of guest property. */
char *pszName;
/** The last value stored (for reference). */
char *pszValue;
/** Reset value to write if property is temporary. If NULL, it will be
* deleted. */
char *pszValueReset;
/** Flags. */
uint32_t fFlags;
} VBOXSERVICEVEPROPCACHEENTRY;
/** Pointer to a cached guest property. */
typedef VBOXSERVICEVEPROPCACHEENTRY *PVBOXSERVICEVEPROPCACHEENTRY;
#endif /* VBOX_WITH_GUEST_PROPS */
RT_C_DECLS_BEGIN
extern char *g_pszProgName;
extern int g_cVerbosity;
extern char g_szLogFile[RTPATH_MAX + 128];
extern uint32_t g_DefaultInterval;
extern VBOXSERVICE g_TimeSync;
extern VBOXSERVICE g_Clipboard;
extern VBOXSERVICE g_Control;
extern VBOXSERVICE g_VMInfo;
extern VBOXSERVICE g_CpuHotPlug;
#ifdef VBOXSERVICE_MANAGEMENT
extern VBOXSERVICE g_MemBalloon;
extern VBOXSERVICE g_VMStatistics;
#endif
#ifdef VBOXSERVICE_PAGE_SHARING
extern VBOXSERVICE g_PageSharing;
#endif
#ifdef VBOX_WITH_SHARED_FOLDERS
extern VBOXSERVICE g_AutoMount;
#endif
#ifdef DEBUG
extern RTCRITSECT g_csLog; /* For guest process stdout dumping. */
#endif
extern RTEXITCODE VBoxServiceSyntax(const char *pszFormat, ...);
extern RTEXITCODE VBoxServiceError(const char *pszFormat, ...);
extern void VBoxServiceVerbose(int iLevel, const char *pszFormat, ...);
extern int VBoxServiceArgUInt32(int argc, char **argv, const char *psz, int *pi, uint32_t *pu32,
uint32_t u32Min, uint32_t u32Max);
extern int VBoxServiceStartServices(void);
extern int VBoxServiceStopServices(void);
extern void VBoxServiceMainWait(void);
extern int VBoxServiceReportStatus(VBoxGuestFacilityStatus enmStatus);
#ifdef RT_OS_WINDOWS
extern RTEXITCODE VBoxServiceWinInstall(void);
extern RTEXITCODE VBoxServiceWinUninstall(void);
extern RTEXITCODE VBoxServiceWinEnterCtrlDispatcher(void);
extern void VBoxServiceWinSetStopPendingStatus(uint32_t uCheckPoint);
#endif
#ifdef VBOXSERVICE_TOOLBOX
extern bool VBoxServiceToolboxMain(int argc, char **argv, RTEXITCODE *prcExit);
#endif
#ifdef RT_OS_WINDOWS
# ifdef VBOX_WITH_GUEST_PROPS
extern int VBoxServiceVMInfoWinWriteUsers(PVBOXSERVICEVEPROPCACHE pCache, char **ppszUserList, uint32_t *pcUsersInList);
extern int VBoxServiceWinGetComponentVersions(uint32_t uiClientID);
# endif /* VBOX_WITH_GUEST_PROPS */
#endif /* RT_OS_WINDOWS */
#ifdef VBOXSERVICE_MANAGEMENT
extern uint32_t VBoxServiceBalloonQueryPages(uint32_t cbPage);
#endif
#if defined(VBOXSERVICE_PAGE_SHARING)
extern RTEXITCODE VBoxServicePageSharingInitFork(void);
#endif
extern int VBoxServiceVMInfoSignal(void);
RT_C_DECLS_END
#endif
|