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.rbuil... ============================================================================== --- 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?rev... ============================================================================== --- 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/ac... ============================================================================== --- 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?rev... ============================================================================== --- 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