鼠标过滤驱动获取不到LastX和LastY的坐标值

sharpmddr 2018-01-31 03:53:40
小弟想做一个鼠标过滤驱动,从过滤驱动获取鼠标光标所在的坐标值。过滤驱动的挂在点是L"\\Driver\\mouclass",想通过DeviceIoControl过程将获取的坐标值输出给应用程序。但是在鼠标读过程的回调函数中使用MOUSE_INPUT_DATA数据结构,其中的LastX和LastY的坐标值始终为0。不知道是不是有哪个地方疏漏了?请高手们指点一下迷津。谢谢各位!我想部分关键程序帖出来。

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
ULONG i;
NTSTATUS status = STATUS_SUCCESS;
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i)
{
DriverObject->MajorFunction[i] = PassDispatch;
}
DriverObject->MajorFunction[IRP_MJ_READ] = MouRead;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DeviceIoControl;
DriverObject->DriverUnload = Unload;
status = AttachDevices(DriverObject, RegistryPath);
return status;
}

NTSTATUS MouRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
NTSTATUS status;
PMOU_DEV_EXT devExt;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
KIRQL IrqLevel;
if (Irp->CurrentLocation == 1)
{
ULONG ReturnedInformation = 0;
status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = ReturnedInformation;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return(status);
}
KeyCount++;
devExt = (PMOU_DEV_EXT)DeviceObject->DeviceExtension;
IoCopyCurrentIrpStackLocationToNext(Irp);
KeAcquireSpinLock(&devExt->SpinLock, &IrqLevel);
InterlockedIncrement(&devExt->IrpsInProgress);
KeReleaseSpinLock(&devExt->SpinLock, IrqLevel);
IoSetCompletionRoutine(Irp, MouReadComplete, DeviceObject, TRUE, TRUE, TRUE);
status = IoCallDriver(devExt->LowerObject, Irp);
return status;
}

NTSTATUS MouReadComplete(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context)
{
UNREFERENCED_PARAMETER(DeviceObject);
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
PMOUSE_INPUT_DATA pCursor;
PMOU_DEV_EXT devExt = (PMOU_DEV_EXT)DeviceObject->DeviceExtension;
ULONG buf_len = 0;
PUCHAR buf = NULL;
size_t numKeys;
ULONG i,num;
KIRQL IrqLevel;

if (NT_SUCCESS(Irp->IoStatus.Status))
{
pCursor = (PMOUSE_INPUT_DATA)(Irp->AssociatedIrp.SystemBuffer);
buf_len = Irp->IoStatus.Information;
numKeys = buf_len / sizeof(MOUSE_INPUT_DATA);
nUm = numKeys;
pCursor->Flags = 0;
if (pCursor->ButtonFlags == MOUSE_LEFT_BUTTON_UP)
{
//pCursorLastX和pCursorLastY是全局变量用于通过DeviceIoControl过程输出给应用程序,如果将它们直接赋值则能从应用程序上读出正确的值,如果使用pCursor->LastX和pCursor->LastY赋值则始终为0。请大侠们指点迷津。谢谢!各位
pCursorLastX = pCursor->LastX;
pCursorLastY = pCursor->LastY;
DbgPrint(("LEFT Buttons\n"));

}

}
KeyCount--;
if (Irp->PendingReturned)
{
IoMarkIrpPending(Irp);
}
KeAcquireSpinLock(&devExt->SpinLock, &IrqLevel);
InterlockedDecrement(&devExt->IrpsInProgress);
KeReleaseSpinLock(&devExt->SpinLock, IrqLevel);
return Irp->IoStatus.Status;
}

NTSTATUS c2pAttachDevices(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(RegistryPath);
NTSTATUS status = STATUS_UNSUCCESSFUL;
UNICODE_STRING uDeviceName = { 0 };
UNICODE_STRING uSymbolName = { 0 };
UNICODE_STRING uniNtNameString;
PMOU_DEV_EXT devExt;
PDEVICE_OBJECT FiltObject = NULL;
PDEVICE_OBJECT PhysObject = NULL;
PDEVICE_OBJECT LowerObject = NULL;
PDRIVER_OBJECT MouseDriverObject = NULL;
UNICODE_STRING sddl = RTL_CONSTANT_STRING(L"D:P(A;;GA;;;WD)");

KdPrint(("Ready For Attaching Real Hareware\n"));
RtlInitUnicodeString(&uDeviceName, L"\\Device\\micksysur");
RtlInitUnicodeString(&uSymbolName, L"\\DosDevices\\micksysTestr");
RtlInitUnicodeString(&uniNtNameString, MOU_DRIVER_NAME);

status = ObReferenceObjectByName(
&uniNtNameString,
OBJ_CASE_INSENSITIVE,
NULL,
FILE_ALL_ACCESS,
*IoDriverObjectType,
KernelMode,
NULL,
&MouseDriverObject
);
if (!NT_SUCCESS(status))
{
KdPrint(("MyAttach: ObReferenceObjectByName Failed!!\n"));
return(status);
}
else
{
ObDereferenceObject(DriverObject);
}
PhysObject = MouseDriverObject->DeviceObject;//KbdDriverObject->DeviceObject;// 现在开始遍历这个设备链//驱动对象下包含了很多设备对象,就是想要找到的键盘设备对象

status = IoCreateDeviceSecure(
IN DriverObject,
IN sizeof(PMOU_DEV_EXT),
IN &uDeviceName,
IN PhysObject->DeviceType,
IN PhysObject->Characteristics,
IN FALSE,
IN &sddl,
IN(LPCGUID)&Com_GUID,
OUT &FiltObject
);//创建新的设备对象名字为:pFilterDeviceObject
IoCreateSymbolicLink(&uSymbolName, &uDeviceName);
// // 如果失败了就直接退出。
if (!NT_SUCCESS(status))
{
KdPrint(("MyAttach: IoCreateDeviceSecure Failed!!\n"));
return (status);
}
LowerObject = IoAttachDeviceToDeviceStack(FiltObject, PhysObject);
// // 设备扩展!下面要详细讲述设备扩展的应用。
devExt = (PMOU_DEV_EXT)(FiltObject->DeviceExtension);

memset(devExt, 0, sizeof(PMOU_DEV_EXT));
devExt->FiltObject = FiltObject;
devExt->PhysObject = PhysObject;
devExt->LowerObject = LowerObject;
KeInitializeSpinLock(&devExt->SpinLock);
devExt->IrpsInProgress = 0;
// // 下面的操作和前面过滤串口的操作基本一致。这里不再解释了。
FiltObject->DeviceType = LowerObject->DeviceType;
FiltObject->Characteristics = LowerObject->Characteristics;
FiltObject->StackSize = LowerObject->StackSize + 1;
FiltObject->Flags |= (DO_BUFFERED_IO | DO_POWER_PAGABLE);
FiltObject->Flags &= ~DO_DEVICE_INITIALIZING;
return status;
}
...全文
713 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