7 #include <acpi_drivers.h>
21 Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData
,
26 ACPI_OBJECT_LIST ParamList
;
27 PACPI_EVAL_INPUT_BUFFER EvalInputBuff
= Irp
->AssociatedIrp
.SystemBuffer
;
28 ACPI_BUFFER RetBuff
= {ACPI_ALLOCATE_BUFFER
, NULL
};
29 PACPI_EVAL_OUTPUT_BUFFER OutputBuf
;
30 PIO_STACK_LOCATION IrpSp
= IoGetCurrentIrpStackLocation(Irp
);
31 ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER
*SimpleInt
;
32 ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING
*SimpleStr
;
34 if (IrpSp
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(ULONG
))
35 return STATUS_INVALID_PARAMETER
;
37 Signature
= *((PULONG
)Irp
->AssociatedIrp
.SystemBuffer
);
41 case ACPI_EVAL_INPUT_BUFFER_SIGNATURE
:
42 if (IrpSp
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(ACPI_EVAL_INPUT_BUFFER
))
43 return STATUS_INVALID_PARAMETER
;
48 case ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE
:
49 SimpleInt
= Irp
->AssociatedIrp
.SystemBuffer
;
51 if (IrpSp
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER
))
52 return STATUS_INVALID_PARAMETER
;
56 ParamList
.Pointer
= ExAllocatePool(NonPagedPool
, sizeof(ACPI_OBJECT
));
57 if (!ParamList
.Pointer
) return STATUS_INSUFFICIENT_RESOURCES
;
59 ParamList
.Pointer
[0].Type
= ACPI_TYPE_INTEGER
;
60 ParamList
.Pointer
[0].Integer
.Value
= SimpleInt
->IntegerArgument
;
63 case ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_SIGNATURE
:
64 SimpleStr
= Irp
->AssociatedIrp
.SystemBuffer
;
66 if (IrpSp
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING
))
67 return STATUS_INVALID_PARAMETER
;
71 ParamList
.Pointer
= ExAllocatePool(NonPagedPool
, sizeof(ACPI_OBJECT
));
72 if (!ParamList
.Pointer
) return STATUS_INSUFFICIENT_RESOURCES
;
74 ParamList
.Pointer
[0].String
.Pointer
= (CHAR
*)SimpleStr
->String
;
75 ParamList
.Pointer
[0].String
.Length
= SimpleStr
->StringLength
;
79 DPRINT1("Unsupported input buffer signature: %d\n", Signature
);
80 return STATUS_NOT_IMPLEMENTED
;
83 Status
= AcpiEvaluateObject(DeviceData
->AcpiHandle
,
84 (CHAR
*)EvalInputBuff
->MethodName
,
88 if (ParamList
.Count
!= 0)
89 ExFreePool(ParamList
.Pointer
);
91 if (ACPI_SUCCESS(Status
))
93 ACPI_OBJECT
*Obj
= RetBuff
.Pointer
;
94 ULONG ExtraParamLength
;
98 case ACPI_TYPE_INTEGER
:
99 ExtraParamLength
= sizeof(ULONG
);
102 case ACPI_TYPE_STRING
:
103 ExtraParamLength
= Obj
->String
.Length
;
106 case ACPI_TYPE_BUFFER
:
107 ExtraParamLength
= Obj
->Buffer
.Length
;
110 case ACPI_TYPE_PACKAGE
:
111 DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
112 return STATUS_UNSUCCESSFUL
;
116 return STATUS_UNSUCCESSFUL
;
119 /* Enough space for a ULONG is always included */
120 if (ExtraParamLength
>= sizeof(ULONG
))
121 ExtraParamLength
-= sizeof(ULONG
);
123 ExtraParamLength
= 0;
125 OutputBuf
= ExAllocatePool(NonPagedPool
, sizeof(ACPI_EVAL_OUTPUT_BUFFER
) +
127 if (!OutputBuf
) return STATUS_INSUFFICIENT_RESOURCES
;
129 OutputBuf
->Signature
= ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE
;
130 OutputBuf
->Length
= ExtraParamLength
+ sizeof(ACPI_METHOD_ARGUMENT
);
131 OutputBuf
->Count
= 1;
135 case ACPI_TYPE_INTEGER
:
136 ACPI_METHOD_SET_ARGUMENT_INTEGER(OutputBuf
->Argument
, Obj
->Integer
.Value
);
139 case ACPI_TYPE_STRING
:
140 ACPI_METHOD_SET_ARGUMENT_STRING(OutputBuf
->Argument
, Obj
->String
.Pointer
);
143 case ACPI_TYPE_BUFFER
:
144 ACPI_METHOD_SET_ARGUMENT_BUFFER(OutputBuf
->Argument
, Obj
->Buffer
.Pointer
, Obj
->Buffer
.Length
);
147 case ACPI_TYPE_PACKAGE
:
148 DPRINT1("ACPI_TYPE_PACKAGE not supported yet!\n");
149 return STATUS_UNSUCCESSFUL
;
153 return STATUS_UNSUCCESSFUL
;
156 if (IrpSp
->Parameters
.DeviceIoControl
.OutputBufferLength
>= sizeof(ACPI_EVAL_OUTPUT_BUFFER
) +
159 RtlCopyMemory(Irp
->AssociatedIrp
.SystemBuffer
, OutputBuf
, sizeof(ACPI_EVAL_OUTPUT_BUFFER
) +
161 Irp
->IoStatus
.Information
= sizeof(ACPI_EVAL_OUTPUT_BUFFER
) + ExtraParamLength
;
162 ExFreePool(OutputBuf
);
163 return STATUS_SUCCESS
;
167 ExFreePool(OutputBuf
);
168 return STATUS_BUFFER_TOO_SMALL
;
173 DPRINT1("Query method %s failed on %p\n", EvalInputBuff
->MethodName
, DeviceData
->AcpiHandle
);
174 return STATUS_UNSUCCESSFUL
;