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)
12 static DRIVER_UNLOAD DriverUnload
;
13 static DRIVER_DISPATCH IrpStub
;
14 DRIVER_INITIALIZE DriverEntry
;
17 DriverUnload(IN PDRIVER_OBJECT DriverObject
)
19 // nothing to do here yet
24 IN PDEVICE_OBJECT DeviceObject
,
27 ERR_(SERMOUSE
, "Irp stub for major function 0x%lx\n",
28 IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
);
29 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
30 return STATUS_NOT_SUPPORTED
;
35 IN PUNICODE_STRING RegistryPath
,
36 IN PSERMOUSE_DRIVER_EXTENSION DriverExtension
)
38 UNICODE_STRING ParametersRegistryKey
;
39 RTL_QUERY_REGISTRY_TABLE Parameters
[2];
42 ULONG DefaultNumberOfButtons
= 2;
44 ParametersRegistryKey
.Length
= 0;
45 ParametersRegistryKey
.MaximumLength
= RegistryPath
->Length
+ sizeof(L
"\\Parameters") + sizeof(UNICODE_NULL
);
46 ParametersRegistryKey
.Buffer
= ExAllocatePoolWithTag(PagedPool
, ParametersRegistryKey
.MaximumLength
, SERMOUSE_TAG
);
47 if (!ParametersRegistryKey
.Buffer
)
49 WARN_(SERMOUSE
, "ExAllocatePoolWithTag() failed\n");
50 return STATUS_NO_MEMORY
;
52 RtlCopyUnicodeString(&ParametersRegistryKey
, RegistryPath
);
53 RtlAppendUnicodeToString(&ParametersRegistryKey
, L
"\\Parameters");
54 ParametersRegistryKey
.Buffer
[ParametersRegistryKey
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
56 RtlZeroMemory(Parameters
, sizeof(Parameters
));
58 Parameters
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_REGISTRY_OPTIONAL
;
59 Parameters
[0].Name
= L
"NumberOfButtons";
60 Parameters
[0].EntryContext
= &DriverExtension
->NumberOfButtons
;
61 Parameters
[0].DefaultType
= REG_DWORD
;
62 Parameters
[0].DefaultData
= &DefaultNumberOfButtons
;
63 Parameters
[0].DefaultLength
= sizeof(ULONG
);
65 Status
= RtlQueryRegistryValues(
66 RTL_REGISTRY_ABSOLUTE
,
67 ParametersRegistryKey
.Buffer
,
72 if (NT_SUCCESS(Status
))
76 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
78 /* Registry path doesn't exist. Set defaults */
79 DriverExtension
->NumberOfButtons
= (USHORT
)DefaultNumberOfButtons
;
80 Status
= STATUS_SUCCESS
;
83 ExFreePoolWithTag(ParametersRegistryKey
.Buffer
, SERMOUSE_TAG
);
88 * Standard DriverEntry method.
92 IN PDRIVER_OBJECT DriverObject
,
93 IN PUNICODE_STRING RegistryPath
)
95 PSERMOUSE_DRIVER_EXTENSION DriverExtension
;
99 Status
= IoAllocateDriverObjectExtension(
102 sizeof(SERMOUSE_DRIVER_EXTENSION
),
103 (PVOID
*)&DriverExtension
);
104 if (!NT_SUCCESS(Status
))
106 WARN_(SERMOUSE
, "IoAllocateDriverObjectExtension() failed with status 0x%08lx\n", Status
);
109 RtlZeroMemory(DriverExtension
, sizeof(SERMOUSE_DRIVER_EXTENSION
));
111 Status
= ReadRegistryEntries(RegistryPath
, DriverExtension
);
112 if (!NT_SUCCESS(Status
))
114 WARN_(SERMOUSE
, "ReadRegistryEntries() failed with status 0x%08lx\n", Status
);
118 DriverObject
->DriverUnload
= DriverUnload
;
119 DriverObject
->DriverExtension
->AddDevice
= SermouseAddDevice
;
121 for (i
= 0; i
<= IRP_MJ_MAXIMUM_FUNCTION
; i
++)
122 DriverObject
->MajorFunction
[i
] = IrpStub
;
124 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = SermouseCreate
;
125 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = SermouseClose
;
126 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = SermouseCleanup
;
127 //DriverObject->MajorFunction[IRP_MJ_READ] = SermouseRead;
128 //DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SermouseDeviceControl;
129 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = SermouseInternalDeviceControl
;
130 //DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = SermouseQueryInformation;
131 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = SermousePnp
;
132 //DriverObject->MajorFunction[IRP_MJ_POWER] = SermousePower;
134 return STATUS_SUCCESS
;