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