+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);
+}
+
+