[USB-BRINGUP-TRUNK]
[reactos.git] / drivers / input / i8042prt / registry.c
1 /*
2 * PROJECT: ReactOS i8042 (ps/2 keyboard-mouse controller) driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/input/i8042prt/i8042prt.c
5 * PURPOSE: Reading the registry
6 * PROGRAMMERS: Copyright Victor Kirhenshtein (sauros@iname.com)
7 Copyright Jason Filby (jasonfilby@yahoo.com)
8 Copyright Martijn Vernooij (o112w8r02@sneakemail.com)
9 Copyright 2006-2007 Hervé Poussineau (hpoussin@reactos.org)
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include "i8042prt.h"
15
16 /* FUNCTIONS *****************************************************************/
17
18 NTSTATUS
19 ReadRegistryEntries(
20 IN PUNICODE_STRING RegistryPath,
21 OUT PI8042_SETTINGS Settings)
22 {
23 RTL_QUERY_REGISTRY_TABLE Parameters[17];
24 NTSTATUS Status;
25
26 ULONG DefaultKeyboardDataQueueSize = 0x64;
27 PCWSTR DefaultKeyboardDeviceBaseName = L"KeyboardPort";
28 ULONG DefaultMouseDataQueueSize = 0x64;
29 ULONG DefaultMouseResolution = 3;
30 ULONG DefaultMouseSynchIn100ns = 20000000;
31 ULONG DefaultNumberOfButtons = 2;
32 PCWSTR DefaultPointerDeviceBaseName = L"PointerPort";
33 ULONG DefaultPollStatusIterations = 1;
34 ULONG DefaultOverrideKeyboardType = 4;
35 ULONG DefaultOverrideKeyboardSubtype = 0;
36 ULONG DefaultPollingIterations = 12000;
37 ULONG DefaultPollingIterationsMaximum = 12000;
38 ULONG DefaultResendIterations = 0x3;
39 ULONG DefaultSampleRate = 60;
40 ULONG DefaultCrashOnCtrlScroll;
41
42 /* Default value for CrashOnCtrlScroll depends if we're
43 * running a debug build or a normal build.
44 */
45 #if DBG
46 DefaultCrashOnCtrlScroll = 1;
47 #else
48 DefaultCrashOnCtrlScroll = 0;
49 #endif
50
51 RtlZeroMemory(Parameters, sizeof(Parameters));
52
53 Parameters[0].Flags = RTL_QUERY_REGISTRY_SUBKEY;
54 Parameters[0].Name = L"Parameters";
55
56 Parameters[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
57 Parameters[1].Name = L"KeyboardDataQueueSize";
58 Parameters[1].EntryContext = &Settings->KeyboardDataQueueSize;
59 Parameters[1].DefaultType = REG_DWORD;
60 Parameters[1].DefaultData = &DefaultKeyboardDataQueueSize;
61 Parameters[1].DefaultLength = sizeof(ULONG);
62
63 Parameters[2].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
64 Parameters[2].Name = L"KeyboardDeviceBaseName";
65 Parameters[2].EntryContext = &Settings->KeyboardDeviceBaseName;
66 Parameters[2].DefaultType = REG_SZ;
67 Parameters[2].DefaultData = (PVOID)DefaultKeyboardDeviceBaseName;
68 Parameters[2].DefaultLength = 0;
69
70 Parameters[3].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
71 Parameters[3].Name = L"MouseDataQueueSize";
72 Parameters[3].EntryContext = &Settings->MouseDataQueueSize;
73 Parameters[3].DefaultType = REG_DWORD;
74 Parameters[3].DefaultData = &DefaultMouseDataQueueSize;
75 Parameters[3].DefaultLength = sizeof(ULONG);
76
77 Parameters[4].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
78 Parameters[4].Name = L"MouseResolution";
79 Parameters[4].EntryContext = &Settings->MouseResolution;
80 Parameters[4].DefaultType = REG_DWORD;
81 Parameters[4].DefaultData = &DefaultMouseResolution;
82 Parameters[4].DefaultLength = sizeof(ULONG);
83
84 Parameters[5].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
85 Parameters[5].Name = L"MouseSynchIn100ns";
86 Parameters[5].EntryContext = &Settings->MouseSynchIn100ns;
87 Parameters[5].DefaultType = REG_DWORD;
88 Parameters[5].DefaultData = &DefaultMouseSynchIn100ns;
89 Parameters[5].DefaultLength = sizeof(ULONG);
90
91 Parameters[6].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
92 Parameters[6].Name = L"NumberOfButtons";
93 Parameters[6].EntryContext = &Settings->NumberOfButtons;
94 Parameters[6].DefaultType = REG_DWORD;
95 Parameters[6].DefaultData = &DefaultNumberOfButtons;
96 Parameters[6].DefaultLength = sizeof(ULONG);
97
98 Parameters[7].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
99 Parameters[7].Name = L"PointerDeviceBaseName";
100 Parameters[7].EntryContext = &Settings->PointerDeviceBaseName;
101 Parameters[7].DefaultType = REG_SZ;
102 Parameters[7].DefaultData = (PVOID)DefaultPointerDeviceBaseName;
103 Parameters[7].DefaultLength = 0;
104
105 Parameters[8].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
106 Parameters[8].Name = L"PollStatusIterations";
107 Parameters[8].EntryContext = &Settings->PollStatusIterations;
108 Parameters[8].DefaultType = REG_DWORD;
109 Parameters[8].DefaultData = &DefaultPollStatusIterations;
110 Parameters[8].DefaultLength = sizeof(ULONG);
111
112 Parameters[9].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
113 Parameters[9].Name = L"OverrideKeyboardType";
114 Parameters[9].EntryContext = &Settings->OverrideKeyboardType;
115 Parameters[9].DefaultType = REG_DWORD;
116 Parameters[9].DefaultData = &DefaultOverrideKeyboardType;
117 Parameters[9].DefaultLength = sizeof(ULONG);
118
119 Parameters[10].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
120 Parameters[10].Name = L"OverrideKeyboardSubtype";
121 Parameters[10].EntryContext = &Settings->OverrideKeyboardSubtype;
122 Parameters[10].DefaultType = REG_DWORD;
123 Parameters[10].DefaultData = &DefaultOverrideKeyboardSubtype;
124 Parameters[10].DefaultLength = sizeof(ULONG);
125
126 Parameters[11].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
127 Parameters[11].Name = L"PollingIterations";
128 Parameters[11].EntryContext = &Settings->PollingIterations;
129 Parameters[11].DefaultType = REG_DWORD;
130 Parameters[11].DefaultData = &DefaultPollingIterations;
131 Parameters[11].DefaultLength = sizeof(ULONG);
132
133 Parameters[12].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
134 Parameters[12].Name = L"PollingIterationsMaximum";
135 Parameters[12].EntryContext = &Settings->PollingIterationsMaximum;
136 Parameters[12].DefaultType = REG_DWORD;
137 Parameters[12].DefaultData = &DefaultPollingIterationsMaximum;
138 Parameters[12].DefaultLength = sizeof(ULONG);
139
140 Parameters[13].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
141 Parameters[13].Name = L"ResendIterations";
142 Parameters[13].EntryContext = &Settings->ResendIterations;
143 Parameters[13].DefaultType = REG_DWORD;
144 Parameters[13].DefaultData = &DefaultResendIterations;
145 Parameters[13].DefaultLength = sizeof(ULONG);
146
147 Parameters[14].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
148 Parameters[14].Name = L"SampleRate";
149 Parameters[14].EntryContext = &Settings->SampleRate;
150 Parameters[14].DefaultType = REG_DWORD;
151 Parameters[14].DefaultData = &DefaultSampleRate;
152 Parameters[14].DefaultLength = sizeof(ULONG);
153
154 Parameters[15].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
155 Parameters[15].Name = L"CrashOnCtrlScroll";
156 Parameters[15].EntryContext = &Settings->CrashOnCtrlScroll;
157 Parameters[15].DefaultType = REG_DWORD;
158 Parameters[15].DefaultData = &DefaultCrashOnCtrlScroll;
159 Parameters[15].DefaultLength = sizeof(ULONG);
160
161 Status = RtlQueryRegistryValues(
162 RTL_REGISTRY_ABSOLUTE,
163 RegistryPath->Buffer,
164 Parameters,
165 NULL,
166 NULL);
167
168 if (NT_SUCCESS(Status))
169 {
170 /* Check values */
171 if (Settings->KeyboardDataQueueSize < 1)
172 Settings->KeyboardDataQueueSize = DefaultKeyboardDataQueueSize;
173 if (Settings->MouseDataQueueSize < 1)
174 Settings->MouseDataQueueSize = DefaultMouseDataQueueSize;
175 if (Settings->NumberOfButtons < 1)
176 Settings->NumberOfButtons = DefaultNumberOfButtons;
177 if (Settings->PollingIterations < 0x400)
178 Settings->PollingIterations = DefaultPollingIterations;
179 if (Settings->PollingIterationsMaximum < 0x400)
180 Settings->PollingIterationsMaximum = DefaultPollingIterationsMaximum;
181 if (Settings->ResendIterations < 1)
182 Settings->ResendIterations = DefaultResendIterations;
183 }
184 else if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
185 {
186 /* Registry path doesn't exist. Set defaults */
187 Settings->KeyboardDataQueueSize = DefaultKeyboardDataQueueSize;
188 Settings->MouseDataQueueSize = DefaultMouseDataQueueSize;
189 Settings->MouseResolution = DefaultMouseResolution;
190 Settings->MouseSynchIn100ns = DefaultMouseSynchIn100ns;
191 Settings->NumberOfButtons = DefaultNumberOfButtons;
192 Settings->PollStatusIterations = DefaultPollStatusIterations;
193 Settings->OverrideKeyboardType = DefaultOverrideKeyboardType;
194 Settings->OverrideKeyboardSubtype = DefaultOverrideKeyboardSubtype;
195 Settings->PollingIterations = DefaultPollingIterations;
196 Settings->PollingIterationsMaximum = DefaultPollingIterationsMaximum;
197 Settings->ResendIterations = DefaultResendIterations;
198 Settings->SampleRate = DefaultSampleRate;
199 Settings->CrashOnCtrlScroll = DefaultCrashOnCtrlScroll;
200 if (!RtlCreateUnicodeString(&Settings->KeyboardDeviceBaseName, DefaultKeyboardDeviceBaseName)
201 || !RtlCreateUnicodeString(&Settings->PointerDeviceBaseName, DefaultPointerDeviceBaseName))
202 {
203 WARN_(I8042PRT, "RtlCreateUnicodeString() failed\n");
204 Status = STATUS_NO_MEMORY;
205 }
206 else
207 {
208 Status = STATUS_SUCCESS;
209 }
210 }
211
212 if (NT_SUCCESS(Status))
213 {
214 INFO_(I8042PRT, "KeyboardDataQueueSize : 0x%lx\n", Settings->KeyboardDataQueueSize);
215 INFO_(I8042PRT, "KeyboardDeviceBaseName : %wZ\n", &Settings->KeyboardDeviceBaseName);
216 INFO_(I8042PRT, "MouseDataQueueSize : 0x%lx\n", Settings->MouseDataQueueSize);
217 INFO_(I8042PRT, "MouseResolution : 0x%lx\n", Settings->MouseResolution);
218 INFO_(I8042PRT, "MouseSynchIn100ns : %lu\n", Settings->MouseSynchIn100ns);
219 INFO_(I8042PRT, "NumberOfButtons : 0x%lx\n", Settings->NumberOfButtons);
220 INFO_(I8042PRT, "PointerDeviceBaseName : %wZ\n", &Settings->PointerDeviceBaseName);
221 INFO_(I8042PRT, "PollStatusIterations : 0x%lx\n", Settings->PollStatusIterations);
222 INFO_(I8042PRT, "OverrideKeyboardType : 0x%lx\n", Settings->OverrideKeyboardType);
223 INFO_(I8042PRT, "OverrideKeyboardSubtype : 0x%lx\n", Settings->OverrideKeyboardSubtype);
224 INFO_(I8042PRT, "PollingIterations : 0x%lx\n", Settings->PollingIterations);
225 INFO_(I8042PRT, "PollingIterationsMaximum : %lu\n", Settings->PollingIterationsMaximum);
226 INFO_(I8042PRT, "ResendIterations : 0x%lx\n", Settings->ResendIterations);
227 INFO_(I8042PRT, "SampleRate : %lu\n", Settings->SampleRate);
228 }
229
230 return Status;
231 }