mirror of https://github.com/reactos/reactos.git
[ACPI] Fix object evaluation (#6302)
CORE-17256 - Implement support for complex input buffers. This will enable the IDE driver with some hack to execute the _STM (channel timing settings) control method. - Fix a memory leak. - Fix returned status code. - Correctly calculate the output buffer size. - Improve buffer validation. - Implement support for async control requests. - Implement local reference conversion. - Implement support for subpackage argument conversion. - Place some code into INIT section.
This commit is contained in:
parent
1538712c0b
commit
5070e8960a
File diff suppressed because it is too large
Load Diff
|
@ -73,6 +73,13 @@ typedef struct _FDO_DEVICE_DATA
|
|||
|
||||
} FDO_DEVICE_DATA, *PFDO_DEVICE_DATA;
|
||||
|
||||
typedef struct _EVAL_WORKITEM_DATA
|
||||
{
|
||||
PPDO_DEVICE_DATA DeviceData;
|
||||
PIRP Irp;
|
||||
WORK_QUEUE_ITEM WorkQueueItem;
|
||||
} EVAL_WORKITEM_DATA, *PEVAL_WORKITEM_DATA;
|
||||
|
||||
#define FDO_FROM_PDO(pdoData) \
|
||||
((PFDO_DEVICE_DATA) (pdoData)->ParentFdo->DeviceExtension)
|
||||
|
||||
|
@ -93,10 +100,15 @@ NTSTATUS
|
|||
ACPIEnumerateDevices(
|
||||
PFDO_DEVICE_DATA DeviceExtension);
|
||||
|
||||
CODE_SEG("PAGE")
|
||||
WORKER_THREAD_ROUTINE Bus_PDO_EvalMethodWorker;
|
||||
|
||||
CODE_SEG("PAGE")
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
Bus_PDO_EvalMethod(PPDO_DEVICE_DATA DeviceData,
|
||||
PIRP Irp);
|
||||
Bus_PDO_EvalMethod(
|
||||
_In_ PPDO_DEVICE_DATA DeviceData,
|
||||
_Inout_ PIRP Irp);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
|
@ -115,13 +127,6 @@ PnPMinorFunctionString (
|
|||
UCHAR MinorFunction
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
Bus_AddDevice(
|
||||
PDRIVER_OBJECT DriverObject,
|
||||
PDEVICE_OBJECT PhysicalDeviceObject
|
||||
);
|
||||
|
||||
NTSTATUS
|
||||
Bus_SendIrpSynchronously (
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
|
|
|
@ -5,18 +5,11 @@
|
|||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry (
|
||||
PDRIVER_OBJECT DriverObject,
|
||||
PUNICODE_STRING RegistryPath
|
||||
);
|
||||
CODE_SEG("INIT")
|
||||
DRIVER_INITIALIZE DriverEntry;
|
||||
|
||||
#ifdef ALLOC_PRAGMA
|
||||
#pragma alloc_text (INIT, DriverEntry)
|
||||
#pragma alloc_text (PAGE, Bus_AddDevice)
|
||||
|
||||
#endif
|
||||
CODE_SEG("PAGE")
|
||||
DRIVER_ADD_DEVICE Bus_AddDevice;
|
||||
|
||||
extern struct acpi_device *sleep_button;
|
||||
extern struct acpi_device *power_button;
|
||||
|
@ -26,6 +19,7 @@ LPWSTR ProcessorIdString = NULL;
|
|||
LPWSTR ProcessorNameString = NULL;
|
||||
|
||||
|
||||
CODE_SEG("PAGE")
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
Bus_AddDevice(
|
||||
|
@ -234,8 +228,6 @@ ACPIDispatchDeviceControl(
|
|||
ULONG Caps = 0;
|
||||
HANDLE ThreadHandle;
|
||||
|
||||
PAGED_CODE ();
|
||||
|
||||
irpStack = IoGetCurrentIrpStackLocation (Irp);
|
||||
ASSERT (IRP_MJ_DEVICE_CONTROL == irpStack->MajorFunction);
|
||||
|
||||
|
@ -247,10 +239,41 @@ ACPIDispatchDeviceControl(
|
|||
{
|
||||
switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
|
||||
{
|
||||
case IOCTL_ACPI_ASYNC_EVAL_METHOD:
|
||||
{
|
||||
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
|
||||
|
||||
if (KeGetCurrentIrql() == DISPATCH_LEVEL)
|
||||
{
|
||||
PEVAL_WORKITEM_DATA workItemData;
|
||||
|
||||
workItemData = ExAllocatePoolUninitialized(NonPagedPool,
|
||||
sizeof(*workItemData),
|
||||
'ipcA');
|
||||
if (!workItemData)
|
||||
{
|
||||
status = STATUS_INSUFFICIENT_RESOURCES;
|
||||
break;
|
||||
}
|
||||
workItemData->Irp = Irp;
|
||||
workItemData->DeviceData = (PPDO_DEVICE_DATA)commonData;
|
||||
|
||||
ExInitializeWorkItem(&workItemData->WorkQueueItem,
|
||||
Bus_PDO_EvalMethodWorker,
|
||||
workItemData);
|
||||
ExQueueWorkItem(&workItemData->WorkQueueItem, DelayedWorkQueue);
|
||||
|
||||
status = STATUS_PENDING;
|
||||
break;
|
||||
}
|
||||
__fallthrough;
|
||||
}
|
||||
case IOCTL_ACPI_EVAL_METHOD:
|
||||
{
|
||||
status = Bus_PDO_EvalMethod((PPDO_DEVICE_DATA)commonData,
|
||||
Irp);
|
||||
break;
|
||||
}
|
||||
|
||||
case IOCTL_GET_SYS_BUTTON_CAPS:
|
||||
if (irpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG))
|
||||
|
@ -336,6 +359,7 @@ ACPIDispatchDeviceControl(
|
|||
}
|
||||
|
||||
static
|
||||
CODE_SEG("INIT")
|
||||
NTSTATUS
|
||||
AcpiRegOpenKey(IN HANDLE ParentKeyHandle,
|
||||
IN LPCWSTR KeyName,
|
||||
|
@ -359,6 +383,7 @@ AcpiRegOpenKey(IN HANDLE ParentKeyHandle,
|
|||
}
|
||||
|
||||
static
|
||||
CODE_SEG("INIT")
|
||||
NTSTATUS
|
||||
AcpiRegQueryValue(IN HANDLE KeyHandle,
|
||||
IN LPWSTR ValueName,
|
||||
|
@ -449,6 +474,7 @@ AcpiRegQueryValue(IN HANDLE KeyHandle,
|
|||
}
|
||||
|
||||
static
|
||||
CODE_SEG("INIT")
|
||||
NTSTATUS
|
||||
GetProcessorInformation(VOID)
|
||||
{
|
||||
|
@ -682,6 +708,7 @@ done:
|
|||
return Status;
|
||||
}
|
||||
|
||||
CODE_SEG("INIT")
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry (
|
||||
|
|
|
@ -15,5 +15,6 @@
|
|||
#include <glue.h>
|
||||
#include <wdmguid.h>
|
||||
#include <acpiioct.h>
|
||||
#include <ntintsafe.h>
|
||||
|
||||
#endif /* _ACPI_PCH_ */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,6 +2,7 @@
|
|||
include_directories(${REACTOS_SOURCE_DIR}/drivers/bus/acpi/acpica/include)
|
||||
|
||||
list(APPEND SOURCE
|
||||
Bus_PDO_EvalMethod.c
|
||||
Bus_PDO_QueryResourceRequirements.c
|
||||
testlist.c)
|
||||
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
#define STANDALONE
|
||||
#include <apitest.h>
|
||||
|
||||
extern void func_Bus_PDO_EvalMethod(void);
|
||||
extern void func_Bus_PDO_QueryResourceRequirements(void);
|
||||
|
||||
const struct test winetest_testlist[] =
|
||||
{
|
||||
{ "Bus_PDO_EvalMethod", func_Bus_PDO_EvalMethod },
|
||||
{ "Bus_PDO_QueryResourceRequirements", func_Bus_PDO_QueryResourceRequirements },
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue