e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync/* $Id$ */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync/** @file
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * VBox Mouse filter header
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2011-2012 Oracle Corporation
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync *
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * available from http://www.virtualbox.org. This file is free software;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * you can redistribute it and/or modify it under the terms of the GNU
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * General Public License (GPL) as published by the Free Software
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#ifndef VBOXMF_H
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#define VBOXMF_H
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <iprt/cdefs.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#define LOG_GROUP LOG_GROUP_DRV_MOUSE
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <VBox/log.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <iprt/err.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <iprt/assert.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include "../common/VBoxMouseLog.h"
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#ifdef RT_ARCH_X86
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync# define _InterlockedAddLargeStatistic _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#endif
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncRT_C_DECLS_BEGIN
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <ntddk.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <ntddmou.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <ntddkbd.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <ntdd8042.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncRT_C_DECLS_END
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#ifdef RT_ARCH_X86
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync# undef _InterlockedAddLargeStatistic
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync#endif
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#include <VBox/VMMDev.h>
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#define IOCTL_INTERNAL_MOUSE_CONNECT CTL_CODE(FILE_DEVICE_MOUSE, 0x0080, METHOD_NEITHER, FILE_ANY_ACCESS)
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
b0a3d0ec5780199a2f379da63c59ccf48f1a73b9vboxsynctypedef VOID (*PFNSERVICECB)(PDEVICE_OBJECT DeviceObject, PMOUSE_INPUT_DATA InputDataStart,
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync PMOUSE_INPUT_DATA InputDataEnd, PULONG InputDataConsumed);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsynctypedef struct _INTERNAL_MOUSE_CONNECT_DATA
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync{
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync PDEVICE_OBJECT pDO;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync PFNSERVICECB pfnServiceCB;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync} INTERNAL_MOUSE_CONNECT_DATA, *PINTERNAL_MOUSE_CONNECT_DATA;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsynctypedef struct _VBOXMOUSE_DEVEXT
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync{
59c511231e9864cb4ab5105e23e3e3617af92d34vboxsync LIST_ENTRY ListEntry;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync PDEVICE_OBJECT pdoMain; /* PDO passed to VBoxDrvAddDevice */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync PDEVICE_OBJECT pdoSelf; /* our PDO created in VBoxDrvAddDevice*/
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync PDEVICE_OBJECT pdoParent; /* Highest PDO in chain before we've attached our filter */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync BOOLEAN bHostMouse; /* Indicates if we're filtering the chain with emulated i8042 PS/2 adapter */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync INTERNAL_MOUSE_CONNECT_DATA OriginalConnectData; /* Original connect data intercepted in IOCTL_INTERNAL_MOUSE_CONNECT */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync VMMDevReqMouseStatus *pSCReq; /* Preallocated request to use in pfnServiceCB */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync IO_REMOVE_LOCK RemoveLock;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync} VBOXMOUSE_DEVEXT, *PVBOXMOUSE_DEVEXT;
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync/* Interface functions */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncRT_C_DECLS_BEGIN
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncRT_C_DECLS_END
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncNTSTATUS VBoxDrvAddDevice(IN PDRIVER_OBJECT Driver, IN PDEVICE_OBJECT PDO);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncVOID VBoxDrvUnload(IN PDRIVER_OBJECT Driver);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync/* IRP handlers */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncNTSTATUS VBoxIrpPassthrough(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncNTSTATUS VBoxIrpInternalIOCTL(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncNTSTATUS VBoxIrpPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
dcd56bc53b08f98a6dc6a33f805fc8fd2c0393b6vboxsyncNTSTATUS VBoxIrpPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync/* Internal functions */
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncVOID VBoxDeviceAdded(PVBOXMOUSE_DEVEXT pDevExt);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncVOID VBoxInformHost(PVBOXMOUSE_DEVEXT pDevExt);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsyncVOID VBoxDeviceRemoved(PVBOXMOUSE_DEVEXT pDevExt);
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync
59c511231e9864cb4ab5105e23e3e3617af92d34vboxsyncNTSTATUS VBoxNewProtInit();
59c511231e9864cb4ab5105e23e3e3617af92d34vboxsyncNTSTATUS VBoxNewProtTerm();
59c511231e9864cb4ab5105e23e3e3617af92d34vboxsync
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsyncVOID VBoxDrvNotifyServiceCB(PVBOXMOUSE_DEVEXT pDevExt, PMOUSE_INPUT_DATA InputDataStart, PMOUSE_INPUT_DATA InputDataEnd, PULONG InputDataConsumed);
46ff7af86c9b48efa8270af373c8d5dcfa7d05c5vboxsync
e12a4168124cdb9ebd1f61bc4a93f765bf399befvboxsync#endif /*VBOXMF_H*/