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)
13 static DRIVER_UNLOAD DriverUnload
;
14 static DRIVER_DISPATCH IrpStub
;
15 DRIVER_INITIALIZE DriverEntry
;
18 DriverUnload(IN PDRIVER_OBJECT DriverObject
)
20 // nothing to do here yet
25 IN PDEVICE_OBJECT DeviceObject
,
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
;
36 IN PUNICODE_STRING RegistryPath
,
37 IN PSERMOUSE_DRIVER_EXTENSION DriverExtension
)
39 UNICODE_STRING ParametersRegistryKey
;
40 RTL_QUERY_REGISTRY_TABLE Parameters
[2];
43 ULONG DefaultNumberOfButtons
= 2;
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
)
50 WARN_(SERMOUSE
, "ExAllocatePoolWithTag() failed\n");
51 return STATUS_NO_MEMORY
;
53 RtlCopyUnicodeString(&ParametersRegistryKey
, RegistryPath
);
54 RtlAppendUnicodeToString(&ParametersRegistryKey
, L
"\\Parameters");
55 ParametersRegistryKey
.Buffer
[ParametersRegistryKey
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
57 RtlZeroMemory(Parameters
, sizeof(Parameters
));
59 Parameters
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_REGISTRY_OPTIONAL
;
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
);
66 Status
= RtlQueryRegistryValues(
67 RTL_REGISTRY_ABSOLUTE
,
68 ParametersRegistryKey
.Buffer
,
73 if (NT_SUCCESS(Status
))
77 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
79 /* Registry path doesn't exist. Set defaults */
80 DriverExtension
->NumberOfButtons
= (USHORT
)DefaultNumberOfButtons
;
81 Status
= STATUS_SUCCESS
;
84 ExFreePoolWithTag(ParametersRegistryKey
.Buffer
, SERMOUSE_TAG
);
89 * Standard DriverEntry method.
93 IN PDRIVER_OBJECT DriverObject
,
94 IN PUNICODE_STRING RegistryPath
)
96 PSERMOUSE_DRIVER_EXTENSION DriverExtension
;
100 Status
= IoAllocateDriverObjectExtension(
103 sizeof(SERMOUSE_DRIVER_EXTENSION
),
104 (PVOID
*)&DriverExtension
);
105 if (!NT_SUCCESS(Status
))
107 WARN_(SERMOUSE
, "IoAllocateDriverObjectExtension() failed with status 0x%08lx\n", Status
);
110 RtlZeroMemory(DriverExtension
, sizeof(SERMOUSE_DRIVER_EXTENSION
));
112 Status
= ReadRegistryEntries(RegistryPath
, DriverExtension
);
113 if (!NT_SUCCESS(Status
))
115 WARN_(SERMOUSE
, "ReadRegistryEntries() failed with status 0x%08lx\n", Status
);
119 DriverObject
->DriverUnload
= DriverUnload
;
120 DriverObject
->DriverExtension
->AddDevice
= SermouseAddDevice
;
122 for (i
= 0; i
<= IRP_MJ_MAXIMUM_FUNCTION
; i
++)
123 DriverObject
->MajorFunction
[i
] = IrpStub
;
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;
135 return STATUS_SUCCESS
;