8ad79874169cc981a694a15e8a806b9a39133673vboxsync/* $Id$ */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** @file
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * VBoxGuest - Windows specifics.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/*
e1ed9baf425f4c757302ec417a815aab945fdbf0vboxsync * Copyright (C) 2010-2015 Oracle Corporation
b2640405e06105d868b5fc8f7b676bb680884380vboxsync *
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * available from http://www.virtualbox.org. This file is free software;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * you can redistribute it and/or modify it under the terms of the GNU
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * General Public License (GPL) as published by the Free Software
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
b2640405e06105d868b5fc8f7b676bb680884380vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
b2640405e06105d868b5fc8f7b676bb680884380vboxsync */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#ifndef ___VBoxGuest_win_h
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#define ___VBoxGuest_win_h
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include <iprt/cdefs.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncRT_C_DECLS_BEGIN
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#ifdef RT_ARCH_X86
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include <ntddk.h>
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#ifdef RT_ARCH_X86
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync# undef _InterlockedAddLargeStatistic
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#endif
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncRT_C_DECLS_END
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include <iprt/spinlock.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include <iprt/memobj.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include <VBox/VMMDev.h>
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#include <VBox/VBoxGuest.h>
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync#include "VBoxGuestInternal.h"
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** Possible device states for our state machine. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncenum DEVSTATE
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync STOPPED,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync WORKING,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PENDINGSTOP,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PENDINGREMOVE,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync SURPRISEREMOVED,
b2640405e06105d868b5fc8f7b676bb680884380vboxsync REMOVED
b2640405e06105d868b5fc8f7b676bb680884380vboxsync};
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsynctypedef struct VBOXGUESTWINBASEADDRESS
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Original device physical address. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PHYSICAL_ADDRESS RangeStart;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Length of I/O or memory range. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG RangeLength;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Flag: Unmapped range is I/O or memory range. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync BOOLEAN RangeInMemory;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Mapped I/O or memory range. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PVOID MappedRangeStart;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Flag: mapped range is I/O or memory range. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync BOOLEAN MappedRangeInMemory;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Flag: resource is mapped (i.e. MmMapIoSpace called). */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync BOOLEAN ResourceMapped;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync} VBOXGUESTWINBASEADDRESS, *PVBOXGUESTWINBASEADDRESS;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** Windows-specific device extension bits. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsynctypedef struct VBOXGUESTDEVEXTWIN
b2640405e06105d868b5fc8f7b676bb680884380vboxsync{
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync VBOXGUESTDEVEXT Core;
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Our functional driver object. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PDEVICE_OBJECT pDeviceObject;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Top of the stack. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PDEVICE_OBJECT pNextLowerDriver;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Currently active Irp. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync IRP *pCurrentIrp;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Interrupt object pointer. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PKINTERRUPT pInterruptObject;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Bus number where the device is located. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG busNumber;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Slot number where the device is located. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG slotNumber;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Device interrupt level. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG interruptLevel;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Device interrupt vector. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG interruptVector;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Affinity mask. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync KAFFINITY interruptAffinity;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** LevelSensitive or Latched. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync KINTERRUPT_MODE interruptMode;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** PCI base address information. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG pciAddressCount;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync VBOXGUESTWINBASEADDRESS pciBaseAddress[PCI_TYPE0_ADDRESSES];
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Physical address and length of VMMDev memory. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync PHYSICAL_ADDRESS vmmDevPhysMemoryAddress;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync ULONG vmmDevPhysMemoryLength;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Device state. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync DEVSTATE devState;
0c802efc285bf77b849eaf660a9c18a0e7f62445vboxsync DEVSTATE prevDevState;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Last system power action set (see VBoxGuestPower). */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync POWER_ACTION LastSystemPowerAction;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Preallocated generic request for shutdown. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync VMMDevPowerStateRequest *pPowerStateRequest;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Preallocated VMMDevEvents for IRQ handler. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync VMMDevEvents *pIrqAckEvents;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync /** Pre-allocated kernel session data. This is needed
8ad79874169cc981a694a15e8a806b9a39133673vboxsync * for handling kernel IOCtls. */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync struct VBOXGUESTSESSION *pKernelSession;
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
6724f34fdfee01d77d13f23d907d7b79d80e435dvboxsync /** Spinlock protecting MouseNotifyCallback. Required since the consumer is
6724f34fdfee01d77d13f23d907d7b79d80e435dvboxsync * in a DPC callback and not the ISR. */
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync KSPIN_LOCK MouseEventAccessLock;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync} VBOXGUESTDEVEXTWIN, *PVBOXGUESTDEVEXTWIN;
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/** NT (windows) version identifier. */
8ad79874169cc981a694a15e8a806b9a39133673vboxsynctypedef enum VBGDNTVER
8ad79874169cc981a694a15e8a806b9a39133673vboxsync{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_INVALID = 0,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_WINNT4,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_WIN2K,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_WINXP,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_WIN2K3,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_WINVISTA,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync VBGDNTVER_WIN7,
cba644d3694119a648f130178a8d84d70ba3f88dvboxsync VBGDNTVER_WIN8,
d548194f74175bd02f817e8a95fccdec9604b938vboxsync VBGDNTVER_WIN81,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync VBGDNTVER_WIN10
8ad79874169cc981a694a15e8a806b9a39133673vboxsync} VBGDNTVER;
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncextern VBGDNTVER g_enmVbgdNtVer;
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#define VBOXGUEST_UPDATE_DEVSTATE(a_pDevExt, a_newDevState) \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync do { \
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync (a_pDevExt)->prevDevState = (a_pDevExt)->devState; \
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsync (a_pDevExt)->devState = (a_newDevState); \
8ad79874169cc981a694a15e8a806b9a39133673vboxsync } while (0)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsync/** CM_RESOURCE_MEMORY_* flags which were used on XP or earlier. */
b2640405e06105d868b5fc8f7b676bb680884380vboxsync#define VBOX_CM_PRE_VISTA_MASK (0x3f)
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncRT_C_DECLS_BEGIN
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync#ifdef TARGET_NT4
91fdb167bd5c9417d9507c1317ae121864fdc9cbvboxsyncNTSTATUS vbgdNt4CreateDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync#else
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncNTSTATUS vbgdNtInit(PDEVICE_OBJECT pDevObj, PIRP pIrp);
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncNTSTATUS vbgdNtPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp);
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncNTSTATUS vbgdNtPower(PDEVICE_OBJECT pDevObj, PIRP pIrp);
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync#endif
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/** @name Common routines used in both (PnP and legacy) driver versions.
8ad79874169cc981a694a15e8a806b9a39133673vboxsync * @{
8ad79874169cc981a694a15e8a806b9a39133673vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#ifdef TARGET_NT4
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncNTSTATUS vbgdNtInit(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICODE_STRING pRegPath);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#else
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncNTSTATUS vbgdNtInit(PDEVICE_OBJECT pDevObj, PIRP pIrp);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#endif
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncNTSTATUS vbgdNtCleanup(PDEVICE_OBJECT pDevObj);
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncVOID vbgdNtDpcHandler(PKDPC pDPC, PDEVICE_OBJECT pDevObj, PIRP pIrp, PVOID pContext);
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncBOOLEAN vbgdNtIsrHandler(PKINTERRUPT interrupt, PVOID serviceContext);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncNTSTATUS vbgdNtScanPCIResourceList(PCM_RESOURCE_LIST pResList, PVBOXGUESTDEVEXTWIN pDevExt);
eafe2940026f325feeaa433c9ea44823431ec5ffvboxsyncNTSTATUS vbgdNtMapVMMDevMemory(PVBOXGUESTDEVEXTWIN pDevExt, PHYSICAL_ADDRESS PhysAddr, ULONG cbToMap,
8ad79874169cc981a694a15e8a806b9a39133673vboxsync void **ppvMMIOBase, uint32_t *pcbMMIO);
cf2d13234ccc8755e2610badbdab5dc0b7bfb1dcvboxsyncvoid vbgdNtUnmapVMMDevMemory(PVBOXGUESTDEVEXTWIN pDevExt);
8ad79874169cc981a694a15e8a806b9a39133673vboxsyncVBOXOSTYPE vbgdNtVersionToOSType(VBGDNTVER enmNtVer);
8ad79874169cc981a694a15e8a806b9a39133673vboxsync/** @} */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync
b2640405e06105d868b5fc8f7b676bb680884380vboxsyncRT_C_DECLS_END
b2640405e06105d868b5fc8f7b676bb680884380vboxsync
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync#ifdef TARGET_NT4
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync/*
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * XP DDK #defines ExFreePool to ExFreePoolWithTag. The latter does not exist
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync * on NT4, so... The same for ExAllocatePool.
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync# undef ExAllocatePool
8ad79874169cc981a694a15e8a806b9a39133673vboxsync# undef ExFreePool
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync#endif
eb4f1fa4c357485330370c0eaba27e5a2af7d9c4vboxsync
8ad79874169cc981a694a15e8a806b9a39133673vboxsync#endif /* !___VBoxGuest_win_h */
8ad79874169cc981a694a15e8a806b9a39133673vboxsync