NTSTATUS EvtDeviceD0Exit( IN WDFDEVICE Device, IN WDF_POWER_DEVICE_STATE TargetState ) { NTSTATUS status = STATUS_SUCCESS; PDEVICE_CONTEXT devCtx = NULL; devCtx = GetDeviceContext(Device); KdPrint((__DRIVER_NAME "Device D0 Exit. Going to %s\n", PowerName(TargetState))); /*Save the state of the LED array if the device is waking up from a D3 power state.*/ if(TargetState == PowerDeviceD3) { status = llGetLightBar(devCtx, devCtx->WdfMemLEDArrayState); if(!NT_SUCCESS(status)) return status; } // Dung viec gui gui cac lenh dang pending qua ong interrupt WdfIoTargetStop(WdfUsbTargetPipeGetIoTarget(devCtx->UsbInterruptPipe), WdfIoTargetLeaveSentIoPending); return status; }
NTSTATUS EvtDeviceD0Entry( IN WDFDEVICE Device, IN WDF_POWER_DEVICE_STATE PreviousState ) { NTSTATUS status = STATUS_SUCCESS; PDEVICE_CONTEXT devCtx = NULL; KdPrint((__DRIVER_NAME "Device D0 Entry. Coming from %s\n", PowerName(PreviousState))); devCtx = GetDeviceContext(Device); // Get device context // Khoi dong Pipes status = WdfIoTargetStart(WdfUsbTargetPipeGetIoTarget(devCtx->UsbInterruptPipe)); if(!NT_SUCCESS(status)) { KdPrint((__DRIVER_NAME "WdfIoTargetStart failed with status 0x%08x\n", status)); return status; } /*Restore the state of the LED array if the device is waking up from a D3 power state.*/ if(PreviousState == PowerDeviceD3) { status = llSetLightBar(devCtx, devCtx->WdfMemLEDArrayState); } return status; }
// 离开D0状态 NTSTATUS DrvClass::PwrD0Exit(IN WDF_POWER_DEVICE_STATE TargetState) { KDBG(DPFLTR_INFO_LEVEL, "[PwrD0Exit] to %s", PowerName(TargetState)); return STATUS_SUCCESS; }
//下面两个Power回调,和WDM中的PnpSetPower类似。 NTSTATUS DrvClass::PwrD0Entry(IN WDF_POWER_DEVICE_STATE PreviousState) { KDBG(DPFLTR_INFO_LEVEL, "[PwrD0Entry] from %s", PowerName(PreviousState)); return STATUS_SUCCESS; }