[ACPI]
[reactos.git] / reactos / drivers / bus / acpi / main.c
index 3d1170e..c4f2c22 100644 (file)
@@ -6,6 +6,8 @@
 #include <acpi_bus.h>
 #include <acpi_drivers.h>
 
 #include <acpi_bus.h>
 #include <acpi_drivers.h>
 
+#include <acpiioct.h>
+
 #define NDEBUG
 #include <debug.h>
 
 #define NDEBUG
 #include <debug.h>
 
@@ -29,7 +31,9 @@ Bus_AddDevice(
     PDEVICE_OBJECT      deviceObject = NULL;
     PFDO_DEVICE_DATA    deviceData = NULL;
     PWCHAR              deviceName = NULL;
     PDEVICE_OBJECT      deviceObject = NULL;
     PFDO_DEVICE_DATA    deviceData = NULL;
     PWCHAR              deviceName = NULL;
+#ifndef NDEBUG
     ULONG               nameLength;
     ULONG               nameLength;
+#endif
 
     PAGED_CODE ();
 
 
     PAGED_CODE ();
 
@@ -168,32 +172,45 @@ ACPIDispatchDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
 {
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
 {
-    PIO_STACK_LOCATION IrpSp;
-    NTSTATUS Status;
+    PIO_STACK_LOCATION      irpStack;
+    NTSTATUS                status = STATUS_NOT_SUPPORTED;
+    PCOMMON_DEVICE_DATA     commonData;
 
 
-    DPRINT("Called. IRP is at (0x%X)\n", Irp);
-
-    Irp->IoStatus.Information = 0;
+    PAGED_CODE ();
 
 
-    IrpSp  = IoGetCurrentIrpStackLocation(Irp);
-    switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) {
-        default:
-            DPRINT("Unknown IOCTL 0x%X\n", IrpSp->Parameters.DeviceIoControl.IoControlCode);
-            Status = STATUS_NOT_IMPLEMENTED;
-            break;
-  }
+    irpStack = IoGetCurrentIrpStackLocation (Irp);
+    ASSERT (IRP_MJ_DEVICE_CONTROL == irpStack->MajorFunction);
 
 
-    if (Status != STATUS_PENDING) {
-        Irp->IoStatus.Status = Status;
+    commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension;
 
 
-        DPRINT("Completing IRP at 0x%X\n", Irp);
+    Irp->IoStatus.Information = 0;
 
 
-        IoCompleteRequest(Irp, IO_NO_INCREMENT);
-  }
+    if (!commonData->IsFDO)
+    {
+       switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
+       {
+           case IOCTL_ACPI_EVAL_METHOD:
+              status = Bus_PDO_EvalMethod((PPDO_DEVICE_DATA)commonData,
+                                          Irp);
+              break;
+
+           /* TODO: Implement other IOCTLs */
+
+           default:
+              DPRINT1("Unsupported IOCTL: %x\n", irpStack->Parameters.DeviceIoControl.IoControlCode);
+              break;
+       }
+    }
+    else
+       DPRINT1("IOCTL sent to the ACPI FDO! Kill the caller!\n");
 
 
-    DPRINT("Leaving. Status 0x%X\n", Status);
+    if (status != STATUS_PENDING)
+    {
+       Irp->IoStatus.Status = status;
+       IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
 
 
-    return Status;
+    return status;
 }
 
 NTSTATUS
 }
 
 NTSTATUS