- Add registry entry in HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP for each keyboard class DO - Don't search for legacy port drivers in DriverEntry, but in first AddDevice - Don't dereference non-referenced objects Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.h _____
Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.c --- trunk/reactos/drivers/input/kbdclass/kbdclass.c 2005-11-09 11:13:02 UTC (rev 19093) +++ trunk/reactos/drivers/input/kbdclass/kbdclass.c 2005-11-09 11:15:42 UTC (rev 19094) @@ -13,6 +13,11 @@
#define INITGUID #include "kbdclass.h"
+static NTSTATUS +SearchForLegacyDrivers( + IN PDRIVER_OBJECT DriverObject, + IN PCLASS_DRIVER_EXTENSION DriverExtension); + static VOID NTAPI DriverUnload(IN PDRIVER_OBJECT DriverObject) { @@ -206,7 +211,7 @@ Parameters[2].EntryContext = &DriverExtension->DeviceBaseName; Parameters[2].DefaultType = REG_SZ; Parameters[2].DefaultData = &DefaultDeviceBaseName; - Parameters[2].DefaultLength = sizeof(ULONG); + Parameters[2].DefaultLength = 0;
Status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, @@ -327,7 +332,14 @@ Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO; Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
- /* FIXME: create registry entry in HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP */ + /* Add entry entry to HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP[DeviceBaseName] */ + RtlWriteRegistryValue( + RTL_REGISTRY_DEVICEMAP, + DriverExtension->DeviceBaseName.Buffer, + DeviceNameU.Buffer, + REG_SZ, + DriverExtension->RegistryPath.Buffer, + DriverExtension->RegistryPath.MaximumLength);
/* HACK: 1st stage setup needs a keyboard to open it in user-mode * Create a link to user space... */ @@ -464,7 +476,7 @@ else IoStatus.Status = Status;
- if (NT_SUCCESS(Status)) + if (NT_SUCCESS(IoStatus.Status)) ObReferenceObject(PortDO);
return IoStatus.Status; @@ -482,11 +494,13 @@
DPRINT("ClassAddDevice called. Pdo = 0x%p\n", Pdo);
+ DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject); + if (Pdo == NULL) - return STATUS_SUCCESS; + /* We're getting a NULL Pdo at the first call as we're a legacy driver. + * Use it to search for legacy port drivers. */ + return SearchForLegacyDrivers(DriverObject, DriverExtension);
- DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject); - /* Create new device object */ Status = IoCreateDevice( DriverObject, @@ -686,7 +700,6 @@ { /* FIXME: Log the error */ DPRINT("ConnectPortDriver() failed with status 0x%08lx\n", Status); - ObDereferenceObject(PortDeviceObject); } } else @@ -697,7 +710,6 @@ { /* FIXME: Log the error */ DPRINT("CreatePointerClassDeviceObject() failed with status 0x%08lx\n", Status); - ObDereferenceObject(PortDeviceObject); continue; } Status = ConnectPortDriver(PortDeviceObject, ClassDO); @@ -705,7 +717,6 @@ { /* FIXME: Log the error */ DPRINT("ConnectPortDriver() failed with status 0x%08lx\n", Status); - ObDereferenceObject(PortDeviceObject); IoDeleteDevice(ClassDO); } } @@ -747,6 +758,16 @@ } RtlZeroMemory(DriverExtension, sizeof(CLASS_DRIVER_EXTENSION));
+ Status = RtlDuplicateUnicodeString( + RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, + RegistryPath, + &DriverExtension->RegistryPath); + if (!NT_SUCCESS(Status)) + { + DPRINT("RtlDuplicateUnicodeString() failed with status 0x%08lx\n", Status); + return Status; + } + Status = ReadRegistryEntries(RegistryPath, DriverExtension); if (!NT_SUCCESS(Status)) { @@ -779,7 +800,5 @@ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ClassDeviceControl; DriverObject->DriverStartIo = ClassStartIo;
- Status = SearchForLegacyDrivers(DriverObject, DriverExtension); - - return Status; + return STATUS_SUCCESS; } _____
Modified: trunk/reactos/drivers/input/kbdclass/kbdclass.h --- trunk/reactos/drivers/input/kbdclass/kbdclass.h 2005-11-09 11:13:02 UTC (rev 19093) +++ trunk/reactos/drivers/input/kbdclass/kbdclass.h 2005-11-09 11:15:42 UTC (rev 19094) @@ -24,6 +24,8 @@
typedef struct _CLASS_DRIVER_EXTENSION { + UNICODE_STRING RegistryPath; + /* Registry settings */ ULONG ConnectMultiplePorts; ULONG DataQueueSize;