Used the given registry path from DriverEntry to query the registry.
[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 #ifndef NDEBUG
15 #define NDEBUG
16 #endif
17 #include <debug.h>
18
19 #include "i8042prt.h"
20
21 /* FUNCTIONS *****************************************************************/
22
23 /*
24 * Read the registry keys associated with this device. The RegistryPath
25 * var is a hack. This should be more like what microsoft does, but I
26 * don't know exactly what they do except that it's a hack too...
27 */
28 VOID STDCALL I8042ReadRegistry(PDRIVER_OBJECT DriverObject,
29 PDEVICE_EXTENSION DevExt)
30
31 {
32 RTL_QUERY_REGISTRY_TABLE Parameters[19];
33
34 NTSTATUS Status;
35
36 ULONG DefaultHeadless = 0;
37 ULONG DefaultCrashScroll = 0;
38 ULONG DefaultCrashSysRq = 0;
39 ULONG DefaultReportResetErrors = 0;
40 ULONG DefaultPollStatusIterations = 1;
41 ULONG DefaultResendIterations = 3;
42 ULONG DefaultPollingIterations = 12000;
43 ULONG DefaultPollingIterationsMaximum = 12000;
44 ULONG DefaultKeyboardDataQueueSize = 100;
45 ULONG DefaultOverrideKeyboardType = 0;
46 ULONG DefaultOverrideKeyboardSubtype = 0;
47 ULONG DefaultMouseDataQueueSize = 100;
48 ULONG DefaultMouseResendStallTime = 1000;
49 ULONG DefaultMouseSynchIn100ns = 20000000;
50 ULONG DefaultMouseResolution = 3;
51 ULONG DefaultSampleRate = 60;
52 ULONG DefaultNumberOfButtons = 2;
53 ULONG DefaultEnableWheelDetection = 1;
54
55 RtlZeroMemory(Parameters, sizeof(Parameters));
56
57 Parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
58 Parameters[0].Name = L"Headless";
59 Parameters[0].EntryContext = &DevExt->Settings.Headless;
60 Parameters[0].DefaultType = REG_DWORD;
61 Parameters[0].DefaultData = &DefaultHeadless;
62 Parameters[0].DefaultLength = sizeof(ULONG);
63
64 Parameters[1].Flags = RTL_QUERY_REGISTRY_DIRECT;
65 Parameters[1].Name = L"CrashOnCtrlScroll";
66 Parameters[1].EntryContext = &DevExt->Settings.CrashScroll;
67 Parameters[1].DefaultType = REG_DWORD;
68 Parameters[1].DefaultData = &DefaultCrashScroll;
69 Parameters[1].DefaultLength = sizeof(ULONG);
70
71 Parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT;
72 Parameters[2].Name = L"BreakOnSysRq";
73 Parameters[2].EntryContext = &DevExt->Settings.CrashSysRq;
74 Parameters[2].DefaultType = REG_DWORD;
75 Parameters[2].DefaultData = &DefaultCrashSysRq;
76 Parameters[2].DefaultLength = sizeof(ULONG);
77
78 Parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT;
79 Parameters[3].Name = L"ReportResetErrors";
80 Parameters[3].EntryContext = &DevExt->Settings.ReportResetErrors;
81 Parameters[3].DefaultType = REG_DWORD;
82 Parameters[3].DefaultData = &DefaultReportResetErrors;
83 Parameters[3].DefaultLength = sizeof(ULONG);
84
85 Parameters[4].Flags = RTL_QUERY_REGISTRY_DIRECT;
86 Parameters[4].Name = L"PollStatusIterations";
87 Parameters[4].EntryContext = &DevExt->Settings.PollStatusIterations;
88 Parameters[4].DefaultType = REG_DWORD;
89 Parameters[4].DefaultData = &DefaultPollStatusIterations;
90 Parameters[4].DefaultLength = sizeof(ULONG);
91
92 Parameters[5].Flags = RTL_QUERY_REGISTRY_DIRECT;
93 Parameters[5].Name = L"ResendIterations";
94 Parameters[5].EntryContext = &DevExt->Settings.ResendIterations;
95 Parameters[5].DefaultType = REG_DWORD;
96 Parameters[5].DefaultData = &DefaultResendIterations;
97 Parameters[5].DefaultLength = sizeof(ULONG);
98
99 Parameters[6].Flags = RTL_QUERY_REGISTRY_DIRECT;
100 Parameters[6].Name = L"PollingIterations";
101 Parameters[6].EntryContext = &DevExt->Settings.PollingIterations;
102 Parameters[6].DefaultType = REG_DWORD;
103 Parameters[6].DefaultData = &DefaultPollingIterations;
104 Parameters[6].DefaultLength = sizeof(ULONG);
105
106 Parameters[7].Flags = RTL_QUERY_REGISTRY_DIRECT;
107 Parameters[7].Name = L"PollingIterationsMaximum";
108 Parameters[7].EntryContext = &DevExt->Settings.PollingIterationsMaximum;
109 Parameters[7].DefaultType = REG_DWORD;
110 Parameters[7].DefaultData = &DefaultPollingIterationsMaximum;
111 Parameters[7].DefaultLength = sizeof(ULONG);
112
113 Parameters[8].Flags = RTL_QUERY_REGISTRY_DIRECT;
114 Parameters[8].Name = L"KeyboardDataQueueSize";
115 Parameters[8].EntryContext =
116 &DevExt->KeyboardAttributes.InputDataQueueLength;
117 Parameters[8].DefaultType = REG_DWORD;
118 Parameters[8].DefaultData = &DefaultKeyboardDataQueueSize;
119 Parameters[8].DefaultLength = sizeof(ULONG);
120
121 Parameters[9].Flags = RTL_QUERY_REGISTRY_DIRECT;
122 Parameters[9].Name = L"OverrideKeyboardType";
123 Parameters[9].EntryContext = &DevExt->Settings.OverrideKeyboardType;
124 Parameters[9].DefaultType = REG_DWORD;
125 Parameters[9].DefaultData = &DefaultOverrideKeyboardType;
126 Parameters[9].DefaultLength = sizeof(ULONG);
127
128 Parameters[10].Flags = RTL_QUERY_REGISTRY_DIRECT;
129 Parameters[10].Name = L"OverrideKeyboardSubtype";
130 Parameters[10].EntryContext = &DevExt->Settings.OverrideKeyboardSubtype;
131 Parameters[10].DefaultType = REG_DWORD;
132 Parameters[10].DefaultData = &DefaultOverrideKeyboardSubtype;
133 Parameters[10].DefaultLength = sizeof(ULONG);
134
135 Parameters[11].Flags = RTL_QUERY_REGISTRY_DIRECT;
136 Parameters[11].Name = L"MouseDataQueueSize";
137 Parameters[11].EntryContext =
138 &DevExt->MouseAttributes.InputDataQueueLength;
139 Parameters[11].DefaultType = REG_DWORD;
140 Parameters[11].DefaultData = &DefaultMouseDataQueueSize;
141 Parameters[11].DefaultLength = sizeof(ULONG);
142
143 Parameters[12].Flags = RTL_QUERY_REGISTRY_DIRECT;
144 Parameters[12].Name = L"MouseResendStallTime";
145 Parameters[12].EntryContext = &DevExt->Settings.MouseResendStallTime;
146 Parameters[12].DefaultType = REG_DWORD;
147 Parameters[12].DefaultData = &DefaultMouseResendStallTime;
148 Parameters[12].DefaultLength = sizeof(ULONG);
149
150 Parameters[13].Flags = RTL_QUERY_REGISTRY_DIRECT;
151 Parameters[13].Name = L"MouseSynchIn100ns";
152 Parameters[13].EntryContext = &DevExt->Settings.MouseSynchIn100ns;
153 Parameters[13].DefaultType = REG_DWORD;
154 Parameters[13].DefaultData = &DefaultMouseSynchIn100ns;
155 Parameters[13].DefaultLength = sizeof(ULONG);
156
157 Parameters[14].Flags = RTL_QUERY_REGISTRY_DIRECT;
158 Parameters[14].Name = L"MouseResolution";
159 Parameters[14].EntryContext = &DevExt->Settings.MouseResolution;
160 Parameters[14].DefaultType = REG_DWORD;
161 Parameters[14].DefaultData = &DefaultMouseResolution;
162 Parameters[14].DefaultLength = sizeof(ULONG);
163
164 Parameters[15].Flags = RTL_QUERY_REGISTRY_DIRECT;
165 Parameters[15].Name = L"SampleRate";
166 Parameters[15].EntryContext = &DevExt->MouseAttributes.SampleRate;
167 Parameters[15].DefaultType = REG_DWORD;
168 Parameters[15].DefaultData = &DefaultSampleRate;
169 Parameters[15].DefaultLength = sizeof(ULONG);
170
171 Parameters[16].Flags = RTL_QUERY_REGISTRY_DIRECT;
172 Parameters[16].Name = L"NumberOfButtons";
173 Parameters[16].EntryContext = &DevExt->Settings.NumberOfButtons;
174 Parameters[16].DefaultType = REG_DWORD;
175 Parameters[16].DefaultData = &DefaultNumberOfButtons;
176 Parameters[16].DefaultLength = sizeof(ULONG);
177
178 Parameters[17].Flags = RTL_QUERY_REGISTRY_DIRECT;
179 Parameters[17].Name = L"EnableWheelDetection";
180 Parameters[17].EntryContext = &DevExt->Settings.EnableWheelDetection;
181 Parameters[17].DefaultType = REG_DWORD;
182 Parameters[17].DefaultData = &DefaultEnableWheelDetection;
183 Parameters[17].DefaultLength = sizeof(ULONG);
184
185 Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE | RTL_REGISTRY_OPTIONAL,
186 I8042RegistryPath.Buffer,
187 Parameters,
188 NULL,
189 NULL);
190
191 if (!NT_SUCCESS(Status)) {
192 /* Actually, the defaults are not set when the function
193 * fails, as would happen during setup, so you have to
194 * set them manually anyway...
195 */
196 RTL_QUERY_REGISTRY_TABLE *Current = Parameters;
197 DPRINT1 ("Can't read registry: %x\n", Status);
198 while (Current->Name) {
199 *((PULONG)Current->EntryContext) =
200 *((PULONG)Current->DefaultData);
201 Current++;
202 }
203 DPRINT1 ("Manually set defaults\n");
204
205 }
206
207 if (DevExt->Settings.MouseResolution > 3)
208 DevExt->Settings.MouseResolution = 3;
209
210 DPRINT("Done reading registry\n");
211 }