2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Serial mouse driver
4 * FILE: drivers/input/sermouse/sermouse.c
5 * PURPOSE: Serial mouse driver entry point
7 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
17 DriverUnload(IN PDRIVER_OBJECT DriverObject
)
19 // nothing to do here yet
24 IN PDEVICE_OBJECT DeviceObject
,
27 DPRINT1("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
[5];
42 ULONG DefaultMouseDataQueueSize
= 0x64;
43 ULONG DefaultNumberOfButtons
= 0;
44 UNICODE_STRING DefaultPointerDeviceBaseName
= RTL_CONSTANT_STRING(L
"PointerPort");
45 ULONG DefaultSampleRate
= 1200;
47 ParametersRegistryKey
.Length
= 0;
48 ParametersRegistryKey
.MaximumLength
= RegistryPath
->Length
+ sizeof(L
"\\Parameters") + sizeof(UNICODE_NULL
);
49 ParametersRegistryKey
.Buffer
= ExAllocatePool(PagedPool
, ParametersRegistryKey
.MaximumLength
);
50 if (!ParametersRegistryKey
.Buffer
)
52 DPRINT("ExAllocatePool() failed\n");
53 return STATUS_INSUFFICIENT_RESOURCES
;
55 RtlCopyUnicodeString(&ParametersRegistryKey
, RegistryPath
);
56 RtlAppendUnicodeToString(&ParametersRegistryKey
, L
"\\Parameters");
57 ParametersRegistryKey
.Buffer
[ParametersRegistryKey
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
59 RtlZeroMemory(Parameters
, sizeof(Parameters
));
61 Parameters
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_REGISTRY_OPTIONAL
;
62 Parameters
[0].Name
= L
"MouseDataQueueSize";
63 Parameters
[0].EntryContext
= &DriverExtension
->MouseDataQueueSize
;
64 Parameters
[0].DefaultType
= REG_DWORD
;
65 Parameters
[0].DefaultData
= &DefaultMouseDataQueueSize
;
66 Parameters
[0].DefaultLength
= sizeof(ULONG
);
68 Parameters
[1].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_REGISTRY_OPTIONAL
;
69 Parameters
[1].Name
= L
"NumberOfButtons";
70 Parameters
[1].EntryContext
= &DriverExtension
->NumberOfButtons
;
71 Parameters
[1].DefaultType
= REG_DWORD
;
72 Parameters
[1].DefaultData
= &DefaultNumberOfButtons
;
73 Parameters
[1].DefaultLength
= sizeof(ULONG
);
75 Parameters
[2].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_REGISTRY_OPTIONAL
;
76 Parameters
[2].Name
= L
"PointerDeviceBaseName";
77 Parameters
[2].EntryContext
= &DriverExtension
->PointerDeviceBaseName
;
78 Parameters
[2].DefaultType
= REG_SZ
;
79 Parameters
[2].DefaultData
= &DefaultPointerDeviceBaseName
;
80 Parameters
[2].DefaultLength
= 0;
82 Parameters
[3].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_REGISTRY_OPTIONAL
;
83 Parameters
[3].Name
= L
"SampleRate";
84 Parameters
[3].EntryContext
= &DriverExtension
->SampleRate
;
85 Parameters
[3].DefaultType
= REG_DWORD
;
86 Parameters
[3].DefaultData
= &DefaultSampleRate
;
87 Parameters
[3].DefaultLength
= sizeof(ULONG
);
89 Status
= RtlQueryRegistryValues(
90 RTL_REGISTRY_ABSOLUTE
,
91 ParametersRegistryKey
.Buffer
,
96 if (NT_SUCCESS(Status
))
99 if (DriverExtension
->MouseDataQueueSize
== 0)
101 DriverExtension
->MouseDataQueueSize
= DefaultMouseDataQueueSize
;
104 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
106 /* Registry path doesn't exist. Set defaults */
107 DriverExtension
->MouseDataQueueSize
= DefaultMouseDataQueueSize
;
108 DriverExtension
->NumberOfButtons
= DefaultNumberOfButtons
;
109 Status
= RtlDuplicateUnicodeString(
110 RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
,
111 &DefaultPointerDeviceBaseName
,
112 &DriverExtension
->PointerDeviceBaseName
);
113 DriverExtension
->SampleRate
= DefaultSampleRate
;
120 * Standard DriverEntry method.
124 IN PDRIVER_OBJECT DriverObject
,
125 IN PUNICODE_STRING RegistryPath
)
127 PSERMOUSE_DRIVER_EXTENSION DriverExtension
;
131 Status
= IoAllocateDriverObjectExtension(
134 sizeof(SERMOUSE_DRIVER_EXTENSION
),
135 (PVOID
*)&DriverExtension
);
136 if (!NT_SUCCESS(Status
))
138 DPRINT("IoAllocateDriverObjectExtension() failed with status 0x%08lx\n", Status
);
141 RtlZeroMemory(DriverExtension
, sizeof(SERMOUSE_DRIVER_EXTENSION
));
143 Status
= ReadRegistryEntries(RegistryPath
, DriverExtension
);
144 if (!NT_SUCCESS(Status
))
146 DPRINT("ReadRegistryEntries() failed with status 0x%08lx\n", Status
);
150 DriverObject
->DriverUnload
= DriverUnload
;
151 DriverObject
->DriverExtension
->AddDevice
= SermouseAddDevice
;
153 for (i
= 0; i
< IRP_MJ_MAXIMUM_FUNCTION
; i
++)
154 DriverObject
->MajorFunction
[i
] = IrpStub
;
156 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = SermouseCreate
;
157 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = SermouseClose
;
158 DriverObject
->MajorFunction
[IRP_MJ_CLEANUP
] = SermouseCleanup
;
159 //DriverObject->MajorFunction[IRP_MJ_READ] = SermouseRead;
160 //DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SermouseDeviceControl;
161 DriverObject
->MajorFunction
[IRP_MJ_INTERNAL_DEVICE_CONTROL
] = SermouseInternalDeviceControl
;
162 //DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] = SermouseQueryInformation;
163 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = SermousePnp
;
164 //DriverObject->MajorFunction[IRP_MJ_POWER] = SermousePower;
166 return STATUS_SUCCESS
;