Start \\Device\\USBFDOx names at index 0.
Use the same index to create the symbolic link \\??\\HCDx
This should fix the handling of multiple USB controllers
Modified: trunk/reactos/drivers/usb/miniport/common/main.c
_____
Modified: trunk/reactos/drivers/usb/miniport/common/main.c
--- trunk/reactos/drivers/usb/miniport/common/main.c 2006-01-02
11:32:03 UTC (rev 20526)
+++ trunk/reactos/drivers/usb/miniport/common/main.c 2006-01-02
11:37:00 UTC (rev 20527)
@@ -17,7 +17,7 @@
#define INITGUID
#include "usbcommon.h"
-// data for embedded drivers
+/* Data for embedded drivers */
CONNECT_DATA KbdClassInformation;
CONNECT_DATA MouseClassInformation;
PDEVICE_OBJECT KeyboardFdo = NULL;
@@ -32,9 +32,9 @@
PDEVICE_OBJECT Pdo;
PUSBMP_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
-
+
DPRINT("USBMP: CreateRootHubPdo()\n");
-
+
Status = IoCreateDevice(
DriverObject,
sizeof(USBMP_DEVICE_EXTENSION),
@@ -48,19 +48,19 @@
DPRINT("USBMP: IoCreateDevice() call failed with status
0x%08x\n", Status);
return Status;
}
-
+
Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
Pdo->Flags |= DO_POWER_PAGABLE;
-
- // zerofill device extension
+
+ /* Zerofill device extension */
DeviceExtension = (PUSBMP_DEVICE_EXTENSION)Pdo->DeviceExtension;
RtlZeroMemory(DeviceExtension, sizeof(USBMP_DEVICE_EXTENSION));
-
+
DeviceExtension->IsFDO = FALSE;
DeviceExtension->FunctionalDeviceObject = Fdo;
-
+
Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
+
*pPdo = Pdo;
return STATUS_SUCCESS;
}
@@ -189,18 +189,18 @@
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT pdo)
{
- PDEVICE_OBJECT fdo;
+ PDEVICE_OBJECT fdo = NULL;
NTSTATUS Status;
WCHAR DeviceBuffer[20];
WCHAR LinkDeviceBuffer[20];
UNICODE_STRING DeviceName;
UNICODE_STRING LinkDeviceName;
PUSBMP_DRIVER_EXTENSION DriverExtension;
- PUSBMP_DEVICE_EXTENSION DeviceExtension;
+ PUSBMP_DEVICE_EXTENSION DeviceExtension = NULL;
static ULONG DeviceNumber = 0;
- BOOL AlreadyRestarted = FALSE;
+ BOOLEAN AlreadyRestarted = FALSE;
- // Allocate driver extension now
+ /* Allocate driver extension now */
DriverExtension = IoGetDriverObjectExtension(DriverObject,
DriverObject);
if (DriverExtension == NULL)
{
@@ -212,56 +212,59 @@
if (!NT_SUCCESS(Status))
{
- DPRINT("USBMP: Allocating DriverObjectExtension
failed.\n");
- return Status;
+ DPRINT1("USBMP: Allocating DriverObjectExtension
failed.\n");
+ goto cleanup;
}
}
/* Create a unicode device name. Allocate a new device number
every time */
- do
+ while (TRUE)
{
- DeviceNumber++;
+ swprintf(DeviceBuffer, L"\\Device\\USBFDO-%lu",
DeviceNumber);
+ RtlInitUnicodeString(&DeviceName, DeviceBuffer);
+
+ Status = IoCreateDevice(DriverObject,
+ sizeof(USBMP_DEVICE_EXTENSION),
+ &DeviceName,
+ FILE_DEVICE_BUS_EXTENDER,
+ 0,
+ FALSE,
+ &fdo);
+ if (Status != STATUS_OBJECT_NAME_COLLISION)
+ break;
+
if (DeviceNumber == 9999)
{
/* Hmm. We don't have a free number. */
if (AlreadyRestarted)
{
- Status = STATUS_UNSUCCESSFUL;
+ Status = STATUS_TOO_MANY_NAMES;
break;
}
/* Start again at DeviceNumber = 0 to find a
free number */
DeviceNumber = 0;
AlreadyRestarted = TRUE;
}
- swprintf(DeviceBuffer, L"\\Device\\USBFDO-%lu",
DeviceNumber);
- RtlInitUnicodeString(&DeviceName, DeviceBuffer);
+ else
+ DeviceNumber++;
+ }
- Status = IoCreateDevice(DriverObject,
- sizeof(USBMP_DEVICE_EXTENSION),
- &DeviceName,
- FILE_DEVICE_BUS_EXTENDER,
- 0,
- FALSE,
- &fdo);
- } while (Status == STATUS_OBJECT_NAME_COLLISION);
-
if (!NT_SUCCESS(Status))
{
- DPRINT("USBMP: IoCreateDevice call failed with status
0x%08lx\n", Status);
- return Status;
+ DPRINT1("USBMP: IoCreateDevice call failed with status
0x%08lx\n", Status);
+ goto cleanup;
}
- // zerofill device extension
+ /* Zerofill device extension */
DeviceExtension = (PUSBMP_DEVICE_EXTENSION)fdo->DeviceExtension;
RtlZeroMemory(DeviceExtension, sizeof(USBMP_DEVICE_EXTENSION));
-
+
/* Create root hub Pdo */
Status = CreateRootHubPdo(DriverObject, fdo,
&DeviceExtension->RootHubPdo);
if (!NT_SUCCESS(Status))
{
- DPRINT("USBMP: CreateRootHubPdo() failed with status
0x%08lx\n", Status);
- IoDeleteDevice(fdo);
- return Status;
+ DPRINT1("USBMP: CreateRootHubPdo() failed with status
0x%08lx\n", Status);
+ goto cleanup;
}
/* Register device interface for controller */
@@ -272,15 +275,13 @@
&DeviceExtension->HcdInterfaceName);
if (!NT_SUCCESS(Status))
{
- DPRINT("USBMP: IoRegisterDeviceInterface() failed with
status 0x%08lx\n", Status);
- IoDeleteDevice(DeviceExtension->RootHubPdo);
- IoDeleteDevice(fdo);
- return Status;
+ DPRINT1("USBMP: IoRegisterDeviceInterface() failed with
status 0x%08lx\n", Status);
+ goto cleanup;
}
DeviceExtension->NextDeviceObject =
IoAttachDeviceToDeviceStack(fdo, pdo);
- // Initialize device extension
+ /* Initialize device extension */
DeviceExtension->IsFDO = TRUE;
DeviceExtension->DeviceNumber = DeviceNumber;
DeviceExtension->PhysicalDeviceObject = pdo;
@@ -288,24 +289,26 @@
DeviceExtension->DriverExtension = DriverExtension;
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
- /* FIXME: do a loop to find an available number */
- swprintf(LinkDeviceBuffer, L"\\??\\HCD%lu", 0);
+ /* Use the same number as the FDO */
+ swprintf(LinkDeviceBuffer, L"\\??\\HCD%lu", DeviceNumber);
+
RtlInitUnicodeString(&LinkDeviceName, LinkDeviceBuffer);
-
Status = IoCreateSymbolicLink(&LinkDeviceName, &DeviceName);
-
if (!NT_SUCCESS(Status))
{
- DPRINT("USBMP: IoCreateSymbolicLink() call failed with
status 0x%08x\n", Status);
- IoDeleteDevice(DeviceExtension->RootHubPdo);
- IoDeleteDevice(fdo);
- return Status;
+ DPRINT1("USBMP: IoCreateSymbolicLink() call failed with
status 0x%08x\n", Status);
+ goto cleanup;
}
-
return STATUS_SUCCESS;
+
+cleanup:
+ if (DeviceExtension && DeviceExtension->RootHubPdo)
+ IoDeleteDevice(DeviceExtension->RootHubPdo);
+ if (fdo)
+ IoDeleteDevice(fdo);
+ return Status;
}
NTSTATUS STDCALL
@@ -428,15 +431,15 @@
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
- // Register in usbcore.sys
+ /* Register in usbcore.sys */
UsbPortInterface.KbdConnectData = &KbdClassInformation;
UsbPortInterface.MouseConnectData = &MouseClassInformation;
-
+
KbdClassInformation.ClassService = NULL;
KbdClassInformation.ClassDeviceObject = NULL;
MouseClassInformation.ClassService = NULL;
MouseClassInformation.ClassDeviceObject = NULL;
-
+
RegisterPortDriver(DriverObject, &UsbPortInterface);
AddDevice_Keyboard(DriverObject, NULL);