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)
12 /* INCLUDES ******************************************************************/
16 /* FUNCTIONS *****************************************************************/
20 IN PUNICODE_STRING RegistryPath
,
21 OUT PI8042_SETTINGS Settings
)
23 RTL_QUERY_REGISTRY_TABLE Parameters
[17];
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
;
42 /* Default value for CrashOnCtrlScroll depends if we're
43 * running a debug build or a normal build.
46 DefaultCrashOnCtrlScroll
= 1;
48 DefaultCrashOnCtrlScroll
= 0;
51 RtlZeroMemory(Parameters
, sizeof(Parameters
));
53 Parameters
[0].Flags
= RTL_QUERY_REGISTRY_SUBKEY
;
54 Parameters
[0].Name
= L
"Parameters";
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
);
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;
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
);
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
);
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
);
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
);
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;
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
161 Status
= RtlQueryRegistryValues(
162 RTL_REGISTRY_ABSOLUTE
,
163 RegistryPath
->Buffer
,
168 if (NT_SUCCESS(Status
))
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
;
184 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
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
))
203 WARN_(I8042PRT
, "RtlCreateUnicodeString() failed\n");
204 Status
= STATUS_NO_MEMORY
;
208 Status
= STATUS_SUCCESS
;
212 if (NT_SUCCESS(Status
))
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
);