- 論壇徽章:
- 0
|
小弟想做一個(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;
}
|
|