VBoxGuest_Internal.h revision 4cda784a835ae7004b8f6c7f08f1d9d7b5d78a59
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/** @file
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * VBoxGuest -- VirtualBox Win32 guest support driver
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * available from http://www.virtualbox.org. This file is free software;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * General Public License (GPL) as published by the Free Software
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * additional information or have any questions.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#ifndef __VBOXGUESTINTERNAL_h__
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#define __VBOXGUESTINTERNAL_h__
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/*******************************************************************************
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync* Header Files *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync*******************************************************************************/
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#include <iprt/cdefs.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/** @todo Use the-nt-kernel.h and keep the messy stuff all in one place? */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#ifdef IN_RING0
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# include <iprt/asm.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define _InterlockedExchange _InterlockedExchange_StupidDDKVsCompilerCrap
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define _InterlockedExchangeAdd _InterlockedExchangeAdd_StupidDDKVsCompilerCrap
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define _InterlockedCompareExchange _InterlockedCompareExchange_StupidDDKVsCompilerCrap
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# pragma warning(disable : 4163)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncRT_C_DECLS_BEGIN
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# include <ntddk.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncRT_C_DECLS_END
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# pragma warning(default : 4163)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# undef _InterlockedExchange
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# undef _InterlockedExchangeAdd
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# undef _InterlockedCompareExchange
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# undef _InterlockedAddLargeStatistic
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# else
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncRT_C_DECLS_BEGIN
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# include <ntddk.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncRT_C_DECLS_END
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#include <iprt/spinlock.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#include <iprt/memobj.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#include <VBox/VMMDev.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#include <VBox/VBoxGuest.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/*******************************************************************************
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync* Defined Constants And Macros *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync*******************************************************************************/
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/* debug printf */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define OSDBGPRINT(a) DbgPrint a
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/* dprintf */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#if (defined(DEBUG) && !defined(NO_LOGGING)) || defined(LOG_ENABLED)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# ifdef LOG_TO_BACKDOOR
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# include <VBox/log.h>
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define dprintf(a) RTLogBackdoorPrintf a
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# else
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define dprintf(a) OSDBGPRINT(a)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#else
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define dprintf(a) do {} while (0)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/* dprintf2 - extended logging. */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#if 0
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define dprintf2 dprintf
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#else
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync# define dprintf2(a) do { } while (0)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync// the maximum scatter/gather transfer length
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#define MAXIMUM_TRANSFER_LENGTH 64*1024
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#define PCI_MAX_BUSES 256
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/*
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Error codes.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/*******************************************************************************
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync* Structures and Typedefs *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync*******************************************************************************/
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync// possible device states for our state machine
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncenum DEVSTATE
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync{
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync STOPPED,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WORKING,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PENDINGSTOP,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PENDINGREMOVE,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync SURPRISEREMOVED,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync REMOVED
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync};
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync// undocumented API to set the system time
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncextern "C"
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync{
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncNTSYSAPI NTSTATUS NTAPI ZwSetSystemTime(IN PLARGE_INTEGER NewTime, OUT PLARGE_INTEGER OldTime OPTIONAL);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync}
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#ifdef IN_RING0
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsynctypedef struct _BASE_ADDRESS {
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PHYSICAL_ADDRESS RangeStart; // Original device physical address
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG RangeLength; // Length of I/O or memory range
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BOOLEAN RangeInMemory; // Flag: unmapped range is I/O or memory range
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PVOID MappedRangeStart; // Mapped I/O or memory range
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BOOLEAN MappedRangeInMemory; // Flag: mapped range is I/O or memory range
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BOOLEAN ResourceMapped; // Flag: resource is mapped (i.e. MmMapIoSpace called)
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync} BASE_ADDRESS, *PBASE_ADDRESS;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/**
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Device extension.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsynctypedef struct VBOXGUESTDEVEXT
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync{
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync//// legacy stuff
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // bus number where the device is located
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG busNumber;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // slot number where the device is located
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG slotNumber;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // device interrupt level
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG interruptLevel;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // device interrupt vector
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG interruptVector;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // affinity mask
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync KAFFINITY interruptAffinity;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // LevelSensitive or Latched
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync KINTERRUPT_MODE interruptMode;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // PCI base address information
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG addressCount;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BASE_ADDRESS baseAddress[PCI_TYPE0_ADDRESSES];
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // adapter object pointer, returned by HalGetAdapter
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PADAPTER_OBJECT adapterObject;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // interrupt object pointer
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PKINTERRUPT interruptObject;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/////
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // the driver name
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync UCHAR szDriverName[32];
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // our functional driver object
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PDEVICE_OBJECT deviceObject;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // the top of the stack
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PDEVICE_OBJECT nextLowerDriver;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // currently active Irp
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync IRP *currentIrp;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PKTHREAD workerThread;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PKTHREAD idleThread;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync KEVENT workerThreadRequest;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BOOLEAN stopThread;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // device state
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync DEVSTATE devState;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // start port address
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG startPortAddress;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // start of hypervisor mapping
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PVOID hypervisorMapping;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync // size in bytes of the hypervisor mapping
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG hypervisorMappingSize;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Patch memory object. */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync RTR0MEMOBJ PatchMemObj;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Physical address and length of VMMDev memory */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PHYSICAL_ADDRESS memoryAddress;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG memoryLength;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Virtual address of VMMDev memory */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync VMMDevMemory *pVMMDevMemory;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Pending event flags signalled by host */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG u32Events;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Notification semaphore */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync KEVENT keventNotification;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync LARGE_INTEGER HGCMWaitTimeout;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Old Windows session id */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync ULONG ulOldActiveConsoleId;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* VRDP hook state */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BOOLEAN fVRDPEnabled;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Preallocated VMMDevEvents for IRQ handler */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync VMMDevEvents *irqAckEvents;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#ifdef VBOX_WITH_HGCM
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /** Spinlock various items in the VBOXGUESTSESSION. */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync RTSPINLOCK SessionSpinlock;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync struct
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync {
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync uint32_t cBalloonChunks;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync uint32_t cMaxBalloonChunks;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PMDL *paMdlMemBalloon;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync } MemBalloon;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /* Preallocated generic request for shutdown. */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync VMMDevPowerStateRequest *powerStateRequest;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /** Is the bugcheck callback registered? */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync BOOLEAN bBugcheckCallbackRegistered;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /** The bugcheck registration record. */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync KBUGCHECK_CALLBACK_RECORD bugcheckRecord;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync} VBOXGUESTDEVEXT, *PVBOXGUESTDEVEXT;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync// Windows version identifier
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsynctypedef enum
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync{
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WINNT4 = 1,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WIN2K = 2,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WINXP = 3,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WIN2K3 = 4,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WINVISTA = 5,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync WIN7 = 6
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync} winVersion_t;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncextern winVersion_t winVersion;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#ifdef VBOX_WITH_HGCM
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync/**
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * The VBoxGuest per session data.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync *
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * @remark Just to store hgcm ID's, perhaps could combine with one from common/VBoxGuest/vboxguestinternal.h?
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsynctypedef struct VBOXGUESTSESSION
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync{
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync /** Array containing HGCM client IDs associated with this session.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * This will be automatically disconnected when the session is closed.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync * Note that array size also affects/is maximum number of supported opengl threads per guest process.
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync */
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync uint32_t volatile aHGCMClientIds[8];
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync} VBOXGUESTSESSION, *PVBOXGUESTSESSION;
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncextern "C"
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync{
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncVOID VBoxGuestDpcHandler(PKDPC dpc, PDEVICE_OBJECT pDevObj,
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync PIRP irp, PVOID context);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncBOOLEAN VBoxGuestIsrHandler(PKINTERRUPT interrupt, PVOID serviceContext);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncNTSTATUS createThreads(PVBOXGUESTDEVEXT pDevExt);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncVOID unreserveHypervisorMemory(PVBOXGUESTDEVEXT pDevExt);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncvoid VBoxInitMemBalloon(PVBOXGUESTDEVEXT pDevExt);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsyncvoid VBoxCleanupMemBalloon(PVBOXGUESTDEVEXT pDevExt);
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync}
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync#endif // __H_VBOXGUESTINTERNAL
e1fd337d575f2a4c053c6fe7a811e2fd1a31e874vboxsync