ReactOS 0.4.15-dev-5884-gab5aff5
hwhacks.c
Go to the documentation of this file.
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/hwhacks.c
5 * PURPOSE: Mouse specific functions
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
7 * REFERENCES: - http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
8 * -
9 */
10
11#include "i8042prt.h"
12#include <wmiguid.h>
13#include <wmidata.h>
14#include <wmistr.h>
15#include <dmilib.h>
16
17#define NDEBUG
18#include <debug.h>
19
23
24typedef struct _MATCHENTRY
25{
29
30#define MAX_MATCH_ENTRIES 3
31typedef struct _HARDWARE_TABLE
32{
36
38{
39// { {{BOARD_VENDOR, "RIOWORKS"}, {BOARD_NAME, "HDAMB"}, {BOARD_VERSION, "Rev E"}}, FL_NOLOOP },
40// { {{BOARD_VENDOR, "ASUSTeK Computer Inc."}, {BOARD_NAME, "G1S"}, {BOARD_VERSION, "1.0"}}, FL_NOLOOP },
41
42 { {{SYS_VENDOR, "Microsoft Corporation"}, {SYS_PRODUCT, "Virtual Machine"}}, FL_INITHACK },
43 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Inspiron 6000 "}}, FL_INITHACK },
44 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D430 "}}, FL_INITHACK },
45 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D530 "}}, FL_INITHACK },
46 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D531 "}}, FL_INITHACK },
47 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D600 "}}, FL_INITHACK },
48 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D610 "}}, FL_INITHACK },
49 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D620 "}}, FL_INITHACK },
50 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D630 "}}, FL_INITHACK },
51 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D810 "}}, FL_INITHACK },
52 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude D820 "}}, FL_INITHACK },
53 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude E4300 "}}, FL_INITHACK },
54 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude E4310 "}}, FL_INITHACK },
55 { {{SYS_VENDOR, "Dell Inc."}, {SYS_PRODUCT, "Latitude E6400 "}}, FL_INITHACK },
56
57};
58
59
60
61static
62VOID
64 _In_reads_bytes_(TableSize) PVOID SMBiosTables,
66{
67 ULONG i, j;
69
70 ParseSMBiosTables(SMBiosTables, TableSize, Strings);
71
72#if 0 // DBG
73 DbgPrint("i8042prt: Dumping DMI data:\n");
74 DbgPrint("BIOS_VENDOR: %s\n", Strings[BIOS_VENDOR]);
75 DbgPrint("BIOS_VERSION: %s\n", Strings[BIOS_VERSION]);
76 DbgPrint("BIOS_DATE: %s\n", Strings[BIOS_DATE]);
77 DbgPrint("SYS_VENDOR: %s\n", Strings[SYS_VENDOR]);
78 DbgPrint("SYS_PRODUCT: %s\n", Strings[SYS_PRODUCT]);
79 DbgPrint("SYS_VERSION: %s\n", Strings[SYS_VERSION]);
80 DbgPrint("SYS_SERIAL: %s\n", Strings[SYS_SERIAL]);
81 DbgPrint("BOARD_VENDOR: %s\n", Strings[BOARD_VENDOR]);
82 DbgPrint("BOARD_NAME: %s\n", Strings[BOARD_NAME]);
83 DbgPrint("BOARD_VERSION: %s\n", Strings[BOARD_VERSION]);
84 DbgPrint("BOARD_SERIAL: %s\n", Strings[BOARD_SERIAL]);
85 DbgPrint("BOARD_ASSET_TAG: %s\n", Strings[BOARD_ASSET_TAG]);
86#endif
87
88 /* Now loop the hardware table to find a match */
89 for (i = 0; i < ARRAYSIZE(i8042HardwareTable); i++)
90 {
91 for (j = 0; j < MAX_MATCH_ENTRIES; j++)
92 {
94
95 if (Type != ID_NONE)
96 {
97 /* Check for a match */
98 if ((Strings[Type] == NULL) ||
99 strcmp(i8042HardwareTable[i].MatchEntries[j].String,
100 Strings[i8042HardwareTable[i].MatchEntries[j].Type]))
101 {
102 /* Does not match, try next entry */
103 break;
104 }
105 }
106 }
107
108 if (j == MAX_MATCH_ENTRIES)
109 {
110 /* All items matched! */
112 DPRINT("Found match for hw table index %u\n", i);
113 break;
114 }
115 }
116}
117
118static
119VOID
121 _In_reads_bytes_(TableSize) PVOID SMBiosTables,
123{
124 static UNICODE_STRING mssmbiosKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\mssmbios");
125 static UNICODE_STRING DataName = RTL_CONSTANT_STRING(L"Data");
126 static UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SMBiosData");
130
131 /* Create registry key */
133 &mssmbiosKeyName,
135 NULL,
136 NULL);
137 Status = ZwCreateKey(&KeyHandle,
138 KEY_WRITE,
140 0,
141 NULL,
143 NULL);
144
145 if (!NT_SUCCESS(Status))
146 {
147 return;
148 }
149
150 /* Create sub key */
152 &DataName,
154 KeyHandle,
155 NULL);
156 Status = ZwCreateKey(&SubKeyHandle,
157 KEY_WRITE,
159 0,
160 NULL,
162 NULL);
163
164 if (!NT_SUCCESS(Status))
165 {
167 return;
168 }
169
170 /* Write value */
171 ZwSetValueKey(SubKeyHandle,
172 &ValueName,
173 0,
175 SMBiosTables,
176 TableSize);
177
180}
181
182VOID
183NTAPI
185 VOID)
186{
188 PVOID DataBlockObject;
189 PWNODE_ALL_DATA AllData;
191
192 /* Open the data block object for the SMBIOS table */
195 &DataBlockObject);
196 if (!NT_SUCCESS(Status))
197 {
198 DPRINT1("IoWMIOpenBlock failed: 0x%08lx\n", Status);
199 return;
200 }
201
202 /* Query the required buffer size */
203 BufferSize = 0;
204 Status = IoWMIQueryAllData(DataBlockObject, &BufferSize, NULL);
205 if (!NT_SUCCESS(Status))
206 {
207 DPRINT1("IoWMIOpenBlock failed: 0x%08lx\n", Status);
208 return;
209 }
210
211 AllData = ExAllocatePoolWithTag(PagedPool, BufferSize, 'BTMS');
212 if (AllData == NULL)
213 {
214 DPRINT1("Failed to allocate %lu bytes for SMBIOS tables\n", BufferSize);
215 return;
216 }
217
218 /* Query the buffer data */
219 Status = IoWMIQueryAllData(DataBlockObject, &BufferSize, AllData);
220 if (!NT_SUCCESS(Status))
221 {
222 DPRINT1("IoWMIOpenBlock failed: 0x%08lx\n", Status);
223 ExFreePoolWithTag(AllData, 'BTMS');
224 return;
225 }
226
227 /* FIXME: This function should be removed once the mssmbios driver is implemented */
228 /* Store SMBios data in registry */
229 i8042StoreSMBiosTables(AllData + 1,
230 AllData->FixedInstanceSize);
231 DPRINT1("SMBiosTables HACK, see CORE-14867\n");
232
233 /* Parse the table */
234 i8042ParseSMBiosTables(AllData + 1,
235 AllData->WnodeHeader.BufferSize);
236
237 /* Free the buffer */
238 ExFreePoolWithTag(AllData, 'BTMS');
239}
240
Type
Definition: Type.h:7
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define BufferSize
Definition: mmc.h:75
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
static const WCHAR Strings[]
Definition: reg.c:35
VOID ParseSMBiosTables(_In_reads_bytes_(TableSize) PVOID SMBiosTables, _In_ ULONG TableSize, _Inout_updates_(ID_STRINGS_MAX) PCHAR *Strings)
Definition: dmilib.c:41
@ BIOS_VERSION
Definition: dmilib.h:16
@ BOARD_VENDOR
Definition: dmilib.h:24
@ SYS_VERSION
Definition: dmilib.h:20
@ SYS_PRODUCT
Definition: dmilib.h:19
@ ID_STRINGS_MAX
Definition: dmilib.h:30
@ BOARD_ASSET_TAG
Definition: dmilib.h:28
@ BIOS_DATE
Definition: dmilib.h:17
@ SYS_VENDOR
Definition: dmilib.h:18
@ BIOS_VENDOR
Definition: dmilib.h:15
@ BOARD_NAME
Definition: dmilib.h:25
@ BOARD_VERSION
Definition: dmilib.h:26
@ BOARD_SERIAL
Definition: dmilib.h:27
@ ID_NONE
Definition: dmilib.h:14
@ SYS_SERIAL
Definition: dmilib.h:21
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define DbgPrint
Definition: hal.h:12
struct _HARDWARE_TABLE HARDWARE_TABLE
ULONG i8042HwFlags
Definition: hwhacks.c:22
PVOID i8042SMBiosTables
Definition: hwhacks.c:21
const GUID MSSmBios_RawSMBiosTables_GUID
Definition: hwhacks.c:20
const HARDWARE_TABLE i8042HardwareTable[]
Definition: hwhacks.c:37
static VOID i8042StoreSMBiosTables(_In_reads_bytes_(TableSize) PVOID SMBiosTables, _In_ ULONG TableSize)
Definition: hwhacks.c:120
#define MAX_MATCH_ENTRIES
Definition: hwhacks.c:30
static VOID i8042ParseSMBiosTables(_In_reads_bytes_(TableSize) PVOID SMBiosTables, _In_ ULONG TableSize)
Definition: hwhacks.c:63
VOID NTAPI i8042InitializeHwHacks(VOID)
Definition: hwhacks.c:184
struct _MATCHENTRY MATCHENTRY
@ FL_INITHACK
Definition: i8042prt.h:454
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define _In_reads_bytes_(size)
Definition: ms_sal.h:321
#define _In_
Definition: ms_sal.h:308
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING _Out_ PNDIS_HANDLE SubKeyHandle
Definition: ndis.h:4726
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define REG_BINARY
Definition: nt_native.h:1496
#define KEY_WRITE
Definition: nt_native.h:1031
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
NTSTATUS NTAPI IoWMIOpenBlock(_In_ LPCGUID DataBlockGuid, _In_ ULONG DesiredAccess, _Out_ PVOID *DataBlockObject)
Definition: wmi.c:140
NTSTATUS NTAPI IoWMIQueryAllData(IN PVOID DataBlockObject, IN OUT ULONG *InOutBufferSize, OUT PVOID OutBuffer)
Definition: wmi.c:169
#define L(x)
Definition: ntvdm.h:50
#define DPRINT
Definition: sndvol32.h:71
ULONG Flags
Definition: hwhacks.c:34
MATCHENTRY MatchEntries[MAX_MATCH_ENTRIES]
Definition: hwhacks.c:33
ULONG Type
Definition: hwhacks.c:26
PCHAR String
Definition: hwhacks.c:27
struct _WNODE_HEADER WnodeHeader
Definition: wmistr.h:112
ULONG FixedInstanceSize
Definition: wmistr.h:118
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
#define SMBIOS_DATA_GUID
Definition: wmiguid.h:30
#define WMIGUID_QUERY
Definition: wmistr.h:159
_Must_inspect_result_ typedef _Out_ PULONG TableSize
Definition: iotypes.h:4327