- Add registry entry in HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP for each mouse class DO
- Don't search for legacy port drivers in DriverEntry, but in first AddDevice
Modified: trunk/reactos/drivers/input/mouclass/mouclass.c
Modified: trunk/reactos/drivers/input/mouclass/mouclass.h

Modified: trunk/reactos/drivers/input/mouclass/mouclass.c
--- trunk/reactos/drivers/input/mouclass/mouclass.c	2005-11-09 11:15:42 UTC (rev 19094)
+++ trunk/reactos/drivers/input/mouclass/mouclass.c	2005-11-09 11:16:43 UTC (rev 19095)
@@ -13,6 +13,11 @@
 #define INITGUID
 #include "mouclass.h"
 
+static NTSTATUS
+SearchForLegacyDrivers(
+	IN PDRIVER_OBJECT DriverObject,
+	IN PCLASS_DRIVER_EXTENSION DriverExtension);
+
 static VOID NTAPI
 DriverUnload(IN PDRIVER_OBJECT DriverObject)
 {
@@ -201,7 +206,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,
@@ -321,7 +326,14 @@
 	Fdo->Flags |= DO_POWER_PAGABLE;
 	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);
 
 	ExFreePool(DeviceNameU.Buffer);
 
@@ -472,11 +484,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,
@@ -734,6 +748,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))
 	{
@@ -766,7 +790,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/mouclass/mouclass.h
--- trunk/reactos/drivers/input/mouclass/mouclass.h	2005-11-09 11:15:42 UTC (rev 19094)
+++ trunk/reactos/drivers/input/mouclass/mouclass.h	2005-11-09 11:16:43 UTC (rev 19095)
@@ -24,6 +24,8 @@
 
 typedef struct _CLASS_DRIVER_EXTENSION
 {
+	UNICODE_STRING RegistryPath;
+
 	/* Registry settings */
 	ULONG ConnectMultiplePorts;
 	ULONG DataQueueSize;