[ros-diffs] [cgutman] 45872: - Detach the device object from the stack before deleting it - Add a hack that selects the correct display number to use which allows other drivers to take over if one driver's HwFindAdapter fails - This allows ROS to work on non-VESA 2.0 compliant video cards if /NOVESA is specified - NOTE: VGA seems to have regressed quite a bit. The mouse doesn't show up but still works.

cgutman at svn.reactos.org cgutman at svn.reactos.org
Fri Mar 5 17:40:40 CET 2010


Author: cgutman
Date: Fri Mar  5 17:40:40 2010
New Revision: 45872

URL: http://svn.reactos.org/svn/reactos?rev=45872&view=rev
Log:
 - Detach the device object from the stack before deleting it
 - Add a hack that selects the correct display number to use which allows other drivers to take over if one driver's HwFindAdapter fails
 - This allows ROS to work on non-VESA 2.0 compliant video cards if /NOVESA is specified
 - NOTE: VGA seems to have regressed quite a bit. The mouse doesn't show up but still works.

Modified:
    trunk/reactos/drivers/video/videoprt/videoprt.c

Modified: trunk/reactos/drivers/video/videoprt/videoprt.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/video/videoprt/videoprt.c?rev=45872&r1=45871&r2=45872&view=diff
==============================================================================
--- trunk/reactos/drivers/video/videoprt/videoprt.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/video/videoprt/videoprt.c [iso-8859-1] Fri Mar  5 17:40:40 2010
@@ -322,7 +322,6 @@
 }
 
 
-/* FIXME: we have to detach the device object in IntVideoPortFindAdapter if it fails */
 NTSTATUS NTAPI
 IntVideoPortFindAdapter(
    IN PDRIVER_OBJECT DriverObject,
@@ -341,7 +340,7 @@
    WCHAR SymlinkBuffer[20];
    UNICODE_STRING SymlinkName;
    BOOL LegacyDetection = FALSE;
-   ULONG DeviceNumber;
+   ULONG DeviceNumber, DisplayNumber;
 
    DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
    DeviceNumber = DeviceExtension->DeviceNumber;
@@ -423,6 +422,8 @@
          {
             WARN_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status);
             RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+            if (DeviceExtension->NextDeviceObject)
+                IoDetachDevice(DeviceExtension->NextDeviceObject);
             IoDeleteDevice(DeviceObject);
 
             return Status;
@@ -444,6 +445,8 @@
    {
       WARN_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status);
       RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+      if (DeviceExtension->NextDeviceObject)
+          IoDetachDevice(DeviceExtension->NextDeviceObject);
       IoDeleteDevice(DeviceObject);
       return Status;
    }
@@ -458,12 +461,30 @@
    RtlInitUnicodeString(&DeviceName, DeviceBuffer);
 
    /* Create symbolic link "\??\DISPLAYx" */
-   swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1);
-   RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
-   IoCreateSymbolicLink(&SymlinkName, &DeviceName);
+
+   /* HACK: We need this to find the first available display to
+    * use. We can't use the device number because then we could
+    * end up with \Device\Video0 being non-functional because
+    * HwFindAdapter returned an error. \Device\Video1 would be
+    * the correct primary display but it would be set to DISPLAY2
+    * so it would never be used and ROS would bugcheck on boot.
+    * By doing it this way, we ensure that DISPLAY1 is always
+    * functional. Another idea would be letting the IO manager
+    * give our video devices names then getting those names
+    * somehow and creating symbolic links to \Device\VideoX
+    * and \??\DISPLAYX once we know that HwFindAdapter has succeeded.
+    */
+   DisplayNumber = 0;
+   do
+   {
+      DisplayNumber++;
+      swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber);
+      RtlInitUnicodeString(&SymlinkName, SymlinkBuffer);
+   }
+   while (IoCreateSymbolicLink(&SymlinkName, &DeviceName) != STATUS_SUCCESS);
 
    /* Add entry to DEVICEMAP\VIDEO key in registry. */
-   swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber);
+   swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DisplayNumber - 1);
    RtlWriteRegistryValue(
       RTL_REGISTRY_DEVICEMAP,
       L"VIDEO",
@@ -489,6 +510,8 @@
    if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo))
    {
       RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
+      if (DeviceExtension->NextDeviceObject)
+          IoDetachDevice(DeviceExtension->NextDeviceObject);
       IoDeleteDevice(DeviceObject);
       return STATUS_INSUFFICIENT_RESOURCES;
    }
@@ -501,6 +524,8 @@
    {
       if (DeviceExtension->InterruptObject != NULL)
          IoDisconnectInterrupt(DeviceExtension->InterruptObject);
+      if (DeviceExtension->NextDeviceObject)
+          IoDetachDevice(DeviceExtension->NextDeviceObject);
       RtlFreeUnicodeString(&DeviceExtension->RegistryPath);
       IoDeleteDevice(DeviceObject);
       WARN_(VIDEOPRT, "STATUS_INSUFFICIENT_RESOURCES\n");




More information about the Ros-diffs mailing list