亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 52905 | 回復(fù): 0
打印 上一主題 下一主題

鼠標(biāo)過濾驅(qū)動(dòng)獲取不到LastX和LastY的坐標(biāo)值 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2018-01-31 16:41 |只看該作者 |倒序?yàn)g覽
小弟想做一個(gè)鼠標(biāo)過濾驅(qū)動(dòng),從過濾驅(qū)動(dòng)獲取鼠標(biāo)光標(biāo)所在的坐標(biāo)值。過濾驅(qū)動(dòng)的掛在點(diǎn)是L"\\Driver\\mouclass",想通過DeviceIoControl過程將獲取的坐標(biāo)值輸出給應(yīng)用程序。但是在鼠標(biāo)讀過程的回調(diào)函數(shù)中使用MOUSE_INPUT_DATA數(shù)據(jù)結(jié)構(gòu),其中的LastX和LastY的坐標(biāo)值始終為0。不知道是不是有哪個(gè)地方疏漏了?請高手們指點(diǎn)一下迷津。謝謝各位!我把部分關(guān)鍵程序帖出來。

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過程輸出給應(yīng)用程序,如果將它們直接賦值則能從應(yīng)用程序上讀出正確的值,如果使用pCursor->LastX和pCursor->LastY賦值則始終為0。請大俠們指點(diǎn)迷津。謝謝!各位
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;// 現(xiàn)在開始遍歷這個(gè)設(shè)備鏈//驅(qū)動(dòng)對象下包含了很多設(shè)備對象,就是想要找到的鍵盤設(shè)備對象                                                                                               

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
                );//創(chuàng)建新的設(shè)備對象名字為:pFilterDeviceObject
                IoCreateSymbolicLink(&uSymbolName, &uDeviceName);
                //        // 如果失敗了就直接退出。
if (!NT_SUCCESS(status))
                {
                        KdPrint(("MyAttach: IoCreateDeviceSecure Failed!!\n");
                        return (status);
                }
                LowerObject = IoAttachDeviceToDeviceStack(FiltObject, PhysObject);
                //        // 設(shè)備擴(kuò)展!下面要詳細(xì)講述設(shè)備擴(kuò)展的應(yīng)用。
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;
}
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP