VirtualBox

source: vbox/trunk/include/VBox/ExtPack/ExtPack.h@ 36882

Last change on this file since 36882 was 35184, checked in by vboxsync, 14 years ago

ExtPack: Changed the installed callback so that it can report back error info and trigger an immediate uninstall ifhoost incompatibilities are found.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.3 KB
Line 
1/** @file
2 * VirtualBox - Extension Pack Interface.
3 */
4
5/*
6 * Copyright (C) 2010 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_ExtPack_ExtPack_h
27#define ___VBox_ExtPack_ExtPack_h
28
29#include <VBox/types.h>
30
31/** @def VBOXEXTPACK_IF_CS
32 * Selects 'class' on 'struct' for interface references.
33 * @param I The interface name
34 */
35#if defined(__cplusplus) && !defined(RT_OS_WINDOWS)
36# define VBOXEXTPACK_IF_CS(I) class I
37#else
38# define VBOXEXTPACK_IF_CS(I) struct I
39#endif
40
41VBOXEXTPACK_IF_CS(IConsole);
42VBOXEXTPACK_IF_CS(IMachine);
43VBOXEXTPACK_IF_CS(IVirtualBox);
44
45/**
46 * Module kind for use with VBOXEXTPACKHLP::pfnFindModule.
47 */
48typedef enum VBOXEXTPACKMODKIND
49{
50 /** Zero is invalid as alwasy. */
51 VBOXEXTPACKMODKIND_INVALID = 0,
52 /** Raw-mode context module. */
53 VBOXEXTPACKMODKIND_RC,
54 /** Ring-0 context module. */
55 VBOXEXTPACKMODKIND_R0,
56 /** Ring-3 context module. */
57 VBOXEXTPACKMODKIND_R3,
58 /** End of the valid values (exclusive). */
59 VBOXEXTPACKMODKIND_END,
60 /** The usual 32-bit type hack. */
61 VBOXEXTPACKMODKIND_32BIT_HACK = 0x7fffffff
62} VBOXEXTPACKMODKIND;
63
64/**
65 * Contexts returned by VBOXEXTPACKHLP::pfnGetContext.
66 */
67typedef enum VBOXEXTPACKCTX
68{
69 /** Zero is invalid as alwasy. */
70 VBOXEXTPACKCTX_INVALID = 0,
71 /** The per-user daemon process (VBoxSVC). */
72 VBOXEXTPACKCTX_PER_USER_DAEMON,
73 /** A VM process.
74 * @remarks This will also include the client processes in v4.0. */
75 VBOXEXTPACKCTX_VM_PROCESS,
76 /** A API client process.
77 * @remarks This will not be returned by VirtualBox 4.0. */
78 VBOXEXTPACKCTX_CLIENT_PROCESS,
79 /** End of the valid values (exclusive). */
80 VBOXEXTPACKCTX_END,
81 /** The usual 32-bit type hack. */
82 VBOXEXTPACKCTX_32BIT_HACK = 0x7fffffff
83} VBOXEXTPACKCTX;
84
85
86/** Pointer to const helpers passed to the VBoxExtPackRegister() call. */
87typedef const struct VBOXEXTPACKHLP *PCVBOXEXTPACKHLP;
88/**
89 * Extension pack helpers passed to VBoxExtPackRegister().
90 *
91 * This will be valid until the module is unloaded.
92 */
93typedef struct VBOXEXTPACKHLP
94{
95 /** Interface version.
96 * This is set to VBOXEXTPACKHLP_VERSION. */
97 uint32_t u32Version;
98
99 /** The VirtualBox full version (see VBOX_FULL_VERSION). */
100 uint32_t uVBoxFullVersion;
101 /** The VirtualBox subversion tree revision. */
102 uint32_t uVBoxInternalRevision;
103 /** Explicit alignment padding, must be zero. */
104 uint32_t u32Padding;
105 /** Pointer to the version string (read-only). */
106 const char *pszVBoxVersion;
107
108 /**
109 * Finds a module belonging to this extension pack.
110 *
111 * @returns VBox status code.
112 * @param pHlp Pointer to this helper structure.
113 * @param pszName The module base name.
114 * @param pszExt The extension. If NULL the default ring-3
115 * library extension will be used.
116 * @param enmKind The kind of module to locate.
117 * @param pszFound Where to return the path to the module on
118 * success.
119 * @param cbFound The size of the buffer @a pszFound points to.
120 * @param pfNative Where to return the native/agnostic indicator.
121 */
122 DECLR3CALLBACKMEMBER(int, pfnFindModule,(PCVBOXEXTPACKHLP pHlp, const char *pszName, const char *pszExt,
123 VBOXEXTPACKMODKIND enmKind,
124 char *pszFound, size_t cbFound, bool *pfNative));
125
126 /**
127 * Gets the path to a file belonging to this extension pack.
128 *
129 * @returns VBox status code.
130 * @retval VERR_INVALID_POINTER if any of the pointers are invalid.
131 * @retval VERR_BUFFER_OVERFLOW if the buffer is too small. The buffer
132 * will contain nothing.
133 *
134 * @param pHlp Pointer to this helper structure.
135 * @param pszFilename The filename.
136 * @param pszPath Where to return the path to the file on
137 * success.
138 * @param cbPath The size of the buffer @a pszPath.
139 */
140 DECLR3CALLBACKMEMBER(int, pfnGetFilePath,(PCVBOXEXTPACKHLP pHlp, const char *pszFilename, char *pszPath, size_t cbPath));
141
142 /**
143 * Gets the context the extension pack is operating in.
144 *
145 * @returns The context.
146 * @retval VBOXEXTPACKCTX_INVALID if @a pHlp is invalid.
147 *
148 * @param pHlp Pointer to this helper structure.
149 */
150 DECLR3CALLBACKMEMBER(VBOXEXTPACKCTX, pfnGetContext,(PCVBOXEXTPACKHLP pHlp));
151
152 DECLR3CALLBACKMEMBER(int, pfnReserved1,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
153 DECLR3CALLBACKMEMBER(int, pfnReserved2,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
154 DECLR3CALLBACKMEMBER(int, pfnReserved3,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
155 DECLR3CALLBACKMEMBER(int, pfnReserved4,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
156 DECLR3CALLBACKMEMBER(int, pfnReserved5,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
157 DECLR3CALLBACKMEMBER(int, pfnReserved6,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
158 DECLR3CALLBACKMEMBER(int, pfnReserved7,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
159 DECLR3CALLBACKMEMBER(int, pfnReserved8,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
160 DECLR3CALLBACKMEMBER(int, pfnReserved9,(PCVBOXEXTPACKHLP pHlp)); /**< Reserved for minor structure revisions. */
161
162 /** End of structure marker (VBOXEXTPACKHLP_VERSION). */
163 uint32_t u32EndMarker;
164} VBOXEXTPACKHLP;
165/** Current version of the VBOXEXTPACKHLP structure. */
166#define VBOXEXTPACKHLP_VERSION RT_MAKE_U32(0, 1)
167
168
169/** Pointer to the extension pack callback table. */
170typedef struct VBOXEXTPACKREG const *PCVBOXEXTPACKREG;
171/**
172 * Callback table returned by VBoxExtPackRegister.
173 *
174 * This must be valid until the extension pack main module is unloaded.
175 */
176typedef struct VBOXEXTPACKREG
177{
178 /** Interface version.
179 * This is set to VBOXEXTPACKREG_VERSION. */
180 uint32_t u32Version;
181
182 /**
183 * Hook for doing setups after the extension pack was installed.
184 *
185 * This is called in the context of the per-user service (VBoxSVC).
186 *
187 * @returns VBox status code.
188 * @retval VERR_EXTPACK_UNSUPPORTED_HOST_UNINSTALL if the extension pack
189 * requires some different host version or a prerequisite is
190 * missing from the host. Automatic uninstall will be attempted.
191 * Must set error info.
192 *
193 * @param pThis Pointer to this structure.
194 * @param pVirtualBox The VirtualBox interface.
195 * @param pErrInfo Where to return extended error information.
196 */
197 DECLCALLBACKMEMBER(int, pfnInstalled)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox,
198 PRTERRINFO pErrInfo);
199
200 /**
201 * Hook for cleaning up before the extension pack is uninstalled.
202 *
203 * This is called in the context of the per-user service (VBoxSVC).
204 *
205 * @returns VBox status code.
206 * @param pThis Pointer to this structure.
207 * @param pVirtualBox The VirtualBox interface.
208 *
209 * @todo This is currently called holding locks making pVirtualBox
210 * relatively unusable.
211 */
212 DECLCALLBACKMEMBER(int, pfnUninstall)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox);
213
214 /**
215 * Hook for doing work after the VirtualBox object is ready.
216 *
217 * This is called in the context of the per-user service (VBoxSVC). The
218 * pfnConsoleReady method is the equivalent for the VM/client process.
219 *
220 * @param pThis Pointer to this structure.
221 * @param pVirtualBox The VirtualBox interface.
222 */
223 DECLCALLBACKMEMBER(void, pfnVirtualBoxReady)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox);
224
225 /**
226 * Hook for doing work after the Console object is ready.
227 *
228 * This is called in the context of the VM/client process. The
229 * pfnVirtualBoxReady method is the equivalent for the per-user service
230 * (VBoxSVC).
231 *
232 * @param pThis Pointer to this structure.
233 * @param pConsole The Console interface.
234 */
235 DECLCALLBACKMEMBER(void, pfnConsoleReady)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IConsole) *pConsole);
236
237 /**
238 * Hook for doing work before unloading.
239 *
240 * This is called both in the context of the per-user service (VBoxSVC) and
241 * in context of the VM process (VBoxC).
242 *
243 * @param pThis Pointer to this structure.
244 *
245 * @remarks The helpers are not available at this point in time.
246 * @remarks This is not called on uninstall, then pfnUninstall will be the
247 * last callback.
248 */
249 DECLCALLBACKMEMBER(void, pfnUnload)(PCVBOXEXTPACKREG pThis);
250
251 /**
252 * Hook for changing the default VM configuration upon creation.
253 *
254 * This is called in the context of the per-user service (VBoxSVC).
255 *
256 * @returns VBox status code.
257 * @param pThis Pointer to this structure.
258 * @param pVirtualBox The VirtualBox interface.
259 * @param pMachine The machine interface.
260 */
261 DECLCALLBACKMEMBER(int, pfnVMCreated)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IVirtualBox) *pVirtualBox,
262 VBOXEXTPACK_IF_CS(IMachine) *pMachine);
263
264 /**
265 * Hook for configuring the VMM for a VM.
266 *
267 * This is called in the context of the VM process (VBoxC).
268 *
269 * @returns VBox status code.
270 * @param pThis Pointer to this structure.
271 * @param pConsole The console interface.
272 * @param pVM The VM handle.
273 */
274 DECLCALLBACKMEMBER(int, pfnVMConfigureVMM)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IConsole) *pConsole, PVM pVM);
275
276 /**
277 * Hook for doing work right before powering on the VM.
278 *
279 * This is called in the context of the VM process (VBoxC).
280 *
281 * @returns VBox status code.
282 * @param pThis Pointer to this structure.
283 * @param pConsole The console interface.
284 * @param pVM The VM handle.
285 */
286 DECLCALLBACKMEMBER(int, pfnVMPowerOn)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IConsole) *pConsole, PVM pVM);
287
288 /**
289 * Hook for doing work after powering on the VM.
290 *
291 * This is called in the context of the VM process (VBoxC).
292 *
293 * @param pThis Pointer to this structure.
294 * @param pConsole The console interface.
295 * @param pVM The VM handle. Can be NULL.
296 */
297 DECLCALLBACKMEMBER(void, pfnVMPowerOff)(PCVBOXEXTPACKREG pThis, VBOXEXTPACK_IF_CS(IConsole) *pConsole, PVM pVM);
298
299 /**
300 * Query the IUnknown interface to an object in the main module.
301 *
302 * This is can be called in any context.
303 *
304 * @returns IUnknown pointer (referenced) on success, NULL on failure.
305 * @param pThis Pointer to this structure.
306 * @param pObjectId Pointer to the object ID (UUID).
307 */
308 DECLCALLBACKMEMBER(void *, pfnQueryObject)(PCVBOXEXTPACKREG pThis, PCRTUUID pObjectId);
309
310 /** End of structure marker (VBOXEXTPACKREG_VERSION). */
311 uint32_t u32EndMarker;
312} VBOXEXTPACKREG;
313/** Current version of the VBOXEXTPACKREG structure. */
314#define VBOXEXTPACKREG_VERSION RT_MAKE_U32(0, 1)
315
316
317/**
318 * The VBoxExtPackRegister callback function.
319 *
320 * PDM will invoke this function after loading a driver module and letting
321 * the module decide which drivers to register and how to handle conflicts.
322 *
323 * @returns VBox status code.
324 * @param pHlp Pointer to the extension pack helper function
325 * table. This is valid until the module is unloaded.
326 * @param ppReg Where to return the pointer to the registration
327 * structure containing all the hooks. This structure
328 * be valid and unchanged until the module is unloaded
329 * (i.e. use some static const data for it).
330 * @param pErrInfo Where to return extended error information.
331 */
332typedef DECLCALLBACK(int) FNVBOXEXTPACKREGISTER(PCVBOXEXTPACKHLP pHlp, PCVBOXEXTPACKREG *ppReg, PRTERRINFO pErrInfo);
333/** Pointer to a FNVBOXEXTPACKREGISTER. */
334typedef FNVBOXEXTPACKREGISTER *PFNVBOXEXTPACKREGISTER;
335
336/** The name of the main module entry point. */
337#define VBOX_EXTPACK_MAIN_MOD_ENTRY_POINT "VBoxExtPackRegister"
338
339
340/**
341 * Checks if extension pack interface version is compatible.
342 *
343 * @returns true if the do, false if they don't.
344 * @param u32Provider The provider version.
345 * @param u32User The user version.
346 */
347#define VBOXEXTPACK_IS_VER_COMPAT(u32Provider, u32User) \
348 ( VBOXEXTPACK_IS_MAJOR_VER_EQUAL(u32Provider, u32User) \
349 && (int32_t)RT_LOWORD(u32Provider) >= (int32_t)RT_LOWORD(u32User) ) /* stupid casts to shut up gcc */
350
351/**
352 * Check if two extension pack interface versions has the same major version.
353 *
354 * @returns true if the do, false if they don't.
355 * @param u32Ver1 The first version number.
356 * @param u32Ver2 The second version number.
357 */
358#define VBOXEXTPACK_IS_MAJOR_VER_EQUAL(u32Ver1, u32Ver2) (RT_HIWORD(u32Ver1) == RT_HIWORD(u32Ver2))
359
360#endif
361
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