VOID NTAPI ButtonWaitThread(PVOID Context) { PIRP Irp = Context; int result; struct acpi_bus_event event; ULONG ButtonEvent; while (ACPI_SUCCESS(result = acpi_bus_receive_event(&event)) && event.type != ACPI_BUTTON_NOTIFY_STATUS); if (!ACPI_SUCCESS(result)) { Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; } else { if (strstr(event.bus_id, "PWRF")) ButtonEvent = SYS_BUTTON_POWER; else if (strstr(event.bus_id, "SLPF")) ButtonEvent = SYS_BUTTON_SLEEP; else ButtonEvent = 0; RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer, &ButtonEvent, sizeof(ButtonEvent)); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = sizeof(ULONG); } IoCompleteRequest(Irp, IO_NO_INCREMENT); }
static ssize_t acpi_system_read_event ( struct file *file, char *buffer, size_t count, loff_t *ppos) { int result = 0; struct acpi_bus_event event; static char str[ACPI_MAX_STRING]; static int chars_remaining = 0; static char *ptr; ACPI_FUNCTION_TRACE("acpi_system_read_event"); if (!chars_remaining) { memset(&event, 0, sizeof(struct acpi_bus_event)); if ((file->f_flags & O_NONBLOCK) && (list_empty(&acpi_bus_event_list))) return_VALUE(-EAGAIN); result = acpi_bus_receive_event(&event); if (result) { return_VALUE(-EIO); } chars_remaining = sprintf(str, "%s %s %08x %08x\n", event.device_class?event.device_class:"<unknown>", event.bus_id?event.bus_id:"<unknown>", event.type, event.data); ptr = str; } if (chars_remaining < count) { count = chars_remaining; } if (copy_to_user(buffer, ptr, count)) return_VALUE(-EFAULT); *ppos += count; chars_remaining -= count; ptr += count; return_VALUE(count); }