#define IOCTL_WIRELESS_BUTTON_GET_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WIRELESS_BUTTON_SET_MODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) typedef struct _WIRELESS_BUTTON_MODE BOOLEAN SoftwareControlled; // TRUE = software control, FALSE = hardware toggle BOOLEAN LedEnabled; WIRELESS_BUTTON_MODE;
switch (IoControlCode) case IOCTL_WIRELESS_BUTTON_GET_STATE: BOOLEAN state; WdfWaitLockAcquire(devContext->Lock, NULL); state = devContext->WirelessState; WdfWaitLockRelease(devContext->Lock); status = WdfRequestRetrieveOutputBuffer(Request, sizeof(state), &state, NULL); if (NT_SUCCESS(status)) bytesReturned = sizeof(state); break; case IOCTL_WIRELESS_BUTTON_SET_MODE: WIRELESS_BUTTON_MODE mode; status = WdfRequestRetrieveInputBuffer(Request, sizeof(mode), &mode, NULL); if (NT_SUCCESS(status)) // Set operation mode // Implementation depends on specific hardware bytesReturned = 0; break; default: status = STATUS_INVALID_DEVICE_REQUEST; break;
return status; typedef struct _DEVICE_CONTEXT WDFDEVICE Device; WDFIOTARGET IoTarget; WDFWAITLOCK Lock; WDFTIMER DebounceTimer; BOOLEAN WirelessState; ULONG ButtonPressCount; DEVICE_CONTEXT, *PDEVICE_CONTEXT; WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DEVICE_CONTEXT, GetDeviceContext) amd wireless button driver
private void MonitorWirelessButton()
WDF_TIMER_CONFIG_INIT(&timerConfig, DebounceTimerCallback); timerConfig.AutomaticSerialization = TRUE; // TRUE = software control
// Start debounce timer WdfTimerStart(devContext->DebounceTimer, WDF_REL_TIMEOUT_MS(50));
[WirelessButton_Device.NT.Services] AddService=WirelessButton,0x00000002,WirelessButton_Service FALSE = hardware toggle BOOLEAN LedEnabled
[Standard.NTamd64] %WirelessButton.DeviceDesc%=WirelessButton_Device, ACPI\AMD0020