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