VirtualBox

source: vbox/trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest2.cpp@ 35263

Last change on this file since 35263 was 32435, checked in by vboxsync, 14 years ago

VBoxGuest2.cpp: Missing include file.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.4 KB
Line 
1/* $Id: VBoxGuest2.cpp 32435 2010-09-12 23:15:26Z vboxsync $ */
2/** @file
3 * VBoxGuest - Guest Additions Driver, bits shared with the windows code.
4 */
5
6/*
7 * Copyright (C) 2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#include <iprt/string.h>
22#include <VBox/err.h>
23#include <VBox/log.h>
24#include <VBox/VBoxGuestLib.h>
25#include <VBox/version.h>
26#if defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD)
27# include "revision-generated.h"
28#endif
29#include "VBoxGuest2.h"
30
31/** @todo Remove and merge this file with VBoxGuest.cpp when the Windows driver
32 * also will be built from the common sources. */
33
34/**
35 * Report the guest information to the host.
36 *
37 * @returns IPRT status code.
38 * @param enmOSType The OS type to report.
39 */
40int VBoxGuestReportGuestInfo(VBOXOSTYPE enmOSType)
41{
42 /*
43 * Allocate and fill in the two guest info reports.
44 */
45 VMMDevReportGuestInfo2 *pReqInfo2 = NULL;
46 VMMDevReportGuestInfo *pReqInfo1 = NULL;
47 int rc = VbglGRAlloc((VMMDevRequestHeader **)&pReqInfo2, sizeof (VMMDevReportGuestInfo2), VMMDevReq_ReportGuestInfo2);
48 Log(("VBoxGuestReportGuestInfo: VbglGRAlloc VMMDevReportGuestInfo2 completed with rc=%Rrc\n", rc));
49 if (RT_SUCCESS(rc))
50 {
51 pReqInfo2->guestInfo.additionsMajor = VBOX_VERSION_MAJOR;
52 pReqInfo2->guestInfo.additionsMinor = VBOX_VERSION_MINOR;
53 pReqInfo2->guestInfo.additionsBuild = VBOX_VERSION_BUILD;
54 pReqInfo2->guestInfo.additionsRevision = VBOX_SVN_REV;
55 pReqInfo2->guestInfo.additionsFeatures = 0; /* (no features defined yet) */
56 RTStrCopy(pReqInfo2->guestInfo.szName, sizeof(pReqInfo2->guestInfo.szName), VBOX_VERSION_STRING);
57
58 rc = VbglGRAlloc((VMMDevRequestHeader **)&pReqInfo1, sizeof (VMMDevReportGuestInfo), VMMDevReq_ReportGuestInfo);
59 Log(("VBoxGuestReportGuestInfo: VbglGRAlloc VMMDevReportGuestInfo completed with rc=%Rrc\n", rc));
60 if (RT_SUCCESS(rc))
61 {
62 pReqInfo1->guestInfo.interfaceVersion = VMMDEV_VERSION;
63 pReqInfo1->guestInfo.osType = enmOSType;
64
65 /*
66 * There are two protocols here:
67 * 1. Info2 + Info1. Supported by >=3.2.51.
68 * 2. Info1 and optionally Info2. The old protocol.
69 *
70 * We try protocol 1 first. It will fail with VERR_NOT_SUPPORTED
71 * if not supported by the VMMDev (message ordering requirement).
72 */
73 rc = VbglGRPerform(&pReqInfo2->header);
74 Log(("VBoxGuestReportGuestInfo: VbglGRPerform VMMDevReportGuestInfo2 completed with rc=%Rrc\n", rc));
75 if (RT_SUCCESS(rc))
76 {
77 rc = VbglGRPerform(&pReqInfo1->header);
78 Log(("VBoxGuestReportGuestInfo: VbglGRPerform VMMDevReportGuestInfo completed with rc=%Rrc\n", rc));
79 }
80 else if ( rc == VERR_NOT_SUPPORTED
81 || rc == VERR_NOT_IMPLEMENTED)
82 {
83 rc = VbglGRPerform(&pReqInfo1->header);
84 Log(("VBoxGuestReportGuestInfo: VbglGRPerform VMMDevReportGuestInfo completed with rc=%Rrc\n", rc));
85 if (RT_SUCCESS(rc))
86 {
87 rc = VbglGRPerform(&pReqInfo2->header);
88 Log(("VBoxGuestReportGuestInfo: VbglGRPerform VMMDevReportGuestInfo2 completed with rc=%Rrc\n", rc));
89 if (rc == VERR_NOT_IMPLEMENTED)
90 rc = VINF_SUCCESS;
91 }
92 }
93 VbglGRFree(&pReqInfo1->header);
94 }
95 VbglGRFree(&pReqInfo2->header);
96 }
97
98 return rc;
99}
100
101
102/**
103 * Report the guest driver status to the host.
104 *
105 * @returns IPRT status code.
106 * @param fActive Flag whether the driver is now active or not.
107 */
108int VBoxGuestReportDriverStatus(bool fActive)
109{
110 /*
111 * Report guest status of the VBox driver to the host.
112 */
113 VMMDevReportGuestStatus *pReq2 = NULL;
114 int rc = VbglGRAlloc((VMMDevRequestHeader **)&pReq2, sizeof(*pReq2), VMMDevReq_ReportGuestStatus);
115 Log(("VBoxGuestReportDriverStatus: VbglGRAlloc VMMDevReportGuestStatus completed with rc=%Rrc\n", rc));
116 if (RT_SUCCESS(rc))
117 {
118 pReq2->guestStatus.facility = VBoxGuestStatusFacility_VBoxGuestDriver;
119 pReq2->guestStatus.status = fActive ?
120 VBoxGuestStatusCurrent_Active
121 : VBoxGuestStatusCurrent_Inactive;
122 pReq2->guestStatus.flags = 0;
123 rc = VbglGRPerform(&pReq2->header);
124 Log(("VBoxGuestReportDriverStatus: VbglGRPerform VMMDevReportGuestStatus completed with fActive=%d, rc=%Rrc\n",
125 fActive ? 1 : 0, rc));
126 if (rc == VERR_NOT_IMPLEMENTED) /* Compatibility with older hosts. */
127 rc = VINF_SUCCESS;
128 VbglGRFree(&pReq2->header);
129 }
130
131 return rc;
132}
133
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use