[ros-diffs] [cgutman] 45773: - Handle the special case of ACPI device, the fixed feature button, which is not given a handle because it is the direct child of the ACPI root device and is not handled by acpi_bus_get_device (see FIXME in that function). Fortunately, this is not a problem for us since we don't need to differentiate between different "features" of each fixed feature button. We can simply enumerate it as "ACPI\FixedButton" based on its NULL handle. - Strange registry corruption bug on QEMU is gone now

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Mar 3 02:40:05 CET 2010


Author: cgutman
Date: Wed Mar  3 02:40:04 2010
New Revision: 45773

URL: http://svn.reactos.org/svn/reactos?rev=45773&view=rev
Log:
 - Handle the special case of ACPI device, the fixed feature button, which is not given a handle because it is the direct child of the ACPI root device and is not handled by acpi_bus_get_device (see FIXME in that function). Fortunately, this is not a problem for us since we don't need to differentiate between different "features" of each fixed feature button. We can simply enumerate it as "ACPI\FixedButton" based on its NULL handle.
 - Strange registry corruption bug on QEMU is gone now

Modified:
    trunk/reactos/drivers/bus/acpi/buspdo.c

Modified: trunk/reactos/drivers/bus/acpi/buspdo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/buspdo.c?rev=45773&r1=45772&r2=45773&view=diff
==============================================================================
--- trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/buspdo.c [iso-8859-1] Wed Mar  3 02:40:04 2010
@@ -394,11 +394,23 @@
     switch (stack->Parameters.QueryId.IdType) {
 
     case BusQueryDeviceID:
-        acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
-
-        length = swprintf(temp,
-                          L"ACPI\\%hs",
-                          Device->pnp.hardware_id);
+        if (DeviceData->AcpiHandle)
+        {
+            acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+            length = swprintf(temp,
+                              L"ACPI\\%hs",
+                              Device->pnp.hardware_id);
+        }
+        else
+        {
+            /* We know it's a fixed feature button because
+             * these are direct children of the ACPI root device
+             * and therefore have no handle
+             */
+            length = swprintf(temp,
+                              L"ACPI\\FixedButton");
+        }
 
         temp[++length] = UNICODE_NULL;
 
@@ -415,15 +427,22 @@
         break;
 
     case BusQueryInstanceID:
-        acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
-
-        if(Device->flags.unique_id)
-            length = swprintf(temp,
-                              L"%hs",
-                              Device->pnp.unique_id);
+        /* See comment in BusQueryDeviceID case */
+        if(DeviceData->AcpiHandle)
+        {
+           acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+           if (Device->flags.unique_id)
+              length = swprintf(temp,
+                                L"%hs",
+                                Device->pnp.unique_id);
+           else
+              /* FIXME: Generate unique id! */
+              length = swprintf(temp, L"%ls", L"0000");
+        }
         else
-            /* FIXME: Generate unique id! */
-            length = swprintf(temp, L"%ls", L"0000");
+           /* FIXME: Generate unique id! */
+           length = swprintf(temp, L"%ls", L"0000");
 
         temp[++length] = UNICODE_NULL;
 
@@ -439,25 +458,39 @@
         break;
 
     case BusQueryHardwareIDs:
-        acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
-
         length = 0;
 
-        length += swprintf(&temp[length],
-                           L"ACPI\\%hs",
-                           Device->pnp.hardware_id);
-        length++;
-
-        length += swprintf(&temp[length],
-                           L"*%hs",
-                           Device->pnp.hardware_id);
-        length++;
-
-        temp[length] = UNICODE_NULL;
-
-        length++;
-
-        temp[length] = UNICODE_NULL;
+        /* See comment in BusQueryDeviceID case */
+        if (DeviceData->AcpiHandle)
+        {
+            acpi_bus_get_device(DeviceData->AcpiHandle, &Device);
+
+            length += swprintf(&temp[length],
+                               L"ACPI\\%hs",
+                               Device->pnp.hardware_id);
+            length++;
+
+            length += swprintf(&temp[length],
+                               L"*%hs",
+                               Device->pnp.hardware_id);
+            length++;
+         }
+         else
+         {
+            length += swprintf(&temp[length],
+                               L"ACPI\\FixedButton");
+            length++;
+
+            length += swprintf(&temp[length],
+                               L"*FixedButton");
+            length++;
+         }
+
+         temp[length] = UNICODE_NULL;
+
+         length++;
+
+         temp[length] = UNICODE_NULL;
 
         buffer = ExAllocatePoolWithTag (PagedPool, length * sizeof(WCHAR), 'IPCA');
 
@@ -554,6 +587,11 @@
 			Buffer = L"Smart Battery";
 		   else if (wcsstr(DeviceData->HardwareIDs, L"ACPI0003") != 0)
 			Buffer = L"AC Adapter";
+		   /* Simply checking if AcpiHandle is NULL eliminates the need to check
+		    * for the 4 different names that ACPI knows the fixed feature button as internally
+		    */
+		   else if (!DeviceData->AcpiHandle)
+			Buffer = L"ACPI Fixed Feature Button";
 		  else
 			Buffer = L"Other ACPI device";
 




More information about the Ros-diffs mailing list