?? dispatch.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"
#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 + -