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