⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dispatch.cpp

📁 2009 最新測試成功的 Virtual Mouse 哈哈 !! 只有這裡才有喔
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////
//	dispatch.cpp:	Other IRP handlers
/////////////////////////////////////////////////////////////////////////////
//	Create			Handle Create/Open file IRP
//	Close			Handle Close file IRPs
//	Read			Handle Read IRPs
//	Write			Handle Write IRPs
//	DeviceControl	Handle DeviceIoControl IRPs
//	SystemControl	Handle WMI IRPs
/////////////////////////////////////////////////////////////////////////////

#include "VKeyFdo.h"
#include "..\inc\vkIoctl.h"

#define _MOUSE_
#include <ntddmou.h>
/////////////////////////////////////////////////////////////////////////////
//	Create:
//
//	Description:
//		Handle IRP_MJ_CREATE requests
//
//	Arguments:
//		Pointer to our FDO
//		Pointer to the IRP
//			IrpStack->Parameters.Create.xxx has create parameters
//			IrpStack->FileObject->FileName has file name of device
//
//	Return Value:
//		This function returns STATUS_XXX

PDEVICE_OBJECT FunctionDevice  = 0;
PDEVICE_OBJECT KeyboardClassDO = 0;
int UnitId = 0;
//#ifdef _MOUSE_
MouseClassServiceCallback SeviceCallbackMouse = 0;
//#else
KeyboardClassServiceCallback SeviceCallback = 0;
//#endif

NTSTATUS Create(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
	
#ifdef _MOUSE_
	if( (SeviceCallbackMouse == 0) || (0 == KeyboardClassDO) )
	{
		return CompleteIrp(Irp,STATUS_DEVICE_OFF_LINE,0);
	}	// Complete successfully

#else
	if( (SeviceCallback == 0) || (0 == KeyboardClassDO) )
	{
		return CompleteIrp(Irp,STATUS_DEVICE_OFF_LINE,0);
	}	// Complete successfully

#endif

	return CompleteIrp(Irp,STATUS_SUCCESS,0);
}

/////////////////////////////////////////////////////////////////////////////
//	Close:
//
//	Description:
//		Handle IRP_MJ_CLOSE requests
//
//	Arguments:
//		Pointer to our FDO
//		Pointer to the IRP
//
//	Return Value:
//		This function returns STATUS_XXX

NTSTATUS Close(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
	// Complete successfully
	return CompleteIrp(Irp,STATUS_SUCCESS,0);
}

/////////////////////////////////////////////////////////////////////////////
//	DeviceControl:
//
//	Description:
//		Handle IRP_MJ_DEVICE_CONTROL requests
//
//	Arguments:
//		Pointer to our FDO
//		Pointer to the IRP
//			Buffered:	AssociatedIrp.SystemBuffer (and IrpStack->Parameters.DeviceIoControl.Type3InputBuffer)
//			Direct:		MdlAddress
//
//			IrpStack->Parameters.DeviceIoControl.InputBufferLength
//			IrpStack->Parameters.DeviceIoControl.OutputBufferLength 
//
//	Return Value:
//		This function returns STATUS_XXX

