Patch by Filip Navara/Hervé Poussineau:
- Simplify device number allocation
- Check the case of a NULL Pdo if we're called by a legacy driver
Modified: trunk/reactos/drivers/video/videoprt/dispatch.c
Modified: trunk/reactos/drivers/video/videoprt/videoprt.c

Modified: trunk/reactos/drivers/video/videoprt/dispatch.c
--- trunk/reactos/drivers/video/videoprt/dispatch.c	2005-11-08 08:56:41 UTC (rev 19053)
+++ trunk/reactos/drivers/video/videoprt/dispatch.c	2005-11-08 16:24:58 UTC (rev 19054)
@@ -68,6 +68,8 @@
    IN PDEVICE_OBJECT PhysicalDeviceObject)
 {
    PVIDEO_PORT_DRIVER_EXTENSION DriverExtension;
+   PDEVICE_OBJECT DeviceObject;
+   NTSTATUS Status;
 
    /*
     * Get the initialization data we saved in VideoPortInitialize.
@@ -79,11 +81,20 @@
     * Create adapter device object.
     */
 
-   return IntVideoPortCreateAdapterDeviceObject(
+   Status = IntVideoPortCreateAdapterDeviceObject(
       DriverObject,
       DriverExtension,
       PhysicalDeviceObject,
-      NULL);
+      &DeviceObject);
+   if (!NT_SUCCESS(Status))
+      return Status;
+
+   if (PhysicalDeviceObject == NULL)
+   {
+      /* We will never have a IRP_MJ_PNP/IRP_MN_START_DEVICE Irp */
+      Status = IntVideoPortFindAdapter(DriverObject, DriverExtension, DeviceObject);
+   }
+   return Status;
 }
 
 /*

Modified: trunk/reactos/drivers/video/videoprt/videoprt.c
--- trunk/reactos/drivers/video/videoprt/videoprt.c	2005-11-08 08:56:41 UTC (rev 19053)
+++ trunk/reactos/drivers/video/videoprt/videoprt.c	2005-11-08 16:24:58 UTC (rev 19054)
@@ -27,6 +27,7 @@
 
 ULONG CsrssInitialized = FALSE;
 PKPROCESS Csrss = NULL;
+ULONG VideoPortDeviceNumber = 0;
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
@@ -128,41 +129,6 @@
    ((PMINIPORT_DPC_ROUTINE)SystemArgument1)(HwDeviceExtension, SystemArgument2);
 }
 
-ULONG NTAPI
-IntVideoPortAllocateDeviceNumber(VOID)
-{
-   NTSTATUS Status;
-   ULONG DeviceNumber;
-   WCHAR SymlinkBuffer[20];
-   UNICODE_STRING SymlinkName;
-
-   for (DeviceNumber = 0;;)
-   {
-      OBJECT_ATTRIBUTES Obj;
-      HANDLE ObjHandle;
-
-      swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
-      RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
-      InitializeObjectAttributes(&Obj, &SymlinkName, 0, NULL, NULL);
-      Status = ZwOpenSymbolicLinkObject(&ObjHandle, GENERIC_READ, &Obj);
-      if (NT_SUCCESS(Status))
-      {
-         ZwClose(ObjHandle);
-         DeviceNumber++;
-         continue;
-      }
-      else if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
-         break;
-      else
-      {
-         DPRINT1("ZwOpenSymbolicLinkObject() returned unexpected status: 0x%08lx\n", Status);
-         return 0xFFFFFFFF;
-      }
-   }
-
-   return DeviceNumber;
-}
-
 NTSTATUS NTAPI
 IntVideoPortCreateAdapterDeviceObject(
    IN PDRIVER_OBJECT DriverObject,
@@ -186,7 +152,7 @@
     * object names and symlinks.
     */
 
-   DeviceNumber = IntVideoPortAllocateDeviceNumber();
+   DeviceNumber = VideoPortDeviceNumber++;
    if (DeviceNumber == 0xFFFFFFFF)
    {
       DPRINT("Can't find free device number\n");