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

📄 dispatch.cpp

📁 虚拟的键盘设备。安装后系统中出现一个虚拟的键盘设备。可以通过设备管理器看到。名字叫 virtual keyboard
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////
//	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"

/////////////////////////////////////////////////////////////////////////////
//	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;
KeyboardClassServiceCallback SeviceCallback = 0;

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

	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)
	{
	case IOCTL_SENDKEY:
		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);
		}

		status = STATUS_SUCCESS;
		break;

	default:
		status = STATUS_INVALID_DEVICE_REQUEST;
	}

	// Complete IRP
	return CompleteIrp(Irp,status,BytesTxd);
}

/////////////////////////////////////////////////////////////////////////////
//	InternalControl:
//
//	Description:
//		Handle IRP_MJ_INTERNAL_DEVICE_CONTROL requests
//	Return Value:
//		This function returns STATUS_XXX
NTSTATUS InternalControl(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
	PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;

	PIO_STACK_LOCATION              irpStack;
	irpStack = IoGetCurrentIrpStackLocation(Irp);

	ULONG CtlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
	DbgPrint("internal = %x\n",CtlCode);

	switch(CtlCode)
	{
	case IOCTL_INTERNAL_KEYBOARD_CONNECT:
		if (irpStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(CONNECT_DATA))
		{
			PCONNECT_DATA connectData = ((PCONNECT_DATA)(irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
			KeyboardClassDO = connectData->ClassDeviceObject;
			SeviceCallback  = (KeyboardClassServiceCallback)connectData->ClassService;

			DbgPrint("KeyClass = %x,Service Callback = %x\n",KeyboardClassDO,SeviceCallback);
			return CompleteIrp(Irp,STATUS_SUCCESS,0);
		}
		break;
	case IOCTL_KEYBOARD_QUERY_ATTRIBUTES:
		if(irpStack->Parameters.DeviceIoControl.InputBufferLength>=sizeof(KEYBOARD_UNIT_ID_PARAMETER))
		{
			PKEYBOARD_UNIT_ID_PARAMETER puip = (PKEYBOARD_UNIT_ID_PARAMETER) Irp->AssociatedIrp.SystemBuffer ;
			UnitId = puip-> UnitId;
			DbgPrint("id = %x\n",UnitId);
		}
		else
		{
			DbgPrint("id = 0\n");
		}

		if (irpStack->Parameters.DeviceIoControl.OutputBufferLength <sizeof(KEYBOARD_ATTRIBUTES))
		{
			return CompleteIrp(Irp,STATUS_BUFFER_TOO_SMALL,0);
		}
		else
		{
			PKEYBOARD_ATTRIBUTES pka = (PKEYBOARD_ATTRIBUTES) Irp->AssociatedIrp.SystemBuffer ;
			pka->KeyboardIdentifier.Type    = 2;
			pka->KeyboardIdentifier.Subtype = 0;
			pka->KeyboardMode               = 2;
			pka->NumberOfFunctionKeys       = 0;
			pka->NumberOfIndicators         = 0;
			pka->NumberOfKeysTotal          = 101;
			pka->InputDataQueueLength       = 256;
			pka->KeyRepeatMinimum.UnitId    = UnitId;
			pka->KeyRepeatMinimum.Rate      = 15;
			pka->KeyRepeatMinimum.Delay     = 100;
			pka->KeyRepeatMaximum.UnitId    = UnitId;
			pka->KeyRepeatMaximum.Rate      = 150;
			pka->KeyRepeatMaximum.Delay     = 10;
			return CompleteIrp(Irp,STATUS_SUCCESS,sizeof(KEYBOARD_ATTRIBUTES));
		}
	case IOCTL_KEYBOARD_SET_TYPEMATIC:
		DbgPrint("IOCTL_KEYBOARD_SET_TYPEMATIC\n");
		break;
	case IOCTL_KEYBOARD_SET_INDICATORS:
		DbgPrint("IOCTL_KEYBOARD_SET_INDICATORS\n");
		break;
	case IOCTL_KEYBOARD_QUERY_TYPEMATIC:
		DbgPrint("IOCTL_KEYBOARD_QUERY_TYPEMATIC\n");
		break;
	case IOCTL_KEYBOARD_QUERY_INDICATORS:
		DbgPrint("IOCTL_KEYBOARD_QUERY_INDICATORS\n");
		break;
	case IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION:
		DbgPrint("IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION\n");
		break;
	case IOCTL_KEYBOARD_INSERT_DATA:
		DbgPrint("IOCTL_KEYBOARD_INSERT_DATA\n");
		break;
	}

	IoSkipCurrentIrpStackLocation(Irp);
	return IoCallDriver( dx->NextStackDevice, Irp);
}

/////////////////////////////////////////////////////////////////////////////
//	SystemControl:
//
//	Description:
//		Handle IRP_MJ_SYSTEM_CONTROL requests
//
//	Arguments:
//		Pointer to our FDO
//		Pointer to the IRP
//			Various minor parameters
//			IrpStack->Parameters.WMI.xxx has WMI parameters
//
//	Return Value:
//		This function returns STATUS_XXX

NTSTATUS SystemControl(	IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
	if(FunctionDevice == fdo)
	{
		return CompleteIrp(Irp,STATUS_UNSUCCESSFUL,0);
	}

	// Just pass to lower driver
	IoSkipCurrentIrpStackLocation(Irp);
	PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
	return IoCallDriver( dx->NextStackDevice, Irp);
}

/////////////////////////////////////////////////////////////////////////////
//	CompleteIrp:	Sets IoStatus and completes the IRP

NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info)
{
	Irp->IoStatus.Status = status;
	Irp->IoStatus.Information = info;
	IoCompleteRequest(Irp,IO_NO_INCREMENT);
	return status;
}

/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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