忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 3284 | 回复: 0

鼠标过滤驱动获取不到LastX和LastY的坐标值 [复制链接]

论坛徽章:
0
发表于 2018-01-31 16:41 |显示全部楼层
小弟想做一个鼠标过滤驱动,从过滤驱动获取鼠标光标所在的坐标值。过滤驱动的挂在点是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->endingReturned)
        {
                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(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->hysObject = 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;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP