Author: cgutman
Date: Thu Mar 25 00:13:51 2010
New Revision: 46413
URL:
http://svn.reactos.org/svn/reactos?rev=46413&view=rev
Log:
[ACPI]
- Fix a warning
- Implement some IOCTL_ACPI_EVAL_METHOD handling (no input parameters are supported yet
but it should be enough for what cmbatt needs it to do)
Added:
trunk/reactos/drivers/bus/acpi/eval.c (with props)
Modified:
trunk/reactos/drivers/bus/acpi/acpi.rbuild
trunk/reactos/drivers/bus/acpi/include/acpisys.h
trunk/reactos/drivers/bus/acpi/main.c
Modified: trunk/reactos/drivers/bus/acpi/acpi.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/acpi.rbui…
==============================================================================
--- trunk/reactos/drivers/bus/acpi/acpi.rbuild [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/acpi.rbuild [iso-8859-1] Thu Mar 25 00:13:51 2010
@@ -26,6 +26,7 @@
</directory>
<file>osl.c</file>
<file>acpienum.c</file>
+ <file>eval.c</file>
<file>interface.c</file>
<file>pnp.c</file>
<file>power.c</file>
Added: trunk/reactos/drivers/bus/acpi/eval.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/eval.c?re…
==============================================================================
--- trunk/reactos/drivers/bus/acpi/eval.c (added)
+++ trunk/reactos/drivers/bus/acpi/eval.c [iso-8859-1] Thu Mar 25 00:13:51 2010
@@ -1,0 +1,142 @@
+#include <ntddk.h>
+
+#include <acpi.h>
+
+#include <acpisys.h>
+#include <acpi_bus.h>
+#include <acpi_drivers.h>
+#include <acpiioct.h>
+
+#include <glue.h>
+#include <accommon.h>
+#include <acobject.h>
+#include <actypes.h>
+
+#include <wdmguid.h>
+#define NDEBUG
+#include <debug.h>
+
+NTSTATUS
+NTAPI
+Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData,
+ PIRP Irp)
+{
+ ULONG Signature;
+ NTSTATUS Status;
+ ACPI_OBJECT_LIST *ParamList;
+ PACPI_EVAL_INPUT_BUFFER EvalInputBuff = Irp->AssociatedIrp.SystemBuffer;
+ ACPI_BUFFER RetBuff = {ACPI_ALLOCATE_BUFFER, NULL};
+ PACPI_EVAL_OUTPUT_BUFFER OutputBuf;
+ PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ULONG))
+ return STATUS_INVALID_PARAMETER;
+
+ Signature = *((PULONG)Irp->AssociatedIrp.SystemBuffer);
+
+ switch (Signature)
+ {
+ case ACPI_EVAL_INPUT_BUFFER_SIGNATURE:
+ if (IrpSp->Parameters.DeviceIoControl.InputBufferLength <
sizeof(ACPI_EVAL_INPUT_BUFFER))
+ return STATUS_INVALID_PARAMETER;
+
+ ParamList = NULL;
+ break;
+
+ /* FIXME: Support input parameters */
+
+ default:
+ DPRINT1("Unsupported input buffer signature: %d\n", Signature);
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ Status = AcpiEvaluateObject(DeviceData->AcpiHandle,
+ (CHAR*)EvalInputBuff->MethodName,
+ ParamList,
+ &RetBuff);
+ if (ACPI_SUCCESS(Status))
+ {
+ ACPI_OBJECT *Obj = RetBuff.Pointer;
+ ULONG ExtraParamLength;
+
+ switch (Obj->Type)
+ {
+ case ACPI_TYPE_INTEGER:
+ ExtraParamLength = sizeof(ULONG);
+ break;
+
+ case ACPI_TYPE_STRING:
+ ExtraParamLength = Obj->String.Length;
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ ExtraParamLength = Obj->Buffer.Length;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
+ return STATUS_UNSUCCESSFUL;
+
+ default:
+ ASSERT(FALSE);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Enough space for a ULONG is always included */
+ if (ExtraParamLength >= sizeof(ULONG))
+ ExtraParamLength -= sizeof(ULONG);
+ else
+ ExtraParamLength = 0;
+
+ OutputBuf = ExAllocatePool(NonPagedPool, sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
+ ExtraParamLength);
+ if (!OutputBuf) return STATUS_INSUFFICIENT_RESOURCES;
+
+ OutputBuf->Signature = ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE;
+ OutputBuf->Length = ExtraParamLength + sizeof(ACPI_METHOD_ARGUMENT);
+ OutputBuf->Count = 1;
+
+ switch (Obj->Type)
+ {
+ case ACPI_TYPE_INTEGER:
+ ACPI_METHOD_SET_ARGUMENT_INTEGER(OutputBuf->Argument,
Obj->Integer.Value);
+ break;
+
+ case ACPI_TYPE_STRING:
+ ACPI_METHOD_SET_ARGUMENT_STRING(OutputBuf->Argument,
Obj->String.Pointer);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ ACPI_METHOD_SET_ARGUMENT_BUFFER(OutputBuf->Argument,
Obj->Buffer.Pointer, Obj->Buffer.Length);
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
+ return STATUS_UNSUCCESSFUL;
+
+ default:
+ ASSERT(FALSE);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ if (IrpSp->Parameters.DeviceIoControl.OutputBufferLength >=
sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
+ ExtraParamLength)
+ {
+ RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, OutputBuf,
sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
+ ExtraParamLength);
+ Irp->IoStatus.Information = sizeof(ACPI_EVAL_OUTPUT_BUFFER) +
ExtraParamLength;
+ ExFreePool(OutputBuf);
+ return STATUS_SUCCESS;
+ }
+ else
+ {
+ ExFreePool(OutputBuf);
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+ }
+ else
+ {
+ DPRINT1("Query method %s failed on %p\n", EvalInputBuff->MethodName,
DeviceData->AcpiHandle);
+ return STATUS_UNSUCCESSFUL;
+ }
+}
Propchange: trunk/reactos/drivers/bus/acpi/eval.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/drivers/bus/acpi/include/acpisys.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/include/a…
==============================================================================
--- trunk/reactos/drivers/bus/acpi/include/acpisys.h [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/include/acpisys.h [iso-8859-1] Thu Mar 25 00:13:51 2010
@@ -92,6 +92,11 @@
NTSTATUS
NTAPI
+Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData,
+ PIRP Irp);
+
+NTSTATUS
+NTAPI
Bus_CreateClose (
PDEVICE_OBJECT DeviceObject,
PIRP Irp
Modified: trunk/reactos/drivers/bus/acpi/main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/bus/acpi/main.c?re…
==============================================================================
--- trunk/reactos/drivers/bus/acpi/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/bus/acpi/main.c [iso-8859-1] Thu Mar 25 00:13:51 2010
@@ -5,6 +5,8 @@
#include <acpi_bus.h>
#include <acpi_drivers.h>
+
+#include <acpiioct.h>
#define NDEBUG
#include <debug.h>
@@ -29,7 +31,9 @@
PDEVICE_OBJECT deviceObject = NULL;
PFDO_DEVICE_DATA deviceData = NULL;
PWCHAR deviceName = NULL;
+#ifndef NDEBUG
ULONG nameLength;
+#endif
PAGED_CODE ();
@@ -168,32 +172,45 @@
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- PIO_STACK_LOCATION IrpSp;
- NTSTATUS Status;
-
- DPRINT("Called. IRP is at (0x%X)\n", Irp);
+ PIO_STACK_LOCATION irpStack;
+ NTSTATUS status = STATUS_NOT_SUPPORTED;
+ PCOMMON_DEVICE_DATA commonData;
+
+ PAGED_CODE ();
+
+ irpStack = IoGetCurrentIrpStackLocation (Irp);
+ ASSERT (IRP_MJ_DEVICE_CONTROL == irpStack->MajorFunction);
+
+ commonData = (PCOMMON_DEVICE_DATA) DeviceObject->DeviceExtension;
Irp->IoStatus.Information = 0;
- IrpSp = IoGetCurrentIrpStackLocation(Irp);
- switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) {
- default:
- DPRINT("Unknown IOCTL 0x%X\n",
IrpSp->Parameters.DeviceIoControl.IoControlCode);
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
-
- if (Status != STATUS_PENDING) {
- Irp->IoStatus.Status = Status;
-
- DPRINT("Completing IRP at 0x%X\n", Irp);
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
-
- DPRINT("Leaving. Status 0x%X\n", Status);
-
- return Status;
+ 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");
+
+ if (status != STATUS_PENDING)
+ {
+ Irp->IoStatus.Status = status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ return status;
}
NTSTATUS