驅動過濾鼠標, 附加到鼠標設備上
- VOID Attach(
- IN PDRIVER_OBJECT DriverObject
- )
- {
- NTSTATUS status;
- PDRIVER_OBJECT targetDriverObject;
- PDEVICE_OBJECT curDeviceObject;
- PDEVICE_OBJECT lowerDeviceObject;
- PDEVICE_OBJECT filterDeviceObject;
- UNICODE_STRING kbdClassName;
- KdPrint(("Attach invoke\n"));
- RtlInitUnicodeString(&kbdClassName, L"\\Driver\\mouclass");
- status = ObReferenceObjectByName(&kbdClassName, OBJ_CASE_INSENSITIVE, NULL, 0,
- *IoDriverObjectType, KernelMode, NULL, &targetDriverObject);
- if (!NT_SUCCESS(status)) {
- KdPrint(("ObReferenceObjectByName failed\n"));
- KdPrint(("status %08x\n", status));
- return ;
- }
- g_old_adddevice = targetDriverObject->DriverExtension->AddDevice;
- if (g_new_adddevice)
- {
- KdPrint(("use new adddevice\r\n"));
- targetDriverObject->DriverExtension->AddDevice = g_new_adddevice;
- }
- ObDereferenceObject(targetDriverObject);
- curDeviceObject = targetDriverObject->DeviceObject;
- while (curDeviceObject != NULL) {
- status = IoCreateDevice(DriverObject, sizeof(FILTER_EXT), NULL, curDeviceObject->DeviceType,
- curDeviceObject->Characteristics, FALSE, &filterDeviceObject);
- if (!NT_SUCCESS(status)) {
- KdPrint(("IoCreateDevice failed\n"));
- } else {
- lowerDeviceObject = IoAttachDeviceToDeviceStack(filterDeviceObject, curDeviceObject);
- if (lowerDeviceObject == NULL) {
- KdPrint(("IoAttachDeviceToDeviceStack failed\n"));
- IoDeleteDevice(filterDeviceObject);
- } else {
- ((PFILTER_EXT)filterDeviceObject->DeviceExtension)->LowerDeviceObject = lowerDeviceObject;
- filterDeviceObject->Flags |=
- lowerDeviceObject->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE);
- filterDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
- }
- }
- curDeviceObject = curDeviceObject->NextDevice;
- }
- }