VBoxTray.h revision 485a153f0c2ddf3738d940d5158c72939f080cc8
31711967b986b488798e89eb8d7d39fe9a42912evboxsync/* $Id$ */
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync/** @file
35396ee506ef68dd1c161f1ef2c3c0b68a146ff2vboxsync * VBoxTray - Guest Additions Tray, Internal Header.
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync */
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync/*
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync *
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * available from http://www.virtualbox.org. This file is free software;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * General Public License (GPL) as published by the Free Software
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync *
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync * additional information or have any questions.
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync */
31711967b986b488798e89eb8d7d39fe9a42912evboxsync
0d20048b3955267f206c0e521dd43fbb0da0b954vboxsync#ifndef ___VBOXTRAY_H
0d20048b3955267f206c0e521dd43fbb0da0b954vboxsync#define ___VBOXTRAY_H
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync#include <windows.h>
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync#include <tchar.h>
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync#include <stdio.h>
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync#include <stdarg.h>
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync#include <process.h>
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
315ad5b8dea4f6f933a01420cfb1e0fe19183c45vboxsync#include <iprt/initterm.h>
315ad5b8dea4f6f933a01420cfb1e0fe19183c45vboxsync#include <iprt/string.h>
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
315ad5b8dea4f6f933a01420cfb1e0fe19183c45vboxsync#include <VBox/version.h>
315ad5b8dea4f6f933a01420cfb1e0fe19183c45vboxsync#include <VBox/Log.h>
0758ccd1bec500cced35c8dfe52fcceacc2469d5vboxsync#include <VBox/VBoxGuest.h> /** @todo use the VbglR3 interface! */
0758ccd1bec500cced35c8dfe52fcceacc2469d5vboxsync#include <VBox/VBoxGuestLib.h>
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#include <VBoxDisplay.h>
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#ifdef VBOXWDDM
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync# include <d3dkmthk.h>
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#endif
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
0eb559db79133da4f6679b2fec099ae477cac90dvboxsync#define WM_VBOX_RESTORED WM_APP + 1
0eb559db79133da4f6679b2fec099ae477cac90dvboxsync#define WM_VBOX_CHECK_VRDP WM_APP + 2
0eb559db79133da4f6679b2fec099ae477cac90dvboxsync#define WM_VBOX_CHECK_HOSTVERSION WM_APP + 3
c332e7b08481315f5c367e0364484da7bbb85b2evboxsync#define WM_VBOX_TRAY WM_APP + 4
0eb559db79133da4f6679b2fec099ae477cac90dvboxsync
0eb559db79133da4f6679b2fec099ae477cac90dvboxsync#define ID_TRAYICON 2000
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsynctypedef enum
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync{
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync VBOXDISPIF_MODE_UNKNOWN = 0,
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync VBOXDISPIF_MODE_XPDM = 1
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#ifdef VBOXWDDM
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync , VBOXDISPIF_MODE_WDDM = 2
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#endif
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync} VBOXDISPIF_MODE;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync/* display driver interface abstraction for XPDM & WDDM
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * with WDDM we can not use ExtEscape to communicate with our driver
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * because we do not have XPDM display driver any more, i.e. escape requests are handled by cdd
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * that knows nothing about us
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * NOTE: DispIf makes no checks whether the display driver is actually a VBox driver,
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * it just switches between using different backend OS API based on the VBoxDispIfSwitchMode call
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * It's caller's responsibility to initiate it to work in the correct mode */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsynctypedef struct VBOXDISPIF
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync{
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync VBOXDISPIF_MODE enmMode;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#ifdef VBOXWDDM
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync /* with WDDM the approach is to call into WDDM miniport driver via PFND3DKMT API provided by the GDI,
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * The PFND3DKMT is supposed to be used by the OpenGL ICD according to MSDN, so this approach is a bit hacky */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync /* open adapter */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync union
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync {
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync struct
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync {
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync PFND3DKMT_OPENADAPTERFROMHDC pfnD3DKMTOpenAdapterFromHdc;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync PFND3DKMT_OPENADAPTERFROMGDIDISPLAYNAME pfnD3DKMTOpenAdapterFromGdiDisplayName;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync /* close adapter */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync PFND3DKMT_CLOSEADAPTER pfnD3DKMTCloseAdapter;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync /* escape */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync PFND3DKMT_ESCAPE pfnD3DKMTEscape;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync } wddm;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync } modeData;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync#endif
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync} VBOXDISPIF, *PVBOXDISPIF;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsynctypedef const struct VBOXDISPIF *PCVBOXDISPIF;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync/* initializes the DispIf
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * Initially the DispIf is configured to work in XPDM mode
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync * call VBoxDispIfSwitchMode to switch the mode to WDDM */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsyncDWORD VBoxDispIfInit(PVBOXDISPIF pIf);
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsyncDWORD VBoxDispIfSwitchMode(PVBOXDISPIF pIf, VBOXDISPIF_MODE enmMode, VBOXDISPIF_MODE *penmOldMode);
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsyncDECLINLINE(VBOXDISPIF_MODE) VBoxDispGetMode(PVBOXDISPIF pIf) { return pIf->enmMode; }
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsyncDWORD VBoxDispIfTerm(PVBOXDISPIF pIf);
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsyncDWORD VBoxDispIfEscape(PCVBOXDISPIF const pIf, PVBOXDISPIFESCAPE pEscape, int cbData);
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync/* The environment information for services. */
e62cb87bae732e9968199a3ad153cc94004b7182vboxsynctypedef struct _VBOXSERVICEENV
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync{
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync HINSTANCE hInstance;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync HANDLE hDriver;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync HANDLE hStopEvent;
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync /* display driver interface, XPDM - WDDM abstraction see VBOXDISPIF** definitions above */
485a153f0c2ddf3738d940d5158c72939f080cc8vboxsync VBOXDISPIF dispIf;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync} VBOXSERVICEENV;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync/* The service initialization info and runtime variables. */
e62cb87bae732e9968199a3ad153cc94004b7182vboxsynctypedef struct _VBOXSERVICEINFO
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync{
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync char *pszName;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync int (* pfnInit) (const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread);
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync unsigned (__stdcall * pfnThread) (void *pInstance);
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync void (* pfnDestroy) (const VBOXSERVICEENV *pEnv, void *pInstance);
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync /* Variables. */
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync HANDLE hThread;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync void *pInstance;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync bool fStarted;
31711967b986b488798e89eb8d7d39fe9a42912evboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync} VBOXSERVICEINFO;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
0eb559db79133da4f6679b2fec099ae477cac90dvboxsyncextern HWND gToolWindow;
0eb559db79133da4f6679b2fec099ae477cac90dvboxsyncextern HINSTANCE gInstance;
e62cb87bae732e9968199a3ad153cc94004b7182vboxsync
1ce9b5cdb394313f823577ad75c0bc237b9884b5vboxsyncextern void VBoxServiceReloadCursor(void);
1ce9b5cdb394313f823577ad75c0bc237b9884b5vboxsync
0d20048b3955267f206c0e521dd43fbb0da0b954vboxsync#endif /* !___VBOXTRAY_H */
31711967b986b488798e89eb8d7d39fe9a42912evboxsync