VirtualBox

source: vbox/trunk/src/VBox/Additions/common/VBoxGuestLib/Init.cpp@ 4968

Last change on this file since 4968 was 4071, checked in by vboxsync, 17 years ago

Biggest check-in ever. New source code headers for all (C) innotek files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.1 KB
Line 
1/** @file
2 *
3 * VBoxGuestLib - A support library for VirtualBox guest additions:
4 * Library initialization
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
19
20#include <VBox/VBoxGuestLib.h>
21
22#define VBGL_DECL_DATA
23#include "VBGLInternal.h"
24
25#include <iprt/string.h>
26#include <iprt/assert.h>
27
28VBGLDATA g_vbgldata;
29
30#ifndef VBGL_VBOXGUEST
31/* The guest library uses lazy initialization for VMMDev port and memory,
32 * because these values are provided by the VBoxGuest driver and it might
33 * be loaded later than other drivers.
34 * The VbglEnter checks the current library status, tries to retrive these
35 * values and fails if they are unavailable.
36 */
37static void vbglQueryVMMDevPort (void)
38{
39 int rc = VINF_SUCCESS;
40
41 VBGLDRIVER driver;
42
43 rc = vbglDriverOpen (&driver);
44
45 if (VBOX_SUCCESS(rc))
46 {
47 VBoxGuestPortInfo port;
48
49 rc = vbglDriverIOCtl (&driver, IOCTL_VBOXGUEST_GETVMMDEVPORT, &port, sizeof (port));
50
51 if (VBOX_SUCCESS (rc))
52 {
53 dprintf (("port = 0x%04X, mem = %p\n", port.portAddress, port.pVMMDevMemory));
54
55 g_vbgldata.portVMMDev = port.portAddress;
56 g_vbgldata.pVMMDevMemory = port.pVMMDevMemory;
57
58 g_vbgldata.status = VbglStatusReady;
59 }
60
61 vbglDriverClose (&driver);
62 }
63
64 dprintf (("vbglQueryVMMDevPort rc = %d\n", rc));
65}
66#endif
67
68int VbglEnter (void)
69{
70 int rc;
71
72#ifndef VBGL_VBOXGUEST
73 if (g_vbgldata.status == VbglStatusInitializing)
74 {
75 vbglQueryVMMDevPort ();
76 }
77#endif
78
79 rc = g_vbgldata.status == VbglStatusReady? VINF_SUCCESS: VERR_VBGL_NOT_INITIALIZED;
80
81 // dprintf(("VbglEnter: rc = %d\n", rc));
82
83 return rc;
84}
85
86int vbglInitCommon (void)
87{
88 int rc = VINF_SUCCESS;
89
90 memset(&g_vbgldata, 0, sizeof (VBGLDATA));
91
92 g_vbgldata.status = VbglStatusInitializing;
93
94 rc = VbglPhysHeapInit ();
95
96 if (VBOX_SUCCESS(rc))
97 {
98 /* other subsystems, none yet */
99 ;
100 }
101
102 dprintf(("vbglInitCommon: rc = %d\n", rc));
103
104 return rc;
105}
106
107DECLVBGL(void) vbglTerminateCommon (void)
108{
109 VbglPhysHeapTerminate ();
110
111 memset(&g_vbgldata, 0, sizeof (VBGLDATA));
112
113 return;
114}
115
116#ifdef VBGL_VBOXGUEST
117
118DECLVBGL(int) VbglInit (VBGLIOPORT portVMMDev, VMMDevMemory *pVMMDevMemory)
119{
120 int rc = VINF_SUCCESS;
121
122 dprintf(("vbglInit: starts g_vbgldata.status %d\n", g_vbgldata.status));
123
124 if (g_vbgldata.status == VbglStatusInitializing
125 || g_vbgldata.status == VbglStatusReady)
126 {
127 /* Initialization is already in process. */
128 return rc;
129 }
130
131 rc = vbglInitCommon ();
132
133 if (VBOX_SUCCESS(rc))
134 {
135 g_vbgldata.portVMMDev = portVMMDev;
136 g_vbgldata.pVMMDevMemory = pVMMDevMemory;
137
138 g_vbgldata.status = VbglStatusReady;
139 }
140 else
141 {
142 g_vbgldata.status = VbglStatusNotInitialized;
143 }
144
145 return rc;
146}
147
148DECLVBGL(void) VbglTerminate (void)
149{
150 vbglTerminateCommon ();
151
152 return;
153}
154
155
156#else /* !VBGL_VBOXGUEST */
157
158DECLVBGL(int) VbglInit (void)
159{
160 int rc = VINF_SUCCESS;
161
162 if (g_vbgldata.status == VbglStatusInitializing
163 || g_vbgldata.status == VbglStatusReady)
164 {
165 /* Initialization is already in process. */
166 return rc;
167 }
168
169 rc = vbglInitCommon ();
170
171 if (VBOX_SUCCESS(rc))
172 {
173 /* Try to obtain VMMDev port via IOCTL to VBoxGuest main driver. */
174 vbglQueryVMMDevPort ();
175
176#ifdef VBOX_HGCM
177 rc = vbglHGCMInit ();
178#endif /* VBOX_HGCM */
179
180 if (VBOX_FAILURE(rc))
181 {
182 vbglTerminateCommon ();
183 }
184 }
185
186 return rc;
187}
188
189DECLVBGL(void) VbglTerminate (void)
190{
191 vbglTerminateCommon ();
192
193#ifdef VBOX_HGCM
194 vbglHGCMTerminate ();
195#endif
196
197 return;
198}
199
200#endif /* !VBGL_VBOXGUEST */
201
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