📄 moufiltr.c
字号:
VOID
MouFilter_ServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PMOUSE_INPUT_DATA InputDataStart,
IN PMOUSE_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
/*++
Routine Description:
Called when there are mouse packets to report to the RIT. You can do
anything you like to the packets. For instance:
o Drop a packet altogether
o Mutate the contents of a packet
o Insert packets into the stream
Arguments:
DeviceObject - Context passed during the connect IOCTL
InputDataStart - First packet to be reported
InputDataEnd - One past the last packet to be reported. Total number of
packets is equal to InputDataEnd - InputDataStart
InputDataConsumed - Set to the total number of packets consumed by the RIT
(via the function pointer we replaced in the connect
IOCTL)
Return Value:
Status is returned.
--*/
{
PDEVICE_EXTENSION devExt;
devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
/////////////////////zt00/////////
//对于输入的处理:
//始终以左、中、右的顺序思考
if(InCtrlCodeLeft==0x01&&(InputDataStart->Buttons==0x01||
InputDataStart->Buttons==0x02))
{
if(InputDataStart->Buttons==0x01)
InputDataStart->Buttons=0x01;
else
InputDataStart->Buttons=0x02;
}
else if(InCtrlCodeLeft==0x02&&(InputDataStart->Buttons==0x01||
InputDataStart->Buttons==0x02))
{
if(InputDataStart->Buttons==0x01)
InputDataStart->Buttons=0x10;
else
InputDataStart->Buttons=0x20;
}
else if(InCtrlCodeLeft==0x03&&(InputDataStart->Buttons==0x01||
InputDataStart->Buttons==0x02))
{
if(InputDataStart->Buttons==0x01)
InputDataStart->Buttons=0x04;
else
InputDataStart->Buttons=0x08;
}
////////以上为对左按键的处理////////
else if(InCtrlCodeMid==0x01&&(InputDataStart->Buttons==0x10||
InputDataStart->Buttons==0x20))
{
if(InputDataStart->Buttons==0x10)
InputDataStart->Buttons=0x01;////////////////
else
InputDataStart->Buttons=0x02;
}//////////////////////////////////////////////
else if(InCtrlCodeMid==0x02&&(InputDataStart->Buttons==0x10||
InputDataStart->Buttons==0x20))
{
if(InputDataStart->Buttons==0x10)
InputDataStart->Buttons=0x10;
else
InputDataStart->Buttons=0x20;
}
else if(InCtrlCodeMid==0x03&&(InputDataStart->Buttons==0x10||
InputDataStart->Buttons==0x20))
{
if(InputDataStart->Buttons==0x10)
InputDataStart->Buttons=0x04;
else
InputDataStart->Buttons=0x08;
}
////////以上为对中按键的处理////////
else if(InCtrlCodeRight==0x01&&(InputDataStart->Buttons==0x04||
InputDataStart->Buttons==0x08))
{
if(InputDataStart->Buttons==0x04)
InputDataStart->Buttons=0x01;
else
InputDataStart->Buttons=0x02;
}
else if(InCtrlCodeRight==0x02&&(InputDataStart->Buttons==0x04||
InputDataStart->Buttons==0x08))
{
if(InputDataStart->Buttons==0x04)
InputDataStart->Buttons=0x10;
else
InputDataStart->Buttons=0x20;
}
else if(InCtrlCodeRight==0x03&&(InputDataStart->Buttons==0x04||
InputDataStart->Buttons==0x08))
{
if(InputDataStart->Buttons==0x04)
InputDataStart->Buttons=0x04;
else
InputDataStart->Buttons=0x08;
}
////////以上为对右按键的处理////////
//对输出的处理
switch(InputDataStart->Buttons)
{
case 0x01://左键按下
OutCtrlCodeFlg=0x01;
break;
case 0x04://右键按下
OutCtrlCodeFlg=0x02;
break;
case 0x00000010://中键按下
OutCtrlCodeFlg=0x03;
break;
case 0x780400://滚轮上滚
OutCtrlCodeFlg=0x04;
break;
case 0xff880400://滚轮下滚
OutCtrlCodeFlg=0x05;
default:
break;
}
////////////////////zt00////////
if(InputDataStart->Buttons)
DBGOUT(("Buttons =%x,ButtonFlags =%x,ButtonData =%d,UnitId=%d,Flags=%d,RawButtons=%d,ExtraInformation=%d,LastX=%d,LastY=%d",
InputDataStart->Buttons,
InputDataStart->ButtonFlags,
(int)InputDataStart->ButtonData,
InputDataStart->UnitId,
InputDataStart->Flags,
InputDataStart->RawButtons,
InputDataStart->ExtraInformation,
InputDataStart->LastX,
InputDataStart->LastY
));
if(ChangeWay)//如果反向滚动
{
if(InputDataStart->ButtonData==0xff88)
InputDataStart->ButtonData=0x78;
else if(InputDataStart->ButtonData==0x78)
InputDataStart->ButtonData=0xff88;
}
//滚动行数
if(InputDataStart->ButtonData==0x78)
InputDataStart->ButtonData=(USHORT)(40*SwheelFlg);
if(InputDataStart->ButtonData==0xff88)
InputDataStart->ButtonData=(USHORT)(-40*SwheelFlg);
//
// UpperConnectData must be called at DISPATCH
//
(*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
InputDataStart,
InputDataEnd,
InputDataConsumed
);
}
VOID
MouFilter_Unload(
IN PDRIVER_OBJECT Driver
)
/*++
Routine Description:
Free all the allocated resources associated with this driver.
Arguments:
DriverObject - Pointer to the driver object.
Return Value:
None.
--*/
{
UNICODE_STRING uniDOSString;
PAGED_CODE();
if(Driver->DeviceObject->DeviceType!=FILE_DEVICE_MUPORT)
{
UNREFERENCED_PARAMETER(Driver);
ASSERT(NULL == Driver->DeviceObject);
}
else
{
RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);
// 删除符号连接和设备
IoDeleteSymbolicLink (&uniDOSString);
IoDeleteDevice(Driver->DeviceObject);
}
}
NTSTATUS
Add_IoControlDevice(
IN PDRIVER_OBJECT DriverObj,
IN PUNICODE_STRING RegtryPath)
{
PDEVICE_OBJECT deviceObject;
NTSTATUS status;
UNICODE_STRING uniNameString, uniDOSString;
RtlInitUnicodeString(&uniNameString, NameBuffer);
RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);
status = IoCreateDevice(DriverObj,sizeof(ZT_DEVICE_EXTENSION),
&uniNameString,
FILE_DEVICE_MUPORT, //kbport.h
0, FALSE, &deviceObject);
if(!NT_SUCCESS(status))
{
return status;
}
// create win32 app symboli link
status = IoCreateSymbolicLink (&uniDOSString, &uniNameString);
if (!NT_SUCCESS(status))
{
return status;
}
deviceObject->Flags |= DO_BUFFERED_IO;
return STATUS_SUCCESS;
}
NTSTATUS
IOControle_CreateClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack;
NTSTATUS ntStatus;
Irp->IoStatus.Status = STATUS_SUCCESS; // 返回状态
Irp->IoStatus.Information = 0;
IrpStack = IoGetCurrentIrpStackLocation(Irp);
switch (IrpStack->MajorFunction)
{
case IRP_MJ_CREATE:
break;
case IRP_MJ_CLOSE:
break;
default:
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
break;
}
ntStatus = Irp->IoStatus.Status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return ntStatus;
}
NTSTATUS
MouFilter_IoCtl (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PIO_STACK_LOCATION IrpStack;
ULONG ControlCode;
ULONG InputLength,OutputLength;
NTSTATUS status;
char* NameBuffer;
char* NameBuffer1;
IrpStack=IoGetCurrentIrpStackLocation(Irp);
if(DeviceObject->DeviceType==FILE_DEVICE_MUPORT)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
ControlCode=IrpStack->Parameters.DeviceIoControl.IoControlCode; //取得控制码
InputLength=IrpStack->Parameters.DeviceIoControl.InputBufferLength; //取输入缓冲区大小
OutputLength=IrpStack->Parameters.DeviceIoControl. OutputBufferLength;//取输出缓冲区大小
// DBGOUT(("DeviceIoControl: Control code %x InputLength %d OutputLength %d",
// ControlCode, InputLength, OutputLength));
// Outputbuffer=Irp->AssociatedIrp.SystemBuffer;
switch(ControlCode)
{
case IOCTL_IN_DATA:
DBGOUT(("IOCTL_WDM1_ZERO_BUFFER"));
Irp->IoStatus.Information =8;
NameBuffer1 = (char*)ExAllocatePool(NonPagedPool,8);
RtlCopyMemory(NameBuffer1,Irp->AssociatedIrp.SystemBuffer,8);
InCtrlCodeLeft=(ULONG)NameBuffer1[0];
InCtrlCodeMid=(ULONG)NameBuffer1[1];
InCtrlCodeRight=(ULONG)NameBuffer1[2];
ChangeWay=(ULONG)NameBuffer1[4];
SwheelFlg=(ULONG)NameBuffer1[3];
// DBGOUT(("Left=%x,Mid=%x,Right=%x",InCtrlCodeLeft,InCtrlCodeMid,InCtrlCodeRight));
ExFreePool(NameBuffer1);
break;
case IOCTL_OUT_DATA:
Irp->IoStatus.Information =8;
// DBGOUT(("Buffer=%x",OutputLength));
NameBuffer = (char*)ExAllocatePool(NonPagedPool,8);
NameBuffer[0]=(char)OutCtrlCodeFlg;
NameBuffer[1]=0x02;
NameBuffer[2]=0x03;
NameBuffer[3]=0x04;
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,NameBuffer,8);
ExFreePool(NameBuffer);
OutCtrlCodeFlg=0x00000000;
break;
default: status=STATUS_INVALID_DEVICE_REQUEST;
}
status=Irp->IoStatus.Status ;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
return MouFilter_DispatchPassThrough(DeviceObject, Irp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -