9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox XPDM Miniport IOCTL handlers
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "VBoxMPInternal.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/VBoxMPCommon.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/Hardware/VBoxVideoVBE.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/VBoxGuestLib.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/VBoxVideo.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Note: in/out parameters passed to VBoxDrvStartIO point to the same memory location.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * That means we can't read anything from the input one after first write to the output.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Defines below are somewhat silly way to catch possible misuse at compile time.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXMPIOCTL_HIDE(_var) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync { \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVOID (_var); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync (VOID)(_var)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXMPIOCTL_UNHIDE() \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_RESET_DEVICE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Reset device to a state it comes at system boot time.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @todo It doesn't do anythyng at the moment, but it looks like the same as VBoxDrvResetHW.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPResetDevice(PVBOXMP_DEVEXT pExt, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pExt->iDevice>0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("skipping non-primary display %d", pExt->iDevice));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#if 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Don't disable the extended video mode. This would only switch the video mode
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * to <current width> x <current height> x 0 bpp which is not what we want. And
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * even worse, it causes an disturbing additional mode switch */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VideoPortWritePortUshort((PUSHORT)VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_ENABLE);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VideoPortWritePortUshort((PUSHORT)VBE_DISPI_IOPORT_DATA, VBE_DISPI_DISABLED);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Tell the host that we no longer support graphics in the additions */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* @todo VBoxMPSetGraphicsCap(FALSE); */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_MAP_VIDEO_MEMORY.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Maps FrameBuffer and video RAM to a caller's virtual adress space.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPMapVideoMemory(PVBOXMP_DEVEXT pExt, PVIDEO_MEMORY pRequestedAddress,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVIDEO_MEMORY_INFORMATION pMapInfo, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PHYSICAL_ADDRESS framebuffer;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG inIoSpace = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("framebuffer offset %#x", pExt->ulFrameBufferOffset));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
4c98b8b05f3783351cf256cc90cd4478fb28b62bvboxsync framebuffer.QuadPart = VBoxCommonFromDeviceExt(pExt)->phVRAM.QuadPart + pExt->ulFrameBufferOffset;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMapInfo->VideoRamBase = pRequestedAddress->RequestedVirtualAddress;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXMPIOCTL_HIDE(pRequestedAddress);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMapInfo->VideoRamLength = pExt->pPrimary->u.primary.ulMaxFrameBufferSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync pStatus->Status = VideoPortMapMemory(pExt, framebuffer, &pMapInfo->VideoRamLength,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync &inIoSpace, &pMapInfo->VideoRamBase);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (NO_ERROR == pStatus->Status)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMapInfo->FrameBufferBase = (PUCHAR)pMapInfo->VideoRamBase;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMapInfo->FrameBufferLength =
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxMPXpdmCurrentVideoMode(pExt)->VisScreenHeight*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxMPXpdmCurrentVideoMode(pExt)->ScreenStride;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VIDEO_MEMORY_INFORMATION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Save the new framebuffer size */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pExt->ulFrameBufferSize = pMapInfo->FrameBufferLength;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMIAreaInitialize(&pExt->areaDisplay, pMapInfo->FrameBufferBase,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pMapInfo->FrameBufferLength, pExt->ulFrameBufferOffset);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXMPIOCTL_UNHIDE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NO_ERROR == pStatus->Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_UNMAP_VIDEO_MEMORY.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Unmaps previously mapped FrameBuffer and video RAM from caller's virtual adress space.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPUnmapVideoMemory(PVBOXMP_DEVEXT pExt, PVIDEO_MEMORY VideoMemory, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HGSMIAreaClear(&pExt->areaDisplay);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = VideoPortUnmapMemory(pExt, VideoMemory->RequestedVirtualAddress, NULL);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_SHARE_VIDEO_MEMORY.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Maps FrameBuffer as a linear frame buffer to a caller's virtual adress space. (obsolete).
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPShareVideoMemory(PVBOXMP_DEVEXT pExt, PVIDEO_SHARE_MEMORY pShareMem,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVIDEO_SHARE_MEMORY_INFORMATION pShareMemInfo, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PHYSICAL_ADDRESS shareAddress;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG inIoSpace = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG offset, size;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVOID virtualAddress;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG ulMaxFBSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ulMaxFBSize = pExt->pPrimary->u.primary.ulMaxFrameBufferSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync offset = pShareMem->ViewOffset;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync size = pShareMem->ViewSize;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync virtualAddress = pShareMem->ProcessHandle;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXMPIOCTL_HIDE(pShareMem);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if ((offset>ulMaxFBSize) || ((offset+size)>ulMaxFBSize))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("share failed offset:size(%#x:%#x) > %#x fb size.", offset, size, ulMaxFBSize));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
4c98b8b05f3783351cf256cc90cd4478fb28b62bvboxsync shareAddress.QuadPart = VBoxCommonFromDeviceExt(pExt)->phVRAM.QuadPart + pExt->ulFrameBufferOffset;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = VideoPortMapMemory(pExt, shareAddress, &size, &inIoSpace, &virtualAddress);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (NO_ERROR == pStatus->Status)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pShareMemInfo->SharedViewOffset = offset;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pShareMemInfo->SharedViewSize = size;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pShareMemInfo->VirtualAddress = virtualAddress;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VIDEO_SHARE_MEMORY_INFORMATION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBOXMPIOCTL_UNHIDE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return NO_ERROR == pStatus->Status;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Unmaps framebuffer previously mapped with IOCTL_VIDEO_SHARE_VIDEO_MEMORY.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPUnshareVideoMemory(PVBOXMP_DEVEXT pExt, PVIDEO_SHARE_MEMORY pMem, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = VideoPortUnmapMemory(pExt, pMem->RequestedVirtualAddress, pMem->ProcessHandle);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_SET_CURRENT_MODE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Sets adapter video mode.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPSetCurrentMode(PVBOXMP_DEVEXT pExt, PVIDEO_MODE pMode, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ULONG RequestedMode;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VIDEO_MODE_INFORMATION *pModeInfo;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF(("mode=%#x", pMode->RequestedMode));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Get requested mode info */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RequestedMode = pMode->RequestedMode & ~(VIDEO_MODE_NO_ZERO_MEMORY|VIDEO_MODE_MAP_MEM_LINEAR);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RequestedMode!=pMode->RequestedMode)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("ignoring set VIDEO_MODE_NO_ZERO_MEMORY or VIDEO_MODE_MAP_MEM_LINEAR"));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
5812854ef3f36c3defe4731c055b1839cfc05a16vboxsync pModeInfo = VBoxMPCmnGetVideoModeInfo(pExt, RequestedMode-1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!pModeInfo)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
5295c362853081eaa3944247171746a3aad9a826vboxsync LOG(("screen [%d] mode %d width %d, height %d, bpp %d",
5295c362853081eaa3944247171746a3aad9a826vboxsync pExt->iDevice, pModeInfo->ModeIndex, pModeInfo->VisScreenWidth, pModeInfo->VisScreenHeight, pModeInfo->BitsPerPlane));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Update device info */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pExt->CurrentMode = RequestedMode;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pExt->CurrentModeWidth = pModeInfo->VisScreenWidth;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pExt->CurrentModeHeight = pModeInfo->VisScreenHeight;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pExt->CurrentModeBPP = pModeInfo->BitsPerPlane;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pExt->iDevice>0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("skipping non-primary display %d", pExt->iDevice));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Perform actual mode switch */
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync VBoxVideoSetModeRegisters((USHORT)pModeInfo->VisScreenWidth, (USHORT)pModeInfo->VisScreenHeight,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync (USHORT)pModeInfo->VisScreenWidth, (USHORT)pModeInfo->BitsPerPlane, 0, 0, 0);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /*@todo read back from port to check if mode switch was successful */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_QUERY_CURRENT_MODE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Returns information about current video mode.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPQueryCurrentMode(PVBOXMP_DEVEXT pExt, PVIDEO_MODE_INFORMATION pModeInfo, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VIDEO_MODE_INFORMATION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VideoPortMoveMemory(pModeInfo, VBoxMPXpdmCurrentVideoMode(pExt), sizeof(VIDEO_MODE_INFORMATION));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES.
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync * Returns count of supported video modes and structure size in bytes,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * used by the following IOCTL_VIDEO_QUERY_AVAIL_MODES.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPQueryNumAvailModes(PVBOXMP_DEVEXT pExt, PVIDEO_NUM_MODES pNumModes, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxMPXpdmBuildVideoModesTable(pExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
5812854ef3f36c3defe4731c055b1839cfc05a16vboxsync pNumModes->NumModes = VBoxMPXpdmGetVideoModesCount(pExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pNumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VIDEO_NUM_MODES);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_QUERY_AVAIL_MODES.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Returns information about supported video modes.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPQueryAvailModes(PVBOXMP_DEVEXT pExt, PVIDEO_MODE_INFORMATION pModes, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
5812854ef3f36c3defe4731c055b1839cfc05a16vboxsync ULONG ulSize = VBoxMPXpdmGetVideoModesCount(pExt)*sizeof(VIDEO_MODE_INFORMATION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = ulSize;
5812854ef3f36c3defe4731c055b1839cfc05a16vboxsync VideoPortMoveMemory(pModes, VBoxMPCmnGetVideoModeInfo(pExt, 0), ulSize);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_SET_COLOR_REGISTERS.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Sets adapter's color registers.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPSetColorRegisters(PVBOXMP_DEVEXT pExt, PVIDEO_CLUT pClut, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG entry;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (pClut->FirstEntry+pClut->NumEntries > 256)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_PARAMETER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (entry=pClut->FirstEntry; entry<pClut->FirstEntry+pClut->NumEntries; ++entry)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVideoCmnPortWriteUchar(VBE_DISPI_IOPORT_DAC_WRITE_INDEX, (UCHAR)entry);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVideoCmnPortWriteUchar(VBE_DISPI_IOPORT_DAC_DATA, pClut->LookupTable[entry].RgbArray.Red);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVideoCmnPortWriteUchar(VBE_DISPI_IOPORT_DAC_DATA, pClut->LookupTable[entry].RgbArray.Green);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VBoxVideoCmnPortWriteUchar(VBE_DISPI_IOPORT_DAC_DATA, pClut->LookupTable[entry].RgbArray.Blue);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_SET_POINTER_ATTR.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Sets pointer attributes.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPSetPointerAttr(PVBOXMP_DEVEXT pExt, PVIDEO_POINTER_ATTRIBUTES pPointerAttrs, uint32_t cbLen, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxQueryHostWantsAbsolute())
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC = VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pExt), pPointerAttrs, cbLen);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOG(("Fallback to sw pointer."));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_ENABLE_POINTER/IOCTL_VIDEO_DISABLE_POINTER.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Hides pointer or makes it visible depending on bEnable value passed.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPEnablePointer(PVBOXMP_DEVEXT pExt, BOOLEAN bEnable, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxQueryHostWantsAbsolute())
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Check if it's not shown already. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bEnable == pExt->pPrimary->u.primary.fMouseHidden)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VIDEO_POINTER_ATTRIBUTES attrs;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Visible and No Shape means show the pointer, 0 means hide pointer.
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync * It's enough to init only this field.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync attrs.Enable = bEnable ? VBOX_MOUSE_POINTER_VISIBLE:0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Pass info to the host. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC = VBoxMPCmnUpdatePointerShape(VBoxCommonFromDeviceExt(pExt), &attrs, sizeof(attrs));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (bRC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Update device state. */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pExt->pPrimary->u.primary.fMouseHidden = !bEnable;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_QUERY_POINTER_POSITION.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Query pointer position.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPQueryPointerPosition(PVBOXMP_DEVEXT pExt, PVIDEO_POINTER_POSITION pPos, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync uint16_t PosX, PosY;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxQueryPointerPos(&PosX, &PosY))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync PVIDEO_MODE_INFORMATION pMode = VBoxMPXpdmCurrentVideoMode(pExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* map from 0xFFFF to the current resolution */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPos->Column = (SHORT)(PosX / (0xFFFF / pMode->VisScreenWidth));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pPos->Row = (SHORT)(PosY / (0xFFFF / pMode->VisScreenHeight));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VIDEO_POINTER_POSITION);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Query supported hardware pointer feaures.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Note: we always return all caps we could ever support,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * related functions will return errors if host doesn't accept pointer integration
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * and force display driver to enter software fallback codepath.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPQueryPointerCapabilities(PVBOXMP_DEVEXT pExt, PVIDEO_POINTER_CAPABILITIES pCaps, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VIDEO_POINTER_CAPABILITIES);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCaps->Flags = VIDEO_MODE_ASYNC_POINTER | VIDEO_MODE_COLOR_POINTER | VIDEO_MODE_MONO_POINTER;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Up to 64x64 shapes */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCaps->MaxWidth = 64;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCaps->MaxHeight = 64;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync /* Not used by our display driver */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCaps->HWPtrBitmapStart = -1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCaps->HWPtrBitmapEnd = -1;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_VBVA_ENABLE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Display driver is ready to switch to VBVA operation mode.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPVBVAEnable(PVBOXMP_DEVEXT pExt, BOOLEAN bEnable, VBVAENABLERESULT *pResult, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VBoxVbvaEnable(pExt, bEnable, pResult);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(VBVAENABLERESULT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_VBOX_SETVISIBLEREGION.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Sends visible regions information to the host.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPSetVisibleRegion(uint32_t cRects, RTRECT *pRects, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VMMDevVideoSetVisibleRegion *req = NULL;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VbglGRAlloc((VMMDevRequestHeader **)&req, sizeof(VMMDevVideoSetVisibleRegion) + (cRects-1)*sizeof(RTRECT),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VMMDevReq_VideoSetVisibleRegion);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync req->cRect = cRects;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync memcpy(&req->Rect, pRects, cRects*sizeof(RTRECT));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = VbglGRPerform(&req->header);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_SUCCESS(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VbglGRFree(&req->header);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync WARN(("VbglGRAlloc rc = %#xrc", rc));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (!bRC)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_HGSMI_QUERY_PORTPROCS.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Returns video port api function pointers.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPHGSMIQueryPortProcs(PVBOXMP_DEVEXT pExt, HGSMIQUERYCPORTPROCS *pProcs, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxCommonFromDeviceExt(pExt)->bHGSMI)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pProcs->pContext = pExt->pPrimary;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pProcs->VideoPortProcs = pExt->pPrimary->u.primary.VideoPortProcs;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(HGSMIQUERYCPORTPROCS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_HGSMI_QUERY_CALLBACKS.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Returns HGSMI related callbacks.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPHGSMIQueryCallbacks(PVBOXMP_DEVEXT pExt, HGSMIQUERYCALLBACKS *pCallbacks, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxCommonFromDeviceExt(pExt)->bHGSMI)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->hContext = VBoxCommonFromDeviceExt(pExt);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnCompletionHandler = VBoxMPHGSMIHostCmdCompleteCB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pCallbacks->pfnRequestCommandsHandler = VBoxMPHGSMIHostCmdRequestCB;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(HGSMIQUERYCALLBACKS);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_QUERY_HGSMI_INFO.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Returns hgsmi info for this adapter.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPQueryHgsmiInfo(PVBOXMP_DEVEXT pExt, QUERYHGSMIRESULT *pResult, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxCommonFromDeviceExt(pExt)->bHGSMI)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->iDevice = pExt->iDevice;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->ulFlags = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->areaDisplay = pExt->areaDisplay;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->u32DisplayInfoSize = VBVA_DISPLAY_INFORMATION_SIZE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->u32MinVBVABufferSize = VBVA_MIN_BUFFER_SIZE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pResult->IOPortGuestCommand = VBoxCommonFromDeviceExt(pExt)->guestCtx.port;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof(QUERYHGSMIRESULT);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_HGSMI_HANDLER_ENABLE.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Enables HGSMI miniport channel.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPHgsmiHandlerEnable(PVBOXMP_DEVEXT pExt, HGSMIHANDLERENABLE *pChannel, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxCommonFromDeviceExt(pExt)->bHGSMI)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int rc = VBoxVbvaChannelDisplayEnable(VBoxCommonFromDeviceExt(pExt), pExt->iDevice, pChannel->u8Channel);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(rc))
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_NAME;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* Called for IOCTL_VIDEO_VHWA_QUERY_INFO.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Returns framebuffer offset.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBOOLEAN VBoxMPVhwaQueryInfo(PVBOXMP_DEVEXT pExt, VHWAQUERYINFO *pInfo, PSTATUS_BLOCK pStatus)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync BOOLEAN bRC = TRUE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_ENTER();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (VBoxCommonFromDeviceExt(pExt)->bHGSMI)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pInfo->offVramBase = (ULONG_PTR)pExt->ulFrameBufferOffset;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Information = sizeof (VHWAQUERYINFO);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pStatus->Status = ERROR_INVALID_FUNCTION;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync bRC=FALSE;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LOGF_LEAVE();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync return bRC;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsyncBOOLEAN VBoxMPQueryRegistryFlags(PVBOXMP_DEVEXT pExt, ULONG *pulFlags, PSTATUS_BLOCK pStatus)
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync{
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync BOOLEAN bRC = TRUE;
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync LOGF_ENTER();
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync VBOXMPCMNREGISTRY Registry;
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync int rc = VBoxMPCmnRegInit(pExt, &Registry);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync VBOXMP_WARN_VPS_NOBP(rc);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync if (rc == NO_ERROR)
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync {
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync uint32_t u32Flags = 0;
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync rc = VBoxMPCmnRegQueryDword(Registry, L"VBoxVideoFlags", &u32Flags);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync VBOXMP_WARN_VPS_NOBP(rc);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync if (rc != NO_ERROR)
2888816fbcb216a2dbc97a95fa5a50b6caa09e32vboxsync {
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync u32Flags = 0;
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync }
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync LOG(("Registry flags 0x%08X", u32Flags));
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync *pulFlags = u32Flags;
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync pStatus->Information = sizeof(ULONG);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync }
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync rc = VBoxMPCmnRegFini(Registry);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync VBOXMP_WARN_VPS_NOBP(rc);
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync LOGF_LEAVE();
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync return bRC;
3d5847db3882b6af81db232f55ee404b22141e5dvboxsync}