/
mouse.cpp
87 lines (73 loc) · 2.76 KB
/
mouse.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "mouse.hpp"
NTSTATUS mouse::init_mouse(PMOUSE_OBJECT mouse_obj)
{
UNICODE_STRING class_string;
RtlInitUnicodeString(&class_string, L"\\Driver\\MouClass");
PDRIVER_OBJECT class_driver_object = NULL;
NTSTATUS status = ObReferenceObjectByName(&class_string, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID*)&class_driver_object);
if (!NT_SUCCESS(status)) { return status; }
UNICODE_STRING hid_string;
RtlInitUnicodeString(&hid_string, L"\\Driver\\MouHID");
PDRIVER_OBJECT hid_driver_object = NULL;
status = ObReferenceObjectByName(&hid_string, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, KernelMode, NULL, (PVOID*)&hid_driver_object);
if (!NT_SUCCESS(status))
{
if (class_driver_object) { ObDereferenceObject(class_driver_object); }
return status;
}
PVOID class_driver_base = NULL;
PDEVICE_OBJECT hid_device_object = hid_driver_object->DeviceObject;
while (hid_device_object && !mouse_obj->service_callback)
{
PDEVICE_OBJECT class_device_object = class_driver_object->DeviceObject;
while (class_device_object && !mouse_obj->service_callback)
{
if (!class_device_object->NextDevice && !mouse_obj->mouse_device)
{
mouse_obj->mouse_device = class_device_object;
}
PULONG_PTR device_extension = (PULONG_PTR)hid_device_object->DeviceExtension;
ULONG_PTR device_ext_size = ((ULONG_PTR)hid_device_object->DeviceObjectExtension - (ULONG_PTR)hid_device_object->DeviceExtension) / 4;
class_driver_base = class_driver_object->DriverStart;
for (ULONG_PTR i = 0; i < device_ext_size; i++)
{
if (device_extension[i] == (ULONG_PTR)class_device_object && device_extension[i + 1] > (ULONG_PTR)class_driver_object)
{
mouse_obj->service_callback = (MouseClassServiceCallback)(device_extension[i + 1]);
break;
}
}
class_device_object = class_device_object->NextDevice;
}
hid_device_object = hid_device_object->AttachedDevice;
}
if (!mouse_obj->mouse_device)
{
PDEVICE_OBJECT target_device_object = class_driver_object->DeviceObject;
while (target_device_object)
{
if (!target_device_object->NextDevice)
{
mouse_obj->mouse_device = target_device_object;
break;
}
target_device_object = target_device_object->NextDevice;
}
}
ObDereferenceObject(class_driver_object);
ObDereferenceObject(hid_driver_object);
DbgPrintEx(0, 0, "[norsefire]: Mouse initialized\n");
return STATUS_SUCCESS;
}
void mouse::mouse_event(MOUSE_OBJECT mouse_obj, long x, long y, unsigned short button_flags)
{
ULONG input_data;
KIRQL irql;
MOUSE_INPUT_DATA mid = { 0 };
mid.LastX = x;
mid.LastY = y;
mid.ButtonFlags = button_flags;
KeRaiseIrql(DISPATCH_LEVEL, &irql);
mouse_obj.service_callback(mouse_obj.mouse_device, &mid, (PMOUSE_INPUT_DATA)&mid + 1, &input_data);
KeLowerIrql(irql);
}