9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VBox Miniport common utils header
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#ifndef VBOXMPUTILS_H
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXMPUTILS_H
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*Sanity check*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#if defined(VBOX_XPDM_MINIPORT)==defined(VBOX_WDDM_MINIPORT)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#error One of the VBOX_XPDM_MINIPORT or VBOX_WDDM_MINIPORT should be defined!
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/cdefs.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define LOG_GROUP LOG_GROUP_DRV_MINIPORT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/log.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOX_VIDEO_LOG_NAME "VBoxMP"
b82914bc22e128708efefbaf9c93540dbc1711davboxsync#ifdef VBOX_WDDM_MINIPORT
b82914bc22e128708efefbaf9c93540dbc1711davboxsync# ifndef VBOX_WDDM_MINIPORT_WITH_FLOW_LOGGING
b82914bc22e128708efefbaf9c93540dbc1711davboxsync# define VBOX_VIDEO_LOGFLOW_LOGGER(_m) do {} while (0)
b82914bc22e128708efefbaf9c93540dbc1711davboxsync# endif
b82914bc22e128708efefbaf9c93540dbc1711davboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include "common/VBoxVideoLog.h"
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/err.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/assert.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRT_C_DECLS_BEGIN
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef VBOX_XPDM_MINIPORT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <dderror.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <devioctl.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# ifdef PAGE_SIZE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef PAGE_SIZE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# ifdef PAGE_SHIFT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef PAGE_SHIFT
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define VBOX_WITH_WORKAROUND_MISSING_PACK
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _InterlockedExchange _InterlockedExchange_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _InterlockedExchangeAdd _InterlockedExchangeAdd_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _InterlockedCompareExchange _InterlockedCompareExchange_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _interlockedbittestandset _interlockedbittestandset_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _interlockedbittestandreset _interlockedbittestandreset_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _interlockedbittestandset64 _interlockedbittestandset64_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# define _interlockedbittestandreset64 _interlockedbittestandreset64_StupidDDKVsCompilerCrap
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# pragma warning(disable : 4163)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# ifdef VBOX_WITH_WORKAROUND_MISSING_PACK
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# pragma warning(disable : 4103)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <ntddk.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# pragma warning(default : 4163)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# ifdef VBOX_WITH_WORKAROUND_MISSING_PACK
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# pragma pack()
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# pragma warning(default : 4103)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _InterlockedExchange
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _InterlockedExchangeAdd
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _InterlockedCompareExchange
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _InterlockedAddLargeStatistic
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _interlockedbittestandset
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _interlockedbittestandreset
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _interlockedbittestandset64
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# undef _interlockedbittestandreset64
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <ntddk.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <dispmprt.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <ntddvdeo.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync# include <dderror.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRT_C_DECLS_END
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*Windows version identifier*/
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsynctypedef enum
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_UNKNOWN = 0,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_NT4 = 1,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_2K = 2,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_XP = 3,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_VISTA = 4,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_7 = 5,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_8 = 6,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_81 = 7,
6fd13c2e3e855d7f5a7147cb0414af050e1503e6vboxsync WINVERSION_10 = 8
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync} vboxWinVersion_t;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRT_C_DECLS_BEGIN
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvboxWinVersion_t VBoxQueryWinVersion();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncuint32_t VBoxGetHeightReduction();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxLikesVideoMode(uint32_t display, uint32_t width, uint32_t height, uint32_t bpp);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxQueryDisplayRequest(uint32_t *xres, uint32_t *yres, uint32_t *bpp, uint32_t *pDisplayId);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxQueryHostWantsAbsolute();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncbool VBoxQueryPointerPos(uint16_t *pPosX, uint16_t *pPosY);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncRT_C_DECLS_END
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES 4*_1M
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync#define VBOXMP_WARN_VPS_NOBP(_vps) \
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsyncif ((_vps) != NO_ERROR) \
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync{ \
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync WARN_NOBP(("vps(%#x)!=NO_ERROR", _vps)); \
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync}
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXMP_WARN_VPS(_vps) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncif ((_vps) != NO_ERROR) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{ \
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync WARN(("vps(%#x)!=NO_ERROR", _vps)); \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
3c5c04d7b0973be0757addef8ba44b9352b38386vboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define VBOXMP_CHECK_VPS_BREAK(_vps) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncif ((_vps) != NO_ERROR) \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{ \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break; \
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#ifdef DEBUG_misha
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* specifies whether the vboxVDbgBreakF should break in the debugger
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * windbg seems to have some issues when there is a lot ( >~50) of sw breakpoints defined
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * to simplify things we just insert breaks for the case of intensive debugging WDDM driver*/
329df9696e709dc71611f504a4774f323545be0avboxsyncextern int g_bVBoxVDbgBreakF;
329df9696e709dc71611f504a4774f323545be0avboxsyncextern int g_bVBoxVDbgBreakFv;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxVDbgBreakF() do { if (g_bVBoxVDbgBreakF) AssertBreakpoint(); } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxVDbgBreakFv() do { if (g_bVBoxVDbgBreakFv) AssertBreakpoint(); } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#else
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxVDbgBreakF() do { } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#define vboxVDbgBreakFv() do { } while (0)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#endif /*VBOXMPUTILS_H*/