remove whitespace from end of lines
[reactos.git] / reactos / drivers / input / i8042prt / registry.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/input/i8042prt/registry.c
5 * PURPOSE: i8042 (ps/2 keyboard-mouse controller) driver
6 * Reading the registry
7 * PROGRAMMER: Victor Kirhenshtein (sauros@iname.com)
8 * Jason Filby (jasonfilby@yahoo.com)
9 * Tinus
10 */
11
12 /* INCLUDES ****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <string.h>
16 #include <ntos/keyboard.h>
17 #include <ntos/minmax.h>
18 #include <rosrtl/string.h>
19
20 #include <ddk/ntddkbd.h>
21 #include <ddk/ntdd8042.h>
22
23 #define NDEBUG
24 #include <debug.h>
25
26 #include "i8042prt.h"
27
28 /* FUNCTIONS *****************************************************************/
29
30 /*
31 * Read the registry keys associated with this device. The RegistryPath
32 * var is a hack. This should be more like what microsoft does, but I
33 * don't know exactly what they do except that it's a hack too...
34 */
35 VOID STDCALL I8042ReadRegistry(PDRIVER_OBJECT DriverObject,
36 PDEVICE_EXTENSION DevExt)
37
38 {
39 RTL_QUERY_REGISTRY_TABLE Parameters[19];
40 UNICODE_STRING ParametersPath;
41
42 PWSTR RegistryPath = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\i8042Prt\\Parameters";
43
44 NTSTATUS Status;
45
46 DWORD DefaultHeadless = 0;
47 DWORD DefaultCrashScroll = 0;
48 DWORD DefaultCrashSysRq = 0;
49 DWORD DefaultReportResetErrors = 0;
50 DWORD DefaultPollStatusIterations = 1;
51 DWORD DefaultResendIterations = 3;
52 DWORD DefaultPollingIterations = 12000;
53 DWORD DefaultPollingIterationsMaximum = 12000;
54 DWORD DefaultKeyboardDataQueueSize = 100;
55 DWORD DefaultOverrideKeyboardType = 0;
56 DWORD DefaultOverrideKeyboardSubtype = 0;
57 DWORD DefaultMouseDataQueueSize = 100;
58 DWORD DefaultMouseResendStallTime = 1000;
59 DWORD DefaultMouseSynchIn100ns = 20000000;
60 DWORD DefaultMouseResolution = 3;
61 DWORD DefaultSampleRate = 60;
62 DWORD DefaultNumberOfButtons = 2;
63 DWORD DefaultEnableWheelDetection = 1;
64
65 RtlInitUnicodeString(&ParametersPath, NULL);
66 ParametersPath.MaximumLength = (wcslen(RegistryPath) *
67 sizeof(WCHAR)) +
68 sizeof(UNICODE_NULL);
69
70 ParametersPath.Buffer = ExAllocatePoolWithTag(PagedPool,
71 ParametersPath.MaximumLength,
72 TAG_I8042);
73
74 if (!ParametersPath.Buffer) {
75 DPRINT1("No buffer space for reading registry\n");
76 return;
77 }
78
79 RtlZeroMemory(ParametersPath.Buffer, ParametersPath.MaximumLength);
80 RtlAppendUnicodeToString(&ParametersPath, RegistryPath);
81
82 RtlZeroMemory(Parameters, sizeof(Parameters));
83
84 Parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
85 Parameters[0].Name = L"Headless";
86 Parameters[0].EntryContext = &DevExt->Settings.Headless;
87 Parameters[0].DefaultType = REG_DWORD;
88 Parameters[0].DefaultData = &DefaultHeadless;
89 Parameters[0].DefaultLength = sizeof(ULONG);
90
91 Parameters[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
92 Parameters[1].Name = L"CrashOnCtrlScroll";
93 Parameters[1].EntryContext = &DevExt->Settings.CrashScroll;
94 Parameters[1].DefaultType = REG_DWORD;
95 Parameters[1].DefaultData = &DefaultCrashScroll;
96 Parameters[1].DefaultLength = sizeof(ULONG);
97
98 Parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
99 Parameters[2].Name = L"BreakOnSysRq";
100 Parameters[2].EntryContext = &DevExt->Settings.CrashSysRq;
101 Parameters[2].DefaultType = REG_DWORD;
102 Parameters[2].DefaultData = &DefaultCrashSysRq;
103 Parameters[2].DefaultLength = sizeof(ULONG);
104
105 Parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
106 Parameters[3].Name = L"ReportResetErrors";
107 Parameters[3].EntryContext = &DevExt->Settings.ReportResetErrors;
108 Parameters[3].DefaultType = REG_DWORD;
109 Parameters[3].DefaultData = &DefaultReportResetErrors;
110 Parameters[3].DefaultLength = sizeof(ULONG);
111
112 Parameters[4].Flags = RTL_QUERY_REGISTRY_DIRECT;
113 Parameters[4].Name = L"PollStatusIterations";
114 Parameters[4].EntryContext = &DevExt->Settings.PollStatusIterations;
115 Parameters[4].DefaultType = REG_DWORD;
116 Parameters[4].DefaultData = &DefaultPollStatusIterations;
117 Parameters[4].DefaultLength = sizeof(ULONG);
118
119 Parameters[5].Flags = RTL_QUERY_REGISTRY_DIRECT;
120 Parameters[5].Name = L"ResendIterations";
121 Parameters[5].EntryContext = &DevExt->Settings.ResendIterations;
122 Parameters[5].DefaultType = REG_DWORD;
123 Parameters[5].DefaultData = &DefaultResendIterations;
124 Parameters[5].DefaultLength = sizeof(ULONG);
125
126 Parameters[6].Flags = RTL_QUERY_REGISTRY_DIRECT;
127 Parameters[6].Name = L"PollingIterations";
128 Parameters[6].EntryContext = &DevExt->Settings.PollingIterations;
129 Parameters[6].DefaultType = REG_DWORD;
130 Parameters[6].DefaultData = &DefaultPollingIterations;
131 Parameters[6].DefaultLength = sizeof(ULONG);
132
133 Parameters[7].Flags = RTL_QUERY_REGISTRY_DIRECT;
134 Parameters[7].Name = L"PollingIterationsMaximum";
135 Parameters[7].EntryContext = &DevExt->Settings.PollingIterationsMaximum;
136 Parameters[7].DefaultType = REG_DWORD;
137 Parameters[7].DefaultData = &DefaultPollingIterationsMaximum;
138 Parameters[7].DefaultLength = sizeof(ULONG);
139
140 Parameters[8].Flags = RTL_QUERY_REGISTRY_DIRECT;
141 Parameters[8].Name = L"KeyboardDataQueueSize";
142 Parameters[8].EntryContext =
143 &DevExt->KeyboardAttributes.InputDataQueueLength;
144 Parameters[8].DefaultType = REG_DWORD;
145 Parameters[8].DefaultData = &DefaultKeyboardDataQueueSize;
146 Parameters[8].DefaultLength = sizeof(ULONG);
147
148 Parameters[9].Flags = RTL_QUERY_REGISTRY_DIRECT;
149 Parameters[9].Name = L"OverrideKeyboardType";
150 Parameters[9].EntryContext = &DevExt->Settings.OverrideKeyboardType;
151 Parameters[9].DefaultType = REG_DWORD;
152 Parameters[9].DefaultData = &DefaultOverrideKeyboardType;
153 Parameters[9].DefaultLength = sizeof(ULONG);
154
155 Parameters[10].Flags = RTL_QUERY_REGISTRY_DIRECT;
156 Parameters[10].Name = L"OverrideKeyboardSubtype";
157 Parameters[10].EntryContext = &DevExt->Settings.OverrideKeyboardSubtype;
158 Parameters[10].DefaultType = REG_DWORD;
159 Parameters[10].DefaultData = &DefaultOverrideKeyboardSubtype;
160 Parameters[10].DefaultLength = sizeof(ULONG);
161
162 Parameters[11].Flags = RTL_QUERY_REGISTRY_DIRECT;
163 Parameters[11].Name = L"MouseDataQueueSize";
164 Parameters[11].EntryContext =
165 &DevExt->MouseAttributes.InputDataQueueLength;
166 Parameters[11].DefaultType = REG_DWORD;
167 Parameters[11].DefaultData = &DefaultMouseDataQueueSize;
168 Parameters[11].DefaultLength = sizeof(ULONG);
169
170 Parameters[12].Flags = RTL_QUERY_REGISTRY_DIRECT;
171 Parameters[12].Name = L"MouseResendStallTime";
172 Parameters[12].EntryContext = &DevExt->Settings.MouseResendStallTime;
173 Parameters[12].DefaultType = REG_DWORD;
174 Parameters[12].DefaultData = &DefaultMouseResendStallTime;
175 Parameters[12].DefaultLength = sizeof(ULONG);
176
177 Parameters[13].Flags = RTL_QUERY_REGISTRY_DIRECT;
178 Parameters[13].Name = L"MouseSynchIn100ns";
179 Parameters[13].EntryContext = &DevExt->Settings.MouseSynchIn100ns;
180 Parameters[13].DefaultType = REG_DWORD;
181 Parameters[13].DefaultData = &DefaultMouseSynchIn100ns;
182 Parameters[13].DefaultLength = sizeof(ULONG);
183
184 Parameters[14].Flags = RTL_QUERY_REGISTRY_DIRECT;
185 Parameters[14].Name = L"MouseResolution";
186 Parameters[14].EntryContext = &DevExt->Settings.MouseResolution;
187 Parameters[14].DefaultType = REG_DWORD;
188 Parameters[14].DefaultData = &DefaultMouseResolution;
189 Parameters[14].DefaultLength = sizeof(ULONG);
190
191 Parameters[15].Flags = RTL_QUERY_REGISTRY_DIRECT;
192 Parameters[15].Name = L"SampleRate";
193 Parameters[15].EntryContext = &DevExt->MouseAttributes.SampleRate;
194 Parameters[15].DefaultType = REG_DWORD;
195 Parameters[15].DefaultData = &DefaultSampleRate;
196 Parameters[15].DefaultLength = sizeof(ULONG);
197
198 Parameters[16].Flags = RTL_QUERY_REGISTRY_DIRECT;
199 Parameters[16].Name = L"NumberOfButtons";
200 Parameters[16].EntryContext = &DevExt->Settings.NumberOfButtons;
201 Parameters[16].DefaultType = REG_DWORD;
202 Parameters[16].DefaultData = &DefaultNumberOfButtons;
203 Parameters[16].DefaultLength = sizeof(ULONG);
204
205 Parameters[17].Flags = RTL_QUERY_REGISTRY_DIRECT;
206 Parameters[17].Name = L"EnableWheelDetection";
207 Parameters[17].EntryContext = &DevExt->Settings.EnableWheelDetection;
208 Parameters[17].DefaultType = REG_DWORD;
209 Parameters[17].DefaultData = &DefaultEnableWheelDetection;
210 Parameters[17].DefaultLength = sizeof(ULONG);
211
212 Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE |
213 RTL_REGISTRY_OPTIONAL,
214 ParametersPath.Buffer,
215 Parameters,
216 NULL,
217 NULL);
218
219 if (Status != STATUS_SUCCESS) {
220 DPRINT1 ("Can't read registry: %x\n", Status);
221 /* Actually, the defaults are not set when the function
222 * fails, as would happen during setup, so you have to
223 * set them manually anyway...
224 */
225 RTL_QUERY_REGISTRY_TABLE *Current = Parameters;
226 while (Current->Name) {
227 *((DWORD *)Current->EntryContext) =
228 *((DWORD *)Current->DefaultData);
229 Current++;
230 }
231 DPRINT1 ("Manually set defaults\n");
232
233 }
234 ExFreePoolWithTag(ParametersPath.Buffer, TAG_I8042);
235
236 if (DevExt->Settings.MouseResolution > 3)
237 DevExt->Settings.MouseResolution = 3;
238
239 DPRINT("Done reading registry\n");
240 }