2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2001-05-01 23:00:05 +00:00
|
|
|
*
|
|
|
|
* PROJECT: ReactOS ACPI bus driver
|
|
|
|
* FILE: acpi/ospm/acpisys.c
|
|
|
|
* PURPOSE: Driver entry
|
|
|
|
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
|
|
|
* UPDATE HISTORY:
|
|
|
|
* 01-05-2001 CSH Created
|
|
|
|
*/
|
2006-01-09 00:41:48 +00:00
|
|
|
#include <acpi.h>
|
2001-05-01 23:00:05 +00:00
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
2006-01-07 01:39:56 +00:00
|
|
|
NTSTATUS
|
2008-11-30 11:16:55 +00:00
|
|
|
NTAPI
|
2006-01-07 01:39:56 +00:00
|
|
|
DriverEntry(
|
|
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
|
|
IN PUNICODE_STRING RegistryPath
|
|
|
|
);
|
|
|
|
|
2001-05-01 23:00:05 +00:00
|
|
|
#ifdef ALLOC_PRAGMA
|
|
|
|
|
2005-05-08 02:16:32 +00:00
|
|
|
// Make the initialization routines discardable, so that they
|
2001-05-01 23:00:05 +00:00
|
|
|
// don't waste space
|
|
|
|
|
|
|
|
#pragma alloc_text(init, DriverEntry)
|
|
|
|
|
|
|
|
#endif /* ALLOC_PRAGMA */
|
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
2008-11-30 11:16:55 +00:00
|
|
|
NTAPI
|
2001-05-01 23:00:05 +00:00
|
|
|
ACPIDispatchDeviceControl(
|
2005-05-08 02:16:32 +00:00
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN PIRP Irp)
|
2001-05-01 23:00:05 +00:00
|
|
|
{
|
|
|
|
PIO_STACK_LOCATION IrpSp;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
DPRINT("Called. IRP is at (0x%X)\n", Irp);
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
2008-11-30 11:16:55 +00:00
|
|
|
NTAPI
|
2001-05-01 23:00:05 +00:00
|
|
|
ACPIPnpControl(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN PIRP Irp)
|
2001-08-23 17:32:04 +00:00
|
|
|
/*
|
|
|
|
* FUNCTION: Handle Plug and Play IRPs
|
|
|
|
* ARGUMENTS:
|
|
|
|
* DeviceObject = Pointer to PDO or FDO
|
|
|
|
* Irp = Pointer to IRP that should be handled
|
|
|
|
* RETURNS:
|
|
|
|
* Status
|
|
|
|
*/
|
2001-05-01 23:00:05 +00:00
|
|
|
{
|
2001-08-23 17:32:04 +00:00
|
|
|
PCOMMON_DEVICE_EXTENSION DeviceExtension;
|
2001-05-01 23:00:05 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
DPRINT("Called\n");
|
|
|
|
|
2001-08-23 17:32:04 +00:00
|
|
|
DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
2001-05-01 23:00:05 +00:00
|
|
|
|
2001-08-23 17:32:04 +00:00
|
|
|
if (DeviceExtension->IsFDO) {
|
|
|
|
Status = FdoPnpControl(DeviceObject, Irp);
|
|
|
|
} else {
|
2004-12-25 00:44:49 +00:00
|
|
|
Status = PdoPnpControl(DeviceObject, Irp);
|
2001-05-01 23:00:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
2008-11-30 11:16:55 +00:00
|
|
|
NTAPI
|
2001-05-01 23:00:05 +00:00
|
|
|
ACPIPowerControl(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN PIRP Irp)
|
|
|
|
{
|
2001-08-23 17:32:04 +00:00
|
|
|
PCOMMON_DEVICE_EXTENSION DeviceExtension;
|
2001-05-01 23:00:05 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
DPRINT("Called\n");
|
|
|
|
|
2001-08-23 17:32:04 +00:00
|
|
|
DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
2001-05-01 23:00:05 +00:00
|
|
|
|
2001-08-23 17:32:04 +00:00
|
|
|
if (DeviceExtension->IsFDO) {
|
|
|
|
Status = FdoPowerControl(DeviceObject, Irp);
|
|
|
|
} else {
|
|
|
|
Status = PdoPowerControl(DeviceObject, Irp);
|
2001-05-01 23:00:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
2008-11-30 11:16:55 +00:00
|
|
|
NTAPI
|
2001-05-01 23:00:05 +00:00
|
|
|
ACPIAddDevice(
|
|
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject)
|
|
|
|
{
|
2001-08-23 17:32:04 +00:00
|
|
|
PFDO_DEVICE_EXTENSION DeviceExtension;
|
2001-05-01 23:00:05 +00:00
|
|
|
PDEVICE_OBJECT Fdo;
|
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
DPRINT("Called\n");
|
|
|
|
|
2005-11-15 16:48:24 +00:00
|
|
|
if (PhysicalDeviceObject == NULL)
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
|
2004-12-27 14:24:00 +00:00
|
|
|
Status = IoCreateDevice(DriverObject,
|
|
|
|
sizeof(FDO_DEVICE_EXTENSION),
|
|
|
|
NULL,
|
|
|
|
FILE_DEVICE_ACPI,
|
|
|
|
FILE_DEVICE_SECURE_OPEN,
|
|
|
|
TRUE,
|
|
|
|
&Fdo);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
2001-05-01 23:00:05 +00:00
|
|
|
DPRINT("IoCreateDevice() failed with status 0x%X\n", Status);
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
2001-08-23 17:32:04 +00:00
|
|
|
DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension;
|
2001-05-01 23:00:05 +00:00
|
|
|
|
|
|
|
DeviceExtension->Pdo = PhysicalDeviceObject;
|
2004-12-25 00:44:49 +00:00
|
|
|
DeviceExtension->Common.IsFDO = TRUE;
|
2001-05-01 23:00:05 +00:00
|
|
|
|
2005-11-15 16:48:24 +00:00
|
|
|
DeviceExtension->Common.Ldo =
|
|
|
|
IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject);
|
2001-05-01 23:00:05 +00:00
|
|
|
|
|
|
|
DeviceExtension->State = dsStopped;
|
|
|
|
|
|
|
|
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
|
|
|
|
|
|
|
|
DPRINT("Done AddDevice\n");
|
|
|
|
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NTSTATUS
|
2008-11-30 11:16:55 +00:00
|
|
|
NTAPI
|
2001-05-01 23:00:05 +00:00
|
|
|
DriverEntry(
|
2001-08-27 01:29:07 +00:00
|
|
|
IN PDRIVER_OBJECT DriverObject,
|
2001-05-01 23:00:05 +00:00
|
|
|
IN PUNICODE_STRING RegistryPath)
|
|
|
|
{
|
2005-05-20 01:10:00 +00:00
|
|
|
DPRINT("Advanced Configuration and Power Interface Bus Driver\n");
|
2001-05-01 23:00:05 +00:00
|
|
|
|
2002-05-05 14:57:45 +00:00
|
|
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH) ACPIDispatchDeviceControl;
|
|
|
|
DriverObject->MajorFunction[IRP_MJ_PNP] = (PDRIVER_DISPATCH) ACPIPnpControl;
|
|
|
|
DriverObject->MajorFunction[IRP_MJ_POWER] = (PDRIVER_DISPATCH) ACPIPowerControl;
|
2001-05-01 23:00:05 +00:00
|
|
|
DriverObject->DriverExtension->AddDevice = ACPIAddDevice;
|
|
|
|
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|