NTSTATUS DeviceControl(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
	if(FunctionDevice != fdo)
	{
		PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
		ULONG CtlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
		DbgPrint("device io ctrl code = %x\n",CtlCode);

		PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
		IoSkipCurrentIrpStackLocation(Irp);
		return IoCallDriver( dx->NextStackDevice, Irp);
	}

	PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

	NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
	ULONG BytesTxd = 0;

	ULONG ControlCode    = IrpStack->Parameters.DeviceIoControl.IoControlCode;
	PVK_SENDKEY ioBuffer = (PVK_SENDKEY)Irp->AssociatedIrp.SystemBuffer;
	ULONG InputLength    = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
	//ULONG OutputLength   = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;

	switch( ControlCode)
	{

#ifdef _MOUSE_

		case IOCTL_VHIDMOU_RIGHT_UP:
			// Send data to KeyboardClass
		{
	
		ULONG NumSend = 0;
		MYMOUSE_INPUT_DATA Data[6];
	   
        //Data.ButtonFlags=MOUSE_MOVE_RELATIVE;
        Data[0].ButtonFlags=MOUSE_RIGHT_BUTTON_UP;

        Data[0].Buttons=0x08;
		Data[0].ButtonData=0;
		Data[0].UnitId=0;
		Data[0].Flags=UnitId;
		Data[0].RawButtons=0;
        Data[0].ExtraInformation=0;
        Data[0].LastX=0;
        Data[0].LastY=0;


		SeviceCallbackMouse(KeyboardClassDO,Data,&Data[1],&NumSend);
		}
		break;
        case IOCTL_VHIDMOU_LEFT_UP:
			// Send data to KeyboardClass
		{
	
		ULONG NumSend = 0;
		MYMOUSE_INPUT_DATA Data[6];
	   
        //Data.ButtonFlags=MOUSE_MOVE_RELATIVE;
        Data[0].ButtonFlags=MOUSE_LEFT_BUTTON_UP;

        Data[0].Buttons=0x02;
		Data[0].ButtonData=0;
		Data[0].UnitId=0;
		Data[0].Flags=UnitId;
		Data[0].RawButtons=0;
        Data[0].ExtraInformation=0;
        Data[0].LastX=0;
        Data[0].LastY=0;


		SeviceCallbackMouse(KeyboardClassDO,Data,&Data[1],&NumSend);
		}
		break;

    case IOCTL_VHIDMOU_RIGHT_DOWN:
			// Send data to KeyboardClass
		{
	
		ULONG NumSend = 0;
		MYMOUSE_INPUT_DATA Data[6];
	   
        //Data.ButtonFlags=MOUSE_MOVE_RELATIVE;
        Data[0].ButtonFlags=MOUSE_RIGHT_BUTTON_DOWN;

        Data[0].Buttons=0x04;
		Data[0].ButtonData=0;
		Data[0].UnitId=0;
		Data[0].Flags=UnitId;
		Data[0].RawButtons=0;
        Data[0].ExtraInformation=0;
        Data[0].LastX=0;
        Data[0].LastY=0;


		SeviceCallbackMouse(KeyboardClassDO,Data,&Data[1],&NumSend);
		}
		break;
        case IOCTL_VHIDMOU_LEFT_DOWN:
			// Send data to KeyboardClass
		{
	
		ULONG NumSend = 0;
		MYMOUSE_INPUT_DATA Data[6];
	   
        //Data.ButtonFlags=MOUSE_MOVE_RELATIVE;
        Data[0].ButtonFlags=MOUSE_LEFT_BUTTON_DOWN;

        Data[0].Buttons=0x01;
		Data[0].ButtonData=0;
		Data[0].UnitId=0;
		Data[0].Flags=UnitId;
		Data[0].RawButtons=0;
        Data[0].ExtraInformation=0;
        Data[0].LastX=0;
        Data[0].LastY=0;


		SeviceCallbackMouse(KeyboardClassDO,Data,&Data[1],&NumSend);
		}
		break;

#endif	

    case IOCTL_VHIDMOU_CLICK:
	case IOCTL_SENDKEY:
			// Send data to KeyboardClass
		{
#ifdef _MOUSE_
	
		ULONG NumSend = 0;
		MYMOUSE_INPUT_DATA Data[6];
	   
        //Data.ButtonFlags=MOUSE_MOVE_RELATIVE;
        Data[0].ButtonFlags=MOUSE_RIGHT_BUTTON_DOWN;

        Data[0].Buttons=0x04;
		Data[0].ButtonData=0;
		Data[0].UnitId=0;
		Data[0].Flags=UnitId;
		Data[0].RawButtons=0;
        Data[0].ExtraInformation=0;
        Data[0].LastX=0;
        Data[0].LastY=0;


		SeviceCallbackMouse(KeyboardClassDO,Data,&Data[1],&NumSend);
	
#else
	   if( (ioBuffer==0) || (InputLength < sizeof(VK_SENDKEY)) || (ioBuffer->Count > 5) )
		{
			status = STATUS_INVALID_PARAMETER;
			break;
		}

		// Send data to KeyboardClass
		{
		ULONG NumSend = 0;
		MYKEYBOARD_INPUT_DATA Data[6];
		for(int i =0 ; i< ioBuffer->Count ; i++)
		{
			if( ioBuffer->Keys[i].Press == 0 )
			{
				Data[i].Flags = KEY_BREAK;
			}
			Data[i].UnitId   = UnitId ;
			Data[i].MakeCode = ioBuffer->Keys[i].Code;
		}

		SeviceCallback(KeyboardClassDO,Data,&Data[ioBuffer->Count],&NumSend);
		}

#endif
	

		status = STATUS_SUCCESS;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -