13238c4b8597c551bd8f97ce7755f02e3d603c44
[reactos.git] / reactos / drivers / input / sermouse / sermouse.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Serial mouse driver
4 * FILE: drivers/input/sermouse/sermouse.c
5 * PURPOSE: Serial mouse driver entry point
6 *
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8 */
9
10 #define NDEBUG
11 #include <debug.h>
12
13 #define INITGUID
14 #include "sermouse.h"
15
16 VOID NTAPI
17 DriverUnload(IN PDRIVER_OBJECT DriverObject)
18 {
19 // nothing to do here yet
20 }
21
22 NTSTATUS NTAPI
23 IrpStub(
24 IN PDEVICE_OBJECT DeviceObject,
25 IN PIRP Irp)
26 {
27 DPRINT1("Irp stub for major function 0x%lx\n",
28 IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
29 IoCompleteRequest(Irp, IO_NO_INCREMENT);
30 return STATUS_NOT_SUPPORTED;
31 }
32
33 static NTSTATUS
34 ReadRegistryEntries(
35 IN PUNICODE_STRING RegistryPath,
36 IN PSERMOUSE_DRIVER_EXTENSION DriverExtension)
37 {
38 UNICODE_STRING ParametersRegistryKey;
39 RTL_QUERY_REGISTRY_TABLE Parameters[5];
40 NTSTATUS Status;
41
42 ULONG DefaultMouseDataQueueSize = 0x64;
43 ULONG DefaultNumberOfButtons = 0;
44 UNICODE_STRING DefaultPointerDeviceBaseName = RTL_CONSTANT_STRING(L"PointerPort");
45 ULONG DefaultSampleRate = 1200;
46
47 ParametersRegistryKey.Length = 0;
48 ParametersRegistryKey.MaximumLength = RegistryPath->Length + sizeof(L"\\Parameters") + sizeof(UNICODE_NULL);
49 ParametersRegistryKey.Buffer = ExAllocatePool(PagedPool, ParametersRegistryKey.MaximumLength);
50 if (!ParametersRegistryKey.Buffer)
51 {
52 DPRINT("ExAllocatePool() failed\n");
53 return STATUS_INSUFFICIENT_RESOURCES;
54 }
55 RtlCopyUnicodeString(&ParametersRegistryKey, RegistryPath);
56 RtlAppendUnicodeToString(&ParametersRegistryKey, L"\\Parameters");
57 ParametersRegistryKey.Buffer[ParametersRegistryKey.Length / sizeof(WCHAR)] = UNICODE_NULL;
58
59 RtlZeroMemory(Parameters, sizeof(Parameters));
60
61 Parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
62 Parameters[0].Name = L"MouseDataQueueSize";
63 Parameters[0].EntryContext = &DriverExtension->MouseDataQueueSize;
64 Parameters[0].DefaultType = REG_DWORD;
65 Parameters[0].DefaultData = &DefaultMouseDataQueueSize;
66 Parameters[0].DefaultLength = sizeof(ULONG);
67
68 Parameters[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
69 Parameters[1].Name = L"NumberOfButtons";
70 Parameters[1].EntryContext = &DriverExtension->NumberOfButtons;
71 Parameters[1].DefaultType = REG_DWORD;
72 Parameters[1].DefaultData = &DefaultNumberOfButtons;
73 Parameters[1].DefaultLength = sizeof(ULONG);
74
75 Parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
76 Parameters[2].Name = L"PointerDeviceBaseName";
77 Parameters[2].EntryContext = &DriverExtension->PointerDeviceBaseName;
78 Parameters[2].DefaultType = REG_SZ;
79 Parameters[2].DefaultData = &DefaultPointerDeviceBaseName;
80 Parameters[2].DefaultLength = 0;
81
82 Parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
83 Parameters[3].Name = L"SampleRate";
84 Parameters[3].EntryContext = &DriverExtension->SampleRate;
85 Parameters[3].DefaultType = REG_DWORD;
86 Parameters[3].DefaultData = &DefaultSampleRate;
87 Parameters[3].DefaultLength = sizeof(ULONG);
88
89 Status = RtlQueryRegistryValues(
90 RTL_REGISTRY_ABSOLUTE,
91 ParametersRegistryKey.Buffer,
92 Parameters,
93 NULL,
94 NULL);
95
96 if (NT_SUCCESS(Status))
97 {
98 /* Check values */
99 if (DriverExtension->MouseDataQueueSize == 0)
100 {
101 DriverExtension->MouseDataQueueSize = DefaultMouseDataQueueSize;
102 }
103 }
104 else if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
105 {
106 /* Registry path doesn't exist. Set defaults */
107 DriverExtension->MouseDataQueueSize = DefaultMouseDataQueueSize;
108 DriverExtension->NumberOfButtons = DefaultNumberOfButtons;
109 Status = RtlDuplicateUnicodeString(
110 RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
111 &DefaultPointerDeviceBaseName,
112 &DriverExtension->PointerDeviceBaseName);
113 DriverExtension->SampleRate = DefaultSampleRate;
114 }
115
116 return Status;
117 }
118
119 /*
120 * Standard DriverEntry method.
121 */
122 NTSTATUS NTAPI
123 DriverEntry(
124 IN PDRIVER_OBJECT DriverObject,
125 IN PUNICODE_STRING RegistryPath)
126 {
127 PSERMOUSE_DRIVER_EXTENSION DriverExtension;
128 ULONG i;
129 NTSTATUS Status;
130
131 Status = IoAllocateDriverObjectExtension(
132 DriverObject,
133 DriverObject,
134 sizeof(SERMOUSE_DRIVER_EXTENSION),
135 (PVOID*)&DriverExtension);
136 if (!NT_SUCCESS(Status))
137 {
138 DPRINT("IoAllocateDriverObjectExtension() failed with status 0x%08lx\n", Status);
139 return Status;
140 }
141 RtlZeroMemory(DriverExtension, sizeof(SERMOUSE_DRIVER_EXTENSION));
142
143 Status = ReadRegistryEntries(RegistryPath, DriverExtension);
144 if (!NT_SUCCESS(Status))
145 {
146 DPRINT("ReadRegistryEntries() failed with status 0x%08lx\n", Status);
147 return Status;
148 }
149
150 DriverObject->DriverUnload = DriverUnload;
151 DriverObject->DriverExtension->AddDevice = SermouseAddDevice;
152
153 for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
154 DriverObject->MajorFunction[i] = IrpStub;
155
156 DriverObject->MajorFunction[IRP_MJ_CREATE] = SermouseCreate;
157 DriverObject->MajorFunction[IRP_MJ_CLOSE] = SermouseClose;
158 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = SermouseCleanup;
159 //DriverObject->MajorFunction[IRP_MJ_READ] = SermouseRead;
160 //DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SermouseDeviceControl;
161 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = SermouseInternalDeviceControl;
162 //DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = SermouseQueryInformation;
163 DriverObject->MajorFunction[IRP_MJ_PNP] = SermousePnp;
164 //DriverObject->MajorFunction[IRP_MJ_POWER] = SermousePower;
165
166 return STATUS_SUCCESS;
167 }