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
7 * PROGRAMMER: Victor Kirhenshtein (sauros@iname.com)
8 * Jason Filby (jasonfilby@yahoo.com)
12 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
16 #include <ntos/keyboard.h>
17 #include <ntos/minmax.h>
18 #include <rosrtl/string.h>
20 #include <ddk/ntddkbd.h>
21 #include <ddk/ntdd8042.h>
28 /* FUNCTIONS *****************************************************************/
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...
35 VOID STDCALL
I8042ReadRegistry(PDRIVER_OBJECT DriverObject
,
36 PDEVICE_EXTENSION DevExt
)
39 RTL_QUERY_REGISTRY_TABLE Parameters
[18];
40 UNICODE_STRING ParametersPath
;
42 PWSTR RegistryPath
= L
"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\i8042Prt\\Parameters";
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;
65 RtlInitUnicodeString(&ParametersPath
, NULL
);
66 ParametersPath
.MaximumLength
= (wcslen(RegistryPath
) *
70 ParametersPath
.Buffer
= ExAllocatePoolWithTag(PagedPool
,
71 ParametersPath
.MaximumLength
,
74 if (!ParametersPath
.Buffer
) {
75 DPRINT1("No buffer space for reading registry\n");
79 RtlZeroMemory(ParametersPath
.Buffer
, ParametersPath
.MaximumLength
);
80 RtlAppendUnicodeToString(&ParametersPath
, RegistryPath
);
82 RtlZeroMemory(Parameters
, sizeof(Parameters
));
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
191 Parameters
[14].Flags
= RTL_QUERY_REGISTRY_DIRECT
;
192 Parameters
[14].Name
= L
"SampleRate";
193 Parameters
[14].EntryContext
= &DevExt
->MouseAttributes
.SampleRate
;
194 Parameters
[14].DefaultType
= REG_DWORD
;
195 Parameters
[14].DefaultData
= &DefaultSampleRate
;
196 Parameters
[14].DefaultLength
= sizeof(ULONG
);
198 Parameters
[15].Flags
= RTL_QUERY_REGISTRY_DIRECT
;
199 Parameters
[15].Name
= L
"NumberOfButtons";
200 Parameters
[15].EntryContext
= &DevExt
->Settings
.NumberOfButtons
;
201 Parameters
[15].DefaultType
= REG_DWORD
;
202 Parameters
[15].DefaultData
= &DefaultNumberOfButtons
;
203 Parameters
[15].DefaultLength
= sizeof(ULONG
);
205 Parameters
[16].Flags
= RTL_QUERY_REGISTRY_DIRECT
;
206 Parameters
[16].Name
= L
"EnableWheelDetection";
207 Parameters
[16].EntryContext
= &DevExt
->Settings
.EnableWheelDetection
;
208 Parameters
[16].DefaultType
= REG_DWORD
;
209 Parameters
[16].DefaultData
= &DefaultEnableWheelDetection
;
210 Parameters
[16].DefaultLength
= sizeof(ULONG
);
212 Status
= RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE
|
213 RTL_REGISTRY_OPTIONAL
,
214 ParametersPath
.Buffer
,
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...
225 RTL_QUERY_REGISTRY_TABLE
*Current
= Parameters
;
226 while (Current
->Name
) {
227 *((DWORD
*)Current
->EntryContext
) =
228 *((DWORD
*)Current
->DefaultData
);
231 DPRINT1 ("Manually set defaults\n");
234 ExFreePool(ParametersPath
.Buffer
);
235 DPRINT("Done reading registry\n");