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

📄 moufiltr.c

📁 鼠标设备的上层过滤驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -