VBoxGuestR3LibModule.cpp revision 4f4da0da54c6ffb166be2538d43cd0f79e0eb97c
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync/* $Id$ */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/** @file
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync * VBoxGuestR3Lib - Ring-3 Support Library for VirtualBox guest additions, Shared modules.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/*
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Copyright (C) 2007-2010 Oracle Corporation
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * available from http://www.virtualbox.org. This file is free software;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * you can redistribute it and/or modify it under the terms of the GNU
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * General Public License (GPL) as published by the Free Software
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * The contents of this file may alternatively be used under the terms
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * of the Common Development and Distribution License Version 1.0
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * VirtualBox OSE distribution, in which case the provisions of the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * CDDL are applicable instead of those of the GPL.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * You may elect to license modified versions of this file under the
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * terms and conditions of either the GPL or the CDDL or both.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/*******************************************************************************
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync* Header Files *
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync*******************************************************************************/
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync#include "VBGLR3Internal.h"
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync#include <iprt/mem.h>
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync#include <iprt/string.h>
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync/**
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync * Registers a new shared module for the VM
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync *
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync * @returns IPRT status code.
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync * @param pszModuleName Module name
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pszVersion Module version
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param GCBaseAddr Module base address
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param cbModule Module size
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync * @param cRegions Number of shared region descriptors
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pRegions Shared region(s)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncVBGLR3DECL(int) VbglR3RegisterSharedModule(char *pszModuleName, char *pszVersion,
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync RTGCPTR64 GCBaseAddr, uint32_t cbModule,
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync unsigned cRegions, VMMDEVSHAREDREGIONDESC *pRegions)
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync{
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync VMMDevSharedModuleRegistrationRequest *pReq;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync int rc;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync /* Sanity check. */
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync AssertReturn(cRegions < VMMDEVSHAREDREGIONDESC_MAX, VERR_INVALID_PARAMETER);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync pReq = (VMMDevSharedModuleRegistrationRequest *)RTMemAllocZ(RT_OFFSETOF(VMMDevSharedModuleRegistrationRequest, aRegions[cRegions]));
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync AssertReturn(pReq, VERR_NO_MEMORY);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync vmmdevInitRequest(&pReq->header, VMMDevReq_RegisterSharedModule);
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync pReq->GCBaseAddr = GCBaseAddr;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync pReq->cbModule = cbModule;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync pReq->cRegions = cRegions;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync#ifdef RT_OS_WINDOWS
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync# if ARCH_BITS == 32
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync pReq->enmGuestOS = VBOXOSFAMILY_Windows32;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync# else
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync pReq->enmGuestOS = VBOXOSFAMILY_Windows64;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync# endif
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync#else
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync /** todo */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync pReq->enmGuestOS = VBOXOSFAMILY_unknown;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync#endif
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync for (unsigned i = 0; i < cRegions; i++)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync pReq->aRegions[i] = pRegions[i];
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync if ( RTStrCopy(pReq->szName, sizeof(pReq->szName), pszModuleName) != VINF_SUCCESS
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync || RTStrCopy(pReq->szVersion, sizeof(pReq->szVersion), pszVersion) != VINF_SUCCESS)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync {
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync rc = VERR_BUFFER_OVERFLOW;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync goto end;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync rc = vbglR3GRPerform(&pReq->header);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncend:
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync RTMemFree(pReq);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return rc;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Unregisters a shared module for the VM
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync * @returns IPRT status code.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pszModuleName Module name
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param pszVersion Module version
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param GCBaseAddr Module base address
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * @param cbModule Module size
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncVBGLR3DECL(int) VbglR3UnregisterSharedModule(char *pszModuleName, char *pszVersion, RTGCPTR64 GCBaseAddr, uint32_t cbModule)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync VMMDevSharedModuleUnregistrationRequest Req;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync vmmdevInitRequest(&Req.header, VMMDevReq_UnregisterSharedModule);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Req.GCBaseAddr = GCBaseAddr;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync Req.cbModule = cbModule;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync if ( RTStrCopy(Req.szName, sizeof(Req.szName), pszModuleName) != VINF_SUCCESS
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync || RTStrCopy(Req.szVersion, sizeof(Req.szVersion), pszVersion) != VINF_SUCCESS)
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync {
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync return VERR_BUFFER_OVERFLOW;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync }
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return vbglR3GRPerform(&Req.header);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync/**
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync * Checks registered modules for shared pages
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync *
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync * @returns IPRT status code.
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync */
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsyncVBGLR3DECL(int) VbglR3CheckSharedModules()
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync{
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync VMMDevSharedModuleCheckRequest Req;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync vmmdevInitRequest(&Req.header, VMMDevReq_CheckSharedModules);
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync return vbglR3GRPerform(&Req.header);
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync}
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync/**
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync * Checks if page sharing is enabled.
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync *
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync * @returns true/false enabled/disabled
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync */
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsyncVBGLR3DECL(bool) VbglR3PageSharingIsEnabled()
32ded45b3caba42c8a2315a20bbfabb513fa54c1vboxsync{
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync VMMDevPageSharingStatusRequest Req;
9148e7ca5f9ee1d467112d347bfb2de2b97254d2vboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync vmmdevInitRequest(&Req.header, VMMDevReq_GetPageSharingStatus);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync int rc = vbglR3GRPerform(&Req.header);
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync if (RT_SUCCESS(rc))
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return Req.fEnabled;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync return false;
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync}
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync
dc23707aec4dc2ce2c6b6f51af21eef72bb8bf2evboxsync