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

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

?? vmoudev.cpp

?? 一個鼠標驅動源程序
?? 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* 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		
		)
{
	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 << "Unhandled HID request\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 << "Unhandled 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 << "Unhandled Power request, minor=" << ULONG(I.MinorFunction()) << "\n";

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


///////////////////////////////////////////////////////////////////
// OnQueryStopDevice
//
// This call queries the device to determine if a STOP can be done
//
NTSTATUS VirtualHidMouse::OnQueryStopDevice(KIrp I)
{
	T << "Query Stop\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 << "Query Remove\n";
	return STATUS_SUCCESS;
}


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


///////////////////////////////////////////////////////////////////
// OnCancelRemoveDevice
//
// This call instructs the device to cancel a pending stop operation
//
NTSTATUS VirtualHidMouse::OnCancelRemoveDevice(KIrp I)
{
	T << "Cancel Remove\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 << "Start Device\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 << "Stop Device\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)
{
	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";

			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";

			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一区二区三区免费野_久草精品视频
日韩一级片在线播放| 亚洲视频一区二区免费在线观看| 精品亚洲国产成人av制服丝袜 | 久久婷婷色综合| 欧美亚洲国产一区二区三区 | 91免费视频观看| 国产主播一区二区三区| 午夜伦欧美伦电影理论片| 97国产精品videossex| 亚洲综合在线第一页| 国产色一区二区| 日韩欧美一二三四区| 91久久一区二区| 99综合电影在线视频| 国产一区在线观看麻豆| 五月激情综合婷婷| 亚洲国产精品久久人人爱蜜臀| 国产日韩v精品一区二区| 欧美成人精品3d动漫h| 欧美日韩国产综合视频在线观看| 国产成人精品免费在线| 精品中文字幕一区二区小辣椒| 亚洲一区二区三区小说| 日韩毛片视频在线看| 中文字幕不卡在线| 精品精品欲导航| 日韩视频免费观看高清完整版| 欧美色窝79yyyycom| 日本高清视频一区二区| eeuss鲁一区二区三区| 不卡一区二区中文字幕| youjizz国产精品| 粉嫩高潮美女一区二区三区| 国产乱码精品一区二区三区五月婷| 秋霞午夜av一区二区三区| 日韩av中文在线观看| 丝袜诱惑制服诱惑色一区在线观看| 亚洲精品乱码久久久久| 亚洲乱码国产乱码精品精小说| 中文字幕一区二区不卡| 国产精品蜜臀av| 中文字幕一区免费在线观看| 中文字幕在线观看不卡| 亚洲伦理在线精品| 亚洲精品国产一区二区精华液| 亚洲精品老司机| 性欧美疯狂xxxxbbbb| 日韩av中文字幕一区二区三区| 日韩国产高清在线| 精品综合免费视频观看| 国产成人在线看| 成人福利电影精品一区二区在线观看| 高清成人免费视频| 99综合电影在线视频| 日本二三区不卡| 欧美肥大bbwbbw高潮| 91麻豆精品国产91久久久资源速度| 欧美一区二区在线看| 精品日本一线二线三线不卡| 久久精品人人做人人爽人人| 亚洲欧洲精品天堂一级| 一区二区三区精品| 偷偷要91色婷婷| 国产精品一区二区在线看| www.亚洲色图| 欧美熟乱第一页| 欧美videossexotv100| 国产欧美一区二区三区在线老狼| 日韩毛片在线免费观看| 日韩精品免费专区| 国产91精品一区二区麻豆亚洲| jizzjizzjizz欧美| 欧美顶级少妇做爰| 久久久久久久久久久电影| 亚洲美腿欧美偷拍| 美女视频黄久久| 成人av电影免费观看| 欧美在线|欧美| 精品国内片67194| 中文av一区特黄| 婷婷久久综合九色国产成人 | 亚洲高清中文字幕| 久久66热re国产| 色综合久久久久网| 日韩免费高清电影| 日韩一区日韩二区| 久久不见久久见免费视频7| 97国产一区二区| 日韩国产欧美在线视频| 国产精品自在欧美一区| 欧美三级日韩在线| 国产精品色婷婷| 裸体在线国模精品偷拍| 99在线精品观看| 久久免费午夜影院| 婷婷久久综合九色综合绿巨人| 成人精品在线视频观看| 精品久久久久一区二区国产| 亚洲国产日韩综合久久精品| 国产91精品在线观看| 欧美一区二区大片| 亚洲人成影院在线观看| 国产精品影视在线观看| 欧美一区二区三区免费大片| 亚洲黄色免费电影| 不卡av在线网| 2023国产精品自拍| 青青国产91久久久久久| 在线视频你懂得一区| 中文字幕亚洲精品在线观看| 激情综合五月天| 欧美一区二区三区男人的天堂| 亚洲精品日日夜夜| 91美女视频网站| 国产精品久久久久三级| 韩国三级电影一区二区| 欧美一级二级在线观看| 亚洲综合另类小说| 91丨porny丨在线| 国产性做久久久久久| 精品在线一区二区| 欧美成人video| 轻轻草成人在线| 欧美日韩的一区二区| 亚洲电影一级片| 在线观看三级视频欧美| 一区二区三区四区乱视频| 99国产精品久久| 中文字幕日韩欧美一区二区三区| 国产精品一二一区| 久久你懂得1024| 国产成人免费视频网站| 国产欧美日韩视频在线观看| 国产一区二区精品久久| 国产日韩av一区二区| 粉嫩av亚洲一区二区图片| 国产亚洲精品超碰| 成人av网站在线观看免费| 久久亚洲一区二区三区明星换脸| 久草这里只有精品视频| 久久午夜电影网| 成人激情免费电影网址| 国产精品乱人伦中文| 91小视频免费观看| 一区二区三区毛片| 欧美精品自拍偷拍动漫精品| 日韩电影在线观看电影| 精品乱人伦一区二区三区| 国产乱国产乱300精品| 中文字幕免费不卡在线| 91在线免费视频观看| 一区二区三区中文在线| 欧美日韩国产大片| 九九视频精品免费| 国产精品久久久久aaaa| 91美女福利视频| 午夜精品一区二区三区三上悠亚| 69成人精品免费视频| 国产综合色视频| 成人欧美一区二区三区小说| 欧美色视频在线| 激情综合一区二区三区| 中文字幕一区二| 欧美无砖砖区免费| 久久精品国产99| 国产精品灌醉下药二区| 欧美亚洲高清一区二区三区不卡| 日韩精品一二区| 国产女主播一区| 欧美日韩黄色一区二区| 经典三级视频一区| 亚洲视频一区在线观看| 日韩一级二级三级精品视频| 成人在线综合网站| 天天影视色香欲综合网老头| 国产三级精品三级在线专区| 欧美视频一区二区三区四区| 久久99国产精品免费| 亚洲欧洲99久久| 日韩色在线观看| 91尤物视频在线观看| 日本欧美在线看| 综合欧美亚洲日本| 精品免费国产二区三区 | 欧美四级电影网| 国产精华液一区二区三区| 亚洲v中文字幕| 中文字幕精品综合| 欧美一二三在线| 97久久超碰精品国产| 精品伊人久久久久7777人| 中文字幕日韩精品一区| 精品国产91九色蝌蚪| 欧美日韩三级一区二区| 成人三级在线视频| 奇米影视7777精品一区二区| 亚洲欧美电影一区二区| 国产人伦精品一区二区| 欧美一区二区视频网站| 色女孩综合影院|