亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vmoudev.cpp

?? 一個wmd+xvd開發的虛擬鼠標驅動程序,用鍵盤模擬鼠標操作
?? CPP
字號:
// vmoudev.cpp -  virtual mouse device for HID example
//=============================================================================
//
// Compuware Corporation
// NuMega Lab
// 9 Townsend West
// Nashua, NH 03060  USA
//
// Copyright (c) 1998 Compuware Corporation. All Rights Reserved.
// Unpublished - rights reserved under the Copyright laws of the
// United States.
//
//=============================================================================

// This module implements the device class of the virtual HID
// mouse minidriver.

#include <khid.h>
#include "vmoudev.h"
#include "hidmouse.h"

KTrace T("",TRACE_MONITOR, TraceAlways, BreakNever, KUstring(L"HidMouse"));

#define SCALEX 3
#define SCALEY 3

// The HID report descriptor for this device
// (taken from USB/HID specification)

HID_REPORT_DESCRIPTOR MouseHidReportDesc[] = {
	0x05, 0x01,	// Usage Page (Generic Desktop), 
	0x09, 0x02,	// Usage (Mouse),  
	0xA1, 0x01,	// Collection (Application),	
	0x09, 0x01,	// Usage (Pointer), 	
	0xA1, 0x00,	// Collection (Physical),		
	0x05, 0x09,	// Usage Page (Buttons),		
	0x19, 0x01,	// Usage Minimum (01),		
	0x29, 0x03,	// Usage Maximun (03),		
	0x15, 0x00,	// Logical Minimum (0), 		
	0x25, 0x01,	// Logical Maximum (1), 		
	0x95, 0x03,	// Report Count (3), 		
	0x75, 0x01,	// Report Size (1),		
	0x81, 0x02,	// Input (Data, Variable, Absolute),	;3 button bits		
	0x95, 0x01,	// Report Count (1),		
	0x75, 0x05,	// Report Size (5),		
	0x81, 0x01,	// Input (Constant),			;5 bit padding		
	0x05, 0x01,	// Usage Page (Generic Desktop),		
	0x09, 0x30,	// Usage (X), 		
	0x09, 0x31,	// Usage (Y),		
	0x15, 0x81,	// Logical Minimum (-127), 		
	0x25, 0x7F,	// Logical Maximum (127), 		
	0x75, 0x08,	// Report Size (8), 		
	0x95, 0x02,	// Report Count (2), 		
	0x81, 0x06,	// Input (Data, Variable, Relative),	;2 position bytes (X & Y)	
	0xC0, 		// End Collection,
	0xC0		// End Collection
	};	

// HardwareID for the virtual mouse. 

WCHAR HardwareID[]={L"ROOT\\NUMEGA_VIRTUAL_HID_MOUSE\0"};
WCHAR DeviceID[]  ={L"ROOT\\NUMEGA_VIRTUAL_HID_MOUSE\0"};

HID_DEVICE_ATTRIBUTES DeviceAttributes = {
	sizeof(HID_DEVICE_ATTRIBUTES),	
	MY_VENDOR_ID,
	MY_PRODUCT_ID,
	VERSION_NUMBER
	};

// Device String
struct 
{
	HID_STRING_DESCRIPTOR Sd1;
	WCHAR Str1[14];
	HID_STRING_DESCRIPTOR Sd2;
	WCHAR Str2[9];
} TheDeviceString = {
		{ 30, 3},  {'V','i','r','e','o',' ','S','o','f','t','w','a','r','e'},
		{ 20, 3},  {'H','i','d',' ','M','o','u','s','e'}
	};	


// We keep a pointer to an instance of the device class for use
// by the exported functions which are called from other drivers

VirtualHidMouse* g_DeviceInstance=NULL;

// Constructor for the virtual mouse device. It is derived from 
// KHidDevice.

VirtualHidMouse::VirtualHidMouse(PDEVICE_OBJECT Fdo) :
	KHidDevice(
		Fdo,
		MouseHidReportDesc,
		sizeof MouseHidReportDesc,
		DeviceID,
		HardwareID,
		NULL,
		NULL,
		&DeviceAttributes,
		&TheDeviceString.Sd1,
		sizeof TheDeviceString,
		0		
		)
{
	T << "VirtualHidMouse()\n";

	g_DeviceInstance = this; 

	m_DeltaX = m_DeltaY = 0;
	m_OldButtonState = m_NewButtonState = 0;

// Set up the PDO connection

	m_Pdo.Initialize(PDO(), TopOfStack());

	SetLowerDevice(&m_Pdo);

// Set standard policies
	SetPnpPolicy();

// Customize the policy for canceling the current IRP
	m_Policies.m_QueryRemovePolicy.m_CancelCurrentIrp = TRUE;

// Set up the VxD interface
//	m_Vxd.Initialize("VHIDMSE", VxdControlMessageHandler, this);
}

// HIDCLASS calls this routine when it wants a report. We
// serialize this IRP so that when we get input, we know
// which IRP it is intended for. Note that HIDCLASS actually
// created the device object, so we're assuming that HIDCLASS
// is not using the device queue.

NTSTATUS VirtualHidMouse::ReadReport(KIrp I)
{
	return QueueIrp(I, LinkTo(CancelQueuedIrp));	// queue to device queue.

// Note: A driver that relies on a bus driver or some other
// lower level device to process the IRP should generally not queue
// the IRP. Queueing is primarily used by lowest level drivers.
// If this rule is not followed, then the lower device's dispatch
// routines will be called at raised IRQL, and this is generally
// not good.	
}


VOID VirtualHidMouse::CancelQueuedIrp(KIrp I)
{
	KDeviceQueue dq(DeviceQueue());

	if ( (PIRP)I == CurrentIrp() )
	{
		CurrentIrp() = NULL;
		CancelSpinLock::Release(I.CancelIrql());
		T << "Read IRP canceled " << I << "\n";
	    I.Information() = 0;
		I.Status() = STATUS_CANCELLED;
		PnpNextIrp(I);
	}
	else if (dq.RemoveSpecificEntry(I))
	{
		CancelSpinLock::Release(I.CancelIrql());
		T << "Read IRP canceled " << I << "\n";
	    I.Information() = 0;
		I.PnpComplete(this, STATUS_CANCELLED);
	}
	else
	{
		CancelSpinLock::Release(I.CancelIrql());
	}
}


// StartIo 

VOID VirtualHidMouse::StartIo(KIrp I)
{
	ASSERT (I.MajorFunction() == IRP_MJ_INTERNAL_DEVICE_CONTROL);
	ASSERT (I.IoctlCode() == IOCTL_HID_READ_REPORT);

// See if there is any input to report

	UpdateState();
}

// UpdateState
//
// Completes the current IRP if there is anything to report
//
VOID VirtualHidMouse::UpdateState(void)
{
	KIrp I=CurrentIrp();

	if ( !I.IsNull() )
	{
		m_Lock.Lock();

		if ( (m_DeltaX != 0) || 
		     (m_DeltaY != 0) || 
		     (m_NewButtonState != m_OldButtonState)
		   )
		{
			// Before processing the Irp, we need to check to see if it has been
			// canceled.  We also want to set the Irp into an non-cancelable
			// state (cancel routine set to NULL) so we can process it. When
			// performing these operations, it is necessary to hold the global
			// cancel spin lock and take special precautions to ensure the Irp
			// is still valid.  This is accomplished using the routine
			// KIrp::TestAndSetCancelRoutine().
			if ( !I.TestAndSetCancelRoutine(
				LinkTo(CancelQueuedIrp),
				NULL,
				CurrentIrp()) )
			{
				
				// The Irp has been canceled we stop processing and exit.  Since
				// it was in a cancelable state previously, it will be completed by
				// the cancel routine that had been set on it.
				return;
			}

			MouseReport* pReport = (MouseReport*)I.UserBuffer();

			pReport->buttons = m_NewButtonState;
			pReport->deltaX = m_DeltaX;
			pReport->deltaY = m_DeltaY;

			m_DeltaX = m_DeltaY = 0;
			m_OldButtonState = m_NewButtonState;

			I.Information() = sizeof(MouseReport);
			I.Status() = STATUS_SUCCESS;

			m_Lock.Unlock();
			PnpNextIrp(I);
		}
		else
			m_Lock.Unlock();
	}
}

// Called indirectly by other drivers when the virtual mouse
// moves.

VOID VirtualHidMouse::Move(CHAR DeltaX, CHAR DeltaY)
{
	m_Lock.Lock();

	m_DeltaX += DeltaX*SCALEX;
	m_DeltaY += DeltaY*SCALEY;

	m_Lock.Unlock();

	UpdateState();
}

// Called indirectly by other drivers when a virtual mouse
// button is clicked.
// 
// Input:
// 	LeftOrRight: 1=Left, 0=Right
// 	DownOrUp:	 1=Down, 0=Up
//
VOID VirtualHidMouse::Click(ULONG LeftOrRight, ULONG DownOrUp)
{
	m_Lock.Lock();

	if (DownOrUp != 0) 	// down
	{
		if (LeftOrRight != 0) // left
			m_NewButtonState = (m_OldButtonState | LEFT_BUTTON);
		else // right
			m_NewButtonState = (m_OldButtonState | RIGHT_BUTTON);
	}
	else	// up
	{
		if (LeftOrRight != 0) // left
			m_NewButtonState = (m_OldButtonState & ~LEFT_BUTTON);
		else // right
			m_NewButtonState = (m_OldButtonState & ~RIGHT_BUTTON);
	}

	m_Lock.Unlock();

	UpdateState();
}


NTSTATUS VirtualHidMouse::DefaultHidRequestHandler(KIrp I)
{
	T << "DefaultHidRequestHandler()\n";

	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Pdo.PnpCall(this, I);
}



//////////////////////////////////////////////////////////////////
// VirtualHidMouse::DefaultPnp
//
// This handler is the override of KPnpDdevice::Default. It provides 
// default functionality for IRP_MJ_PNP. The
// system invokes this function whenever the device receives a
// Pnp IRP having a minor function for which the corresponding
// member function of KPnpDevice is not overridden. Note that
// KHidDevice provides overrides for some of the KPnpDevice members
// (e.g. OnRemoveDevice).
//
// Subclasses should consider if this is the appropriate default
// functionality. If not, override the function.
//
NTSTATUS VirtualHidMouse::DefaultPnp(KIrp I)
{
	T << "DefaultPnp Pnp request, minor=" << ULONG(I.MinorFunction()) << "\n";
	
	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Pdo.PnpCall(this, I);
}

//////////////////////////////////////////////////////////////////
// VirtualHidMouse::DefaultPower
//
// This handler is the override of KPnpDdevice::Default. It provides 
// default functionality for IRP_MJ_POWER. The
// system invokes this function whenever the device receives a
// Power IRP having a minor function for which the corresponding
// member function of KPnpDevice is not overridden. 
//
// Subclasses should consider if this is the appropriate default
// functionality. If not, override the function.
//
NTSTATUS VirtualHidMouse::DefaultPower(KIrp I)
{
	T << "DefaultPower Power request, minor=" << ULONG(I.MinorFunction()) << "\n";

	I.IndicatePowerIrpProcessed();
	I.CopyParametersDown();
	return m_Pdo.PnpPowerCall(this, I);
}


////////////////////////////////////////////////////////////////////////////////
// SystemControl
//
// This routine just passes the IRP through to the next device since this driver
// is not a WMI provider.
//
NTSTATUS VirtualHidMouse::SystemControl(KIrp I) 
{
	I.ForceReuseOfCurrentStackLocationInCalldown();
	return m_Pdo.PnpCall(this, I);
}


///////////////////////////////////////////////////////////////////
// OnQueryStopDevice
//
// This call queries the device to determine if a STOP can be done
//
NTSTATUS VirtualHidMouse::OnQueryStopDevice(KIrp I)
{
	T << "OnQueryStopDevice()\n";
	return STATUS_SUCCESS;
}

///////////////////////////////////////////////////////////////////
// OnQueryRemoveDevice
//
// The system is querying the device to determine if a REMOVE can be done
//
NTSTATUS VirtualHidMouse::OnQueryRemoveDevice(KIrp I)
{
	T << "OnQueryRemoveDevice()\n";
	return STATUS_SUCCESS;
}


///////////////////////////////////////////////////////////////////
// OnCancelStopDevice
//
// This call instructs the device to cancel a pending stop operation
//
NTSTATUS VirtualHidMouse::OnCancelStopDevice(KIrp I)
{
	T << "OnCancelStopDevice()\n";
	return STATUS_SUCCESS;
}


///////////////////////////////////////////////////////////////////
// OnCancelRemoveDevice
//
// This call instructs the device to cancel a pending stop operation
//
NTSTATUS VirtualHidMouse::OnCancelRemoveDevice(KIrp I)
{
	T << "OnCancelRemoveDevice()\n";
	return STATUS_SUCCESS;
}

///////////////////////////////////////////////////////////////////
// OnStartDevice
//
// This call instructs the device to start operation. Relevant
// policies:
//
//		m_Policies.m_CompletedByDriverWorks.m_StartDevice = TRUE
//		m_Policies.m_ForwardToPdoPolicy.m_CallBeforeStart = TRUE
//
NTSTATUS VirtualHidMouse::OnStartDevice(KIrp I)
{
	T << "OnStartDevice()\n";

	if (!m_State.m_Started)
	{
		// initialize the device
	}

	return STATUS_SUCCESS;
}

///////////////////////////////////////////////////////////////////
// OnStopDevice
//
// This call instructs the device to uninitialize itself. Relevant
// policies:
//
//		m_Policies.m_CompletedByDriverWorks.m_StopDevice = TRUE
//		m_Policies.m_ForwardToPdoPolicy.m_CallAfterStop = TRUE
//		m_Policies.m_HoldPolicy.m_CancelAllOnStop = TRUE
//
NTSTATUS VirtualHidMouse::OnStopDevice(KIrp I)
{
	T << "OnStopDevice()\n";

	if (m_State.m_Started)
	{
		// undo OnStartDevice here
	}

	return STATUS_SUCCESS;	// IRP completed by D::W
}

//////////////////////////////////////////////////////////////////
// VirtualHidMouse::OnRemoveDevice
//
// Override of KPnpDevice member. The system calls when the device
// is removed. If a device has outstanding IRPs, it should make
// sure they are all complete before deleting itself. 

NTSTATUS VirtualHidMouse::OnRemoveDevice(KIrp I)
{
	T << "OnRemoveDevice()\n";
	return STATUS_SUCCESS;
}

///////////////////////////////////////////////////////////////////////////////
// VxD Control Message Interface 
//
// VxD KbdMouse uses Directed_Sys_Control to call this interface
//
ULONG __stdcall VxdControlMessageHandler(
	ULONG Edi,
	ULONG Esi,
	ULONG Ebp,
	ULONG Esp,
	ULONG Ebx,
	ULONG Edx,
	ULONG Ecx,
	ULONG ControlMessage,
	PVOID Context,
	ULONG* pCarryBitReturn
	)
{
	if (ControlMessage == W32_DEVICEIOCONTROL)
	{
		PIOCTLPARAMS p = PIOCTLPARAMS(Esi);
		MOUSE_MOVE_INFO* pMove = (MOUSE_MOVE_INFO*)p->dioc_InBuf;
		MOUSE_CLICK_INFO* pClick = (MOUSE_CLICK_INFO*)p->dioc_InBuf;

		switch (p->dioc_IOCtlCode)
		{
		case IOCTL_VHIDMOU_MOVE:

			T << "Move x=" << pMove->deltaX << " y=" << pMove->deltaY << "\n";

			g_DeviceInstance->Move(UCHAR(pMove->deltaX), UCHAR(pMove->deltaY));
			return STATUS_SUCCESS;

		case IOCTL_VHIDMOU_CLICK:

			T << "Click U/D=" << pClick->UpOrDown << " L/R=" << pClick->LeftOrRight << "\n";

			g_DeviceInstance->Click(pClick->LeftOrRight, pClick->UpOrDown);
			return STATUS_SUCCESS;

		default:
			return STATUS_NOT_IMPLEMENTED;
		}
	}
	else
	{
		*pCarryBitReturn = 0;
		return 0;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线播| 成人免费看片app下载| 国产精品一区二区男女羞羞无遮挡| proumb性欧美在线观看| 日韩欧美国产一区二区三区| 亚洲欧美另类小说视频| 国产剧情在线观看一区二区| 欧美欧美欧美欧美首页| 国产精品国产成人国产三级 | 久久69国产一区二区蜜臀| gogogo免费视频观看亚洲一| 欧美大片日本大片免费观看| 婷婷亚洲久悠悠色悠在线播放| 91在线观看一区二区| 久久九九影视网| 久久精品国产精品亚洲精品| 欧美精品视频www在线观看| 亚洲欧美自拍偷拍色图| 国产精品99久久久久久久女警| 欧美一区日本一区韩国一区| 亚洲国产裸拍裸体视频在线观看乱了 | 成人午夜在线播放| 久久综合狠狠综合| 激情欧美一区二区三区在线观看| 9191成人精品久久| 亚洲大片免费看| 欧美日韩极品在线观看一区| 亚洲一二三专区| 欧美性猛片aaaaaaa做受| 亚洲欧美另类久久久精品2019 | 国产精品一区二区久激情瑜伽| 91精品国产欧美一区二区成人| 污片在线观看一区二区| 欧美色男人天堂| 日韩电影在线免费观看| 91精品国产综合久久国产大片| 日韩高清不卡一区二区三区| 在线成人免费观看| 日韩av电影天堂| 欧美一区二区三区啪啪| 日本欧美在线观看| 日韩午夜电影在线观看| 极品销魂美女一区二区三区| 久久久久久久一区| 成人精品电影在线观看| 亚洲日本在线天堂| 欧美系列亚洲系列| 免费精品视频在线| 久久精品一区二区| 99久久国产综合精品女不卡| 一区二区三区四区高清精品免费观看 | 欧美一区2区视频在线观看| 免费在线观看精品| 国产日韩欧美一区二区三区乱码| 成人视屏免费看| 一区二区三区**美女毛片| 欧美日韩亚州综合| 国产一区不卡在线| 一区二区免费视频| 91精品午夜视频| 成人免费精品视频| 亚洲成人1区2区| 久久久久久毛片| 欧美影院一区二区三区| 国产一区欧美二区| 一区二区不卡在线播放| 2欧美一区二区三区在线观看视频| 99久久婷婷国产综合精品| 日本欧美久久久久免费播放网| 国产视频一区在线播放| 欧美日韩国产一区二区三区地区| 精品一区二区三区在线视频| 亚洲欧美一区二区三区国产精品| 91麻豆精品国产91久久久久久| 成人激情视频网站| 美洲天堂一区二卡三卡四卡视频| 一区二区中文视频| 2014亚洲片线观看视频免费| 在线观看国产日韩| 丁香六月久久综合狠狠色| 日韩成人免费在线| 亚洲欧美国产77777| 亚洲精品一区二区三区四区高清| 欧美在线免费观看亚洲| 粉嫩欧美一区二区三区高清影视| 天天色天天操综合| 亚洲美女淫视频| 欧美国产精品v| 日韩精品一区二区三区中文精品| 色婷婷一区二区| 成人丝袜视频网| 国产在线国偷精品免费看| 日韩电影一二三区| 亚洲成人激情av| 一区二区三区电影在线播| 亚洲视频狠狠干| 国产欧美日韩视频在线观看| 欧美mv和日韩mv国产网站| 欧美日韩精品三区| 欧美日韩国产免费一区二区| 日本韩国精品在线| 色综合色综合色综合| 波波电影院一区二区三区| 国产一区二区三区最好精华液| 三级久久三级久久久| 日本怡春院一区二区| 五月婷婷欧美视频| 午夜精品久久久久久久久久久| 一区二区三区四区精品在线视频| 日韩一区中文字幕| 亚洲人成网站影音先锋播放| 中文字幕欧美一| 亚洲免费看黄网站| 亚洲精品中文在线| 伊人性伊人情综合网| 亚洲免费电影在线| 亚洲国产精品久久一线不卡| 天天操天天综合网| 免费一级欧美片在线观看| 久久精品国产亚洲5555| 国产综合一区二区| 成人小视频免费观看| 色中色一区二区| 欧美日韩一区在线| 日韩午夜激情av| 国产亚洲一区二区三区在线观看 | 亚洲人成网站在线| 亚洲午夜激情av| 欧美a级一区二区| 国产乱子伦视频一区二区三区 | 国产精品综合av一区二区国产馆| 欧美日韩一区久久| 欧美日韩激情在线| 日韩欧美中文字幕公布| 欧美精品一区二区三区四区| 久久精品日韩一区二区三区| 中文字幕在线不卡国产视频| 一区二区国产视频| 免费三级欧美电影| 国产成人在线观看免费网站| av一本久道久久综合久久鬼色| 91麻豆福利精品推荐| 91精品黄色片免费大全| 2023国产一二三区日本精品2022| 国产精品久久久久毛片软件| 亚洲高清不卡在线观看| 国内精品国产成人国产三级粉色| 国产aⅴ精品一区二区三区色成熟| 99久久婷婷国产| 日韩一区二区三区av| 国产精品狼人久久影院观看方式| 亚洲综合色自拍一区| 激情久久五月天| 99国产精品久久久| 日韩一级二级三级| 亚洲欧美乱综合| 国产伦精品一区二区三区免费| 96av麻豆蜜桃一区二区| 日韩精品一区二区在线| 亚洲激情图片qvod| 国产成人综合在线观看| 欧美日韩精品一区二区三区 | 亚洲女女做受ⅹxx高潮| 精品综合免费视频观看| 欧洲激情一区二区| 国产日产欧美一区二区视频| 婷婷综合五月天| 在线看国产日韩| 国产精品久久久久天堂| 韩国女主播一区| 8x福利精品第一导航| 国产精品美女久久久久久久久久久 | 国产尤物一区二区在线| 欧美亚洲免费在线一区| 国产精品久久久久久久蜜臀 | 亚洲成人午夜电影| 成人av在线电影| 26uuu久久天堂性欧美| 午夜精品福利一区二区蜜股av| 99久久精品免费| 国产欧美日韩久久| 韩国精品一区二区| 日韩三级免费观看| 天天色 色综合| 欧美日韩国产精选| 亚洲国产综合色| 欧亚一区二区三区| 亚洲精品成人悠悠色影视| 成人免费毛片aaaaa**| 国产欧美精品在线观看| 国产精品自在在线| 久久综合99re88久久爱| 美国十次综合导航| 91精品国产欧美一区二区成人| 亚洲国产日产av| 欧美撒尿777hd撒尿| 亚洲第一二三四区| 精品视频在线免费观看| 午夜视黄欧洲亚洲| 69堂精品视频|