NTSTATUS SetPowerPolicy(__in WDFDEVICE Device) { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings; NTSTATUS status = STATUS_SUCCESS; PAGED_CODE(); // Init the idle policy structure. WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IDLE_CAPS_TYPE); idleSettings.IdleTimeout = 10000; // 10-sec status = WdfDeviceAssignS0IdleSettings(Device, &idleSettings); if (!NT_SUCCESS(status)) { PSDrv_DbgPrint(3, ("WdfDeviceAssignS0IdleSettings failed! (Status = %x)\n", status)); return status; } // Init wait-wake policy structure. WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings); if (!NT_SUCCESS(status)) { PSDrv_DbgPrint(3, ("WdfDeviceAssignSxWakeSettings failed! (Status = %x)\n", status)); return status; } return status; }
static NTSTATUS UsbChief_SetPowerPolicy(IN WDFDEVICE Device) { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings; NTSTATUS Status = STATUS_SUCCESS; PAGED_CODE(); WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleUsbSelectiveSuspend); idleSettings.IdleTimeout = 10000; // 10-sec Status = WdfDeviceAssignS0IdleSettings(Device, &idleSettings); if (!NT_SUCCESS(Status)) { UsbChief_DbgPrint(DEBUG_POWER, ("WdfDeviceSetPowerPolicyS0IdlePolicy failed %!STATUS!\n", Status)); return Status; } WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); Status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings); if (!NT_SUCCESS(Status)) { UsbChief_DbgPrint(DEBUG_POWER, ("WdfDeviceAssignSxWakeSettings failed %!STATUS!\n", Status)); return Status; } return Status; }
NTSTATUS CySetPowerPolicy( __in WDFDEVICE Device ) { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS PowerIdleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS PowerWakeSettings; NTSTATUS NTStatus = STATUS_SUCCESS; PAGED_CODE(); WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&PowerIdleSettings, IdleCanWakeFromS0/*IdleUsbSelectiveSuspend*/); PowerIdleSettings.IdleTimeout = 10000; // 10-sec NTStatus = WdfDeviceAssignS0IdleSettings(Device, &PowerIdleSettings); if ( !NT_SUCCESS(NTStatus)) { CyTraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "WdfDeviceSetPowerPolicyS0IdlePolicy failed %x\n", NTStatus); return NTStatus; } WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&PowerWakeSettings); NTStatus = WdfDeviceAssignSxWakeSettings(Device, &PowerWakeSettings); if (!NT_SUCCESS(NTStatus)) { CyTraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "WdfDeviceAssignSxWakeSettings failed %x\n", NTStatus); return NTStatus; } return NTStatus; }
NTSTATUS PLxSetIdleAndWakeSettings( IN PDEVICE_EXTENSION FdoData ) /*++ Routine Description: Called by EvtDeviceAdd to set the idle and wait-wake policy. Registering this policy causes Power Management Tab to show up in the device manager. By default these options are enabled and the user is provided control to change the settings. Return Value: NTSTATUS - Failure status is returned if the device is not capable of suspending or wait-waking the machine by an external event. Framework checks the capability information reported by the bus driver to decide whether the device is capable of waking the machine. --*/ { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings; NTSTATUS status = STATUS_SUCCESS; TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "--> PLxSetIdleAndWakeSettings"); PAGED_CODE(); // // Init the idle policy structure. // WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleCanWakeFromS0); idleSettings.IdleTimeout = 10000; // 10-sec status = WdfDeviceAssignS0IdleSettings(FdoData->Device, &idleSettings); if ( !NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "DeviceSetPowerPolicyS0IdlePolicy failed %!STATUS!", status); return status; } // // Init wait-wake policy structure. // WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); status = WdfDeviceAssignSxWakeSettings(FdoData->Device, &wakeSettings); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "DeviceAssignSxWakeSettings failed %!STATUS!", status); return status; } TraceEvents(TRACE_LEVEL_INFORMATION, DBG_PNP, "<-- PLxSetIdleAndWakeSettings"); return status; }
// 配置设备驱动的电源管理功能 NTSTATUS DrvClass::InitPowerManagement() { NTSTATUS status = STATUS_SUCCESS; WDF_USB_DEVICE_INFORMATION usbInfo; KDBG(DPFLTR_INFO_LEVEL, "[InitPowerManagement]"); // 获取设备信息 WDF_USB_DEVICE_INFORMATION_INIT(&usbInfo); WdfUsbTargetDeviceRetrieveInformation(m_hUsbDevice, &usbInfo); // USB设备信息以掩码形式被保存在Traits中。 KDBG( DPFLTR_INFO_LEVEL, "Device self powered: %s", usbInfo.Traits & WDF_USB_DEVICE_TRAIT_SELF_POWERED ? "TRUE" : "FALSE"); KDBG( DPFLTR_INFO_LEVEL, "Device remote wake capable: %s", usbInfo.Traits & WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE ? "TRUE" : "FALSE"); KDBG( DPFLTR_INFO_LEVEL, "Device high speed: %s", usbInfo.Traits & WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED ? "TRUE" : "FALSE"); m_bIsDeviceHighSpeed = usbInfo.Traits & WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED; // 设置设备的休眠和远程唤醒功能 if(usbInfo.Traits & WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE) { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings; // 设置设备为闲时休眠。闲时超过10S,自动进入休眠状态。 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleUsbSelectiveSuspend); idleSettings.IdleTimeout = 10000; status = WdfDeviceAssignS0IdleSettings(m_hDevice, &idleSettings); if(!NT_SUCCESS(status)) { KDBG( DPFLTR_ERROR_LEVEL, "WdfDeviceAssignS0IdleSettings failed with status 0x%0.8x!!!", status); return status; } // 设置为可远程唤醒。包含设备自身醒来,已经当PC系统进入休眠后,设备可以将系统唤醒,两个方面。 WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); status = WdfDeviceAssignSxWakeSettings(m_hDevice, &wakeSettings); if(!NT_SUCCESS(status)) { KDBG( DPFLTR_ERROR_LEVEL, "WdfDeviceAssignSxWakeSettings failed with status 0x%0.8x!!!", status); return status; } } return status; }
NTSTATUS OsrFxSetPowerPolicy( _In_ WDFDEVICE Device ) { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings; NTSTATUS status = STATUS_SUCCESS; PAGED_CODE(); // // Init the idle policy structure. // WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleUsbSelectiveSuspend); idleSettings.IdleTimeout = 10000; // 10-sec status = WdfDeviceAssignS0IdleSettings(Device, &idleSettings); if ( !NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "WdfDeviceSetPowerPolicyS0IdlePolicy failed %x\n", status); return status; } // // Init wait-wake policy structure. // WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP, "WdfDeviceAssignSxWakeSettings failed %x\n", status); return status; } return status; }
NTSTATUS InitPowerManagement( IN WDFDEVICE Device, IN PDEVICE_CONTEXT Context) { NTSTATUS status = STATUS_SUCCESS; WDF_USB_DEVICE_INFORMATION usbInfo; KdPrint((__DRIVER_NAME "Device init power management\n")); // Lay thong tin cua thiet bi USB WDF_USB_DEVICE_INFORMATION_INIT(&usbInfo); // init object status = WdfUsbTargetDeviceRetrieveInformation( Context->UsbDevice, &usbInfo); if(!NT_SUCCESS(status)) { KdPrint((__DRIVER_NAME "WdfUsbTargetDeviceRetrieveInformation failed with status 0x%08x\n", status)); return status; } // Xem cac thong tin debug, thiet bi co ho tro self powered, wakeup hay high speed khong? KdPrint((__DRIVER_NAME "Device self powered: %d\n", usbInfo.Traits & WDF_USB_DEVICE_TRAIT_SELF_POWERED ? 1 : 0)); KdPrint((__DRIVER_NAME "Device remote wake capable: %d\n", usbInfo.Traits & WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE ? 1 : 0)); KdPrint((__DRIVER_NAME "Device high speed: %d\n", usbInfo.Traits & WDF_USB_DEVICE_TRAIT_AT_HIGH_SPEED ? 1 : 0)); if(usbInfo.Traits & WDF_USB_DEVICE_TRAIT_REMOTE_WAKE_CAPABLE) { WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS idleSettings; WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS wakeSettings; WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleUsbSelectiveSuspend); idleSettings.IdleTimeout = 10000; status = WdfDeviceAssignS0IdleSettings(Device, &idleSettings); if(!NT_SUCCESS(status)) { KdPrint((__DRIVER_NAME "WdfDeviceAssignS0IdleSettings failed with status 0x%08x\n", status)); return status; } WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); wakeSettings.DxState = PowerDeviceD2; status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings); if(!NT_SUCCESS(status)) { KdPrint((__DRIVER_NAME "WdfDeviceAssignSxWakeSettings failed with status 0x%08x\n", status)); return status; } } return status; }