xref: /reactos/drivers/input/sermouse/sermouse.c (revision c2c66aff)
1*c2c66affSColin Finck /*
2*c2c66affSColin Finck  * PROJECT:     ReactOS Serial mouse driver
3*c2c66affSColin Finck  * LICENSE:     GPL - See COPYING in the top level directory
4*c2c66affSColin Finck  * FILE:        drivers/input/sermouse/fdo.c
5*c2c66affSColin Finck  * PURPOSE:     Serial mouse driver entry point
6*c2c66affSColin Finck  * PROGRAMMERS: Copyright 2005-2006 Herv� Poussineau (hpoussin@reactos.org)
7*c2c66affSColin Finck  */
8*c2c66affSColin Finck 
9*c2c66affSColin Finck #include "sermouse.h"
10*c2c66affSColin Finck 
11*c2c66affSColin Finck #include <debug.h>
12*c2c66affSColin Finck 
13*c2c66affSColin Finck static DRIVER_UNLOAD DriverUnload;
14*c2c66affSColin Finck static DRIVER_DISPATCH IrpStub;
15*c2c66affSColin Finck DRIVER_INITIALIZE DriverEntry;
16*c2c66affSColin Finck 
17*c2c66affSColin Finck static VOID NTAPI
18*c2c66affSColin Finck DriverUnload(IN PDRIVER_OBJECT DriverObject)
19*c2c66affSColin Finck {
20*c2c66affSColin Finck 	// nothing to do here yet
21*c2c66affSColin Finck }
22*c2c66affSColin Finck 
23*c2c66affSColin Finck static NTSTATUS NTAPI
24*c2c66affSColin Finck IrpStub(
25*c2c66affSColin Finck 	IN PDEVICE_OBJECT DeviceObject,
26*c2c66affSColin Finck 	IN PIRP Irp)
27*c2c66affSColin Finck {
28*c2c66affSColin Finck 	ERR_(SERMOUSE, "Irp stub for major function 0x%lx\n",
29*c2c66affSColin Finck 		IoGetCurrentIrpStackLocation(Irp)->MajorFunction);
30*c2c66affSColin Finck 	IoCompleteRequest(Irp, IO_NO_INCREMENT);
31*c2c66affSColin Finck 	return STATUS_NOT_SUPPORTED;
32*c2c66affSColin Finck }
33*c2c66affSColin Finck 
34*c2c66affSColin Finck static NTSTATUS
35*c2c66affSColin Finck ReadRegistryEntries(
36*c2c66affSColin Finck 	IN PUNICODE_STRING RegistryPath,
37*c2c66affSColin Finck 	IN PSERMOUSE_DRIVER_EXTENSION DriverExtension)
38*c2c66affSColin Finck {
39*c2c66affSColin Finck 	UNICODE_STRING ParametersRegistryKey;
40*c2c66affSColin Finck 	RTL_QUERY_REGISTRY_TABLE Parameters[2];
41*c2c66affSColin Finck 	NTSTATUS Status;
42*c2c66affSColin Finck 
43*c2c66affSColin Finck 	ULONG DefaultNumberOfButtons = 2;
44*c2c66affSColin Finck 
45*c2c66affSColin Finck 	ParametersRegistryKey.Length = 0;
46*c2c66affSColin Finck 	ParametersRegistryKey.MaximumLength = RegistryPath->Length + sizeof(L"\\Parameters") + sizeof(UNICODE_NULL);
47*c2c66affSColin Finck 	ParametersRegistryKey.Buffer = ExAllocatePoolWithTag(PagedPool, ParametersRegistryKey.MaximumLength, SERMOUSE_TAG);
48*c2c66affSColin Finck 	if (!ParametersRegistryKey.Buffer)
49*c2c66affSColin Finck 	{
50*c2c66affSColin Finck 		WARN_(SERMOUSE, "ExAllocatePoolWithTag() failed\n");
51*c2c66affSColin Finck 		return STATUS_NO_MEMORY;
52*c2c66affSColin Finck 	}
53*c2c66affSColin Finck 	RtlCopyUnicodeString(&ParametersRegistryKey, RegistryPath);
54*c2c66affSColin Finck 	RtlAppendUnicodeToString(&ParametersRegistryKey, L"\\Parameters");
55*c2c66affSColin Finck 	ParametersRegistryKey.Buffer[ParametersRegistryKey.Length / sizeof(WCHAR)] = UNICODE_NULL;
56*c2c66affSColin Finck 
57*c2c66affSColin Finck 	RtlZeroMemory(Parameters, sizeof(Parameters));
58*c2c66affSColin Finck 
59*c2c66affSColin Finck 	Parameters[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_REGISTRY_OPTIONAL;
60*c2c66affSColin Finck 	Parameters[0].Name = L"NumberOfButtons";
61*c2c66affSColin Finck 	Parameters[0].EntryContext = &DriverExtension->NumberOfButtons;
62*c2c66affSColin Finck 	Parameters[0].DefaultType = REG_DWORD;
63*c2c66affSColin Finck 	Parameters[0].DefaultData = &DefaultNumberOfButtons;
64*c2c66affSColin Finck 	Parameters[0].DefaultLength = sizeof(ULONG);
65*c2c66affSColin Finck 
66*c2c66affSColin Finck 	Status = RtlQueryRegistryValues(
67*c2c66affSColin Finck 		RTL_REGISTRY_ABSOLUTE,
68*c2c66affSColin Finck 		ParametersRegistryKey.Buffer,
69*c2c66affSColin Finck 		Parameters,
70*c2c66affSColin Finck 		NULL,
71*c2c66affSColin Finck 		NULL);
72*c2c66affSColin Finck 
73*c2c66affSColin Finck 	if (NT_SUCCESS(Status))
74*c2c66affSColin Finck 	{
75*c2c66affSColin Finck 		/* Check values */
76*c2c66affSColin Finck 	}
77*c2c66affSColin Finck 	else if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
78*c2c66affSColin Finck 	{
79*c2c66affSColin Finck 		/* Registry path doesn't exist. Set defaults */
80*c2c66affSColin Finck 		DriverExtension->NumberOfButtons = (USHORT)DefaultNumberOfButtons;
81*c2c66affSColin Finck 		Status = STATUS_SUCCESS;
82*c2c66affSColin Finck 	}
83*c2c66affSColin Finck 
84*c2c66affSColin Finck 	ExFreePoolWithTag(ParametersRegistryKey.Buffer, SERMOUSE_TAG);
85*c2c66affSColin Finck 	return Status;
86*c2c66affSColin Finck }
87*c2c66affSColin Finck 
88*c2c66affSColin Finck /*
89*c2c66affSColin Finck  * Standard DriverEntry method.
90*c2c66affSColin Finck  */
91*c2c66affSColin Finck NTSTATUS NTAPI
92*c2c66affSColin Finck DriverEntry(
93*c2c66affSColin Finck 	IN PDRIVER_OBJECT DriverObject,
94*c2c66affSColin Finck 	IN PUNICODE_STRING RegistryPath)
95*c2c66affSColin Finck {
96*c2c66affSColin Finck 	PSERMOUSE_DRIVER_EXTENSION DriverExtension;
97*c2c66affSColin Finck 	ULONG i;
98*c2c66affSColin Finck 	NTSTATUS Status;
99*c2c66affSColin Finck 
100*c2c66affSColin Finck 	Status = IoAllocateDriverObjectExtension(
101*c2c66affSColin Finck 		DriverObject,
102*c2c66affSColin Finck 		DriverObject,
103*c2c66affSColin Finck 		sizeof(SERMOUSE_DRIVER_EXTENSION),
104*c2c66affSColin Finck 		(PVOID*)&DriverExtension);
105*c2c66affSColin Finck 	if (!NT_SUCCESS(Status))
106*c2c66affSColin Finck 	{
107*c2c66affSColin Finck 		WARN_(SERMOUSE, "IoAllocateDriverObjectExtension() failed with status 0x%08lx\n", Status);
108*c2c66affSColin Finck 		return Status;
109*c2c66affSColin Finck 	}
110*c2c66affSColin Finck 	RtlZeroMemory(DriverExtension, sizeof(SERMOUSE_DRIVER_EXTENSION));
111*c2c66affSColin Finck 
112*c2c66affSColin Finck 	Status = ReadRegistryEntries(RegistryPath, DriverExtension);
113*c2c66affSColin Finck 	if (!NT_SUCCESS(Status))
114*c2c66affSColin Finck 	{
115*c2c66affSColin Finck 		WARN_(SERMOUSE, "ReadRegistryEntries() failed with status 0x%08lx\n", Status);
116*c2c66affSColin Finck 		return Status;
117*c2c66affSColin Finck 	}
118*c2c66affSColin Finck 
119*c2c66affSColin Finck 	DriverObject->DriverUnload = DriverUnload;
120*c2c66affSColin Finck 	DriverObject->DriverExtension->AddDevice = SermouseAddDevice;
121*c2c66affSColin Finck 
122*c2c66affSColin Finck 	for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
123*c2c66affSColin Finck 		DriverObject->MajorFunction[i] = IrpStub;
124*c2c66affSColin Finck 
125*c2c66affSColin Finck 	DriverObject->MajorFunction[IRP_MJ_CREATE] = SermouseCreate;
126*c2c66affSColin Finck 	DriverObject->MajorFunction[IRP_MJ_CLOSE] = SermouseClose;
127*c2c66affSColin Finck 	DriverObject->MajorFunction[IRP_MJ_CLEANUP] = SermouseCleanup;
128*c2c66affSColin Finck 	//DriverObject->MajorFunction[IRP_MJ_READ] = SermouseRead;
129*c2c66affSColin Finck 	//DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SermouseDeviceControl;
130*c2c66affSColin Finck 	DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = SermouseInternalDeviceControl;
131*c2c66affSColin Finck 	//DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = SermouseQueryInformation;
132*c2c66affSColin Finck 	DriverObject->MajorFunction[IRP_MJ_PNP] = SermousePnp;
133*c2c66affSColin Finck 	//DriverObject->MajorFunction[IRP_MJ_POWER] = SermousePower;
134*c2c66affSColin Finck 
135*c2c66affSColin Finck 	return STATUS_SUCCESS;
136*c2c66affSColin Finck }
137