/*++ Copyright (c) 2000-2001 Microsoft Corporation Module Name: acpisim.c Abstract: ACPI BIOS Simulator / Generic 3rd Party Operation Region Provider IO Device Control Handler module Author(s): Vincent Geglia Michael T. Murphy Chris Burgess Environment: Kernel mode Notes: Revision History: --*/ // // General includes // #include "oprghdlr.h" #include "acpiioct.h" // // Specific includes // #include "asimlib.h" #include "acpisim.h" // // Globals // PVOID g_OpRegionSharedMemory = 0; PVOID g_OperationRegionObject = 0; // // Private function prototypes // NTSTATUS EXPORT AcpisimOpRegionHandler ( ULONG AccessType, PVOID OperationRegionObject, ULONG Address, ULONG Size, PULONG Data, ULONG_PTR Context, PACPI_OP_REGION_CALLBACK CompletionHandler, PVOID CompletionContext ); // // Code // NTSTATUS AcpisimRegisterOpRegionHandler ( IN PDEVICE_OBJECT DeviceObject ) /*++ Routine Description: This routine is called to register our operation region handler. Arguments: DeviceObject - pointer to the device object the IRP pertains to Return Value: STATUS_SUCCESS, if successful --*/ { NTSTATUS status = STATUS_UNSUCCESSFUL; g_OpRegionSharedMemory = ExAllocatePoolWithTag (NonPagedPool, OPREGION_SIZE, ACPISIM_POOL_TAG); status = RegisterOpRegionHandler (AcpisimLibGetNextDevice (DeviceObject), ACPI_OPREGION_ACCESS_AS_COOKED, ACPISIM_OPREGION_TYPE, (PACPI_OP_REGION_HANDLER) AcpisimOpRegionHandler, (PVOID) ACPISIM_TAG, 0, &g_OperationRegionObject); return status; } NTSTATUS AcpisimUnRegisterOpRegionHandler ( IN PDEVICE_OBJECT DeviceObject ) /*++ Routine Description: This routine is called to unregister our operation region handler. Arguments: DeviceObject - pointer to the device object the IRP pertains to Return Value: STATUS_SUCCESS, if successful --*/ { NTSTATUS status = STATUS_UNSUCCESSFUL; status = DeRegisterOpRegionHandler (AcpisimLibGetNextDevice (DeviceObject), g_OperationRegionObject); ExFreePool (g_OpRegionSharedMemory); return status; } NTSTATUS EXPORT AcpisimOpRegionHandler ( ULONG AccessType, PVOID OperationRegionObject, ULONG Address, ULONG Size, PULONG Data, ULONG_PTR Context, PACPI_OP_REGION_CALLBACK CompletionHandler, PVOID CompletionContext ) /*++ Routine Description: This routine is called when ASL touches the op region. Arguments: AccessType - Indicates whether it is a read or write. OperationRegionObject - A pointer to our op region Address - Offset into the op region for which the access occurred Size - Number of bytes of the access Data - Data being written, or location to store data being read Context - A user definable context (in this case, device extension) CompletionHandler - internal, not used CompletionContext - internal, not used Return Value: STATUS_SUCCESS, if successful --*/ { NTSTATUS status = STATUS_UNSUCCESSFUL; ASSERT (AccessType == ACPI_OPREGION_WRITE || AccessType == ACPI_OPREGION_READ); // // Insert additional handler code here // switch (AccessType) { case ACPI_OPREGION_WRITE: RtlCopyMemory ((PVOID) ((ULONG_PTR) g_OpRegionSharedMemory + Address), Data, Size); status = STATUS_SUCCESS; break; case ACPI_OPREGION_READ: RtlCopyMemory (Data, (PVOID) ((ULONG_PTR) g_OpRegionSharedMemory + Address), Size); status = STATUS_SUCCESS; break; default: DBG_PRINT (DBG_ERROR, "Unknown Opregion access type. Ignoring.\n"); status = STATUS_INVALID_DEVICE_REQUEST; break; } return status; } NTSTATUS AcpisimHandleIoctl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) /*++ Routine Description: This is the handler for IOCTL requests. This is the "meat" of the driver so to speak. All of the op-region accesses from user mode are handled here. The implementer should perform the action and return an appropriate status, or return STATUS_UNSUPPORTED if the IOCTL is unrecognized. Arguments: DeviceObject - pointer to the device object the IRP pertains to Irp - pointer to the IRP Return Value: result of IRP processing --*/ { return STATUS_NOT_SUPPORTED; }