/*****************************************************************************
代码架构
*****************************************************************************/
1、 用户通过deviceuicontrol发送请求到驱动
2、 驱动收到用户的request(WDFREQUEST)后, 为该请求设置取消例程,同时创建子请求subrequest,为子请求设置完成例程
3、 驱动的requst的取消例程中,首先结束subrequest,然后以STATUS_CANCELLED状态结束主request
4、 在subrequest的完成例程中,我代码大致如下
VOID EvtXFerCompletionRoutine (...)
{
代码架构
*****************************************************************************/
1、 用户通过deviceuicontrol发送请求到驱动
2、 驱动收到用户的request(WDFREQUEST)后, 为该请求设置取消例程,同时创建子请求subrequest,为子请求设置完成例程
3、 驱动的requst的取消例程中,首先结束subrequest,然后以STATUS_CANCELLED状态结束主request
4、 在subrequest的完成例程中,我代码大致如下
VOID EvtXFerCompletionRoutine (...)
{
// 此处在开启vierifier后,系统睡眠,触发int3中断
if ( WdfRequestUnmarkCancelable(pParentRequest) != STATUS_CANCELLED )
{
完成主请求 request
}
// reuse subrequest
}
if ( WdfRequestUnmarkCancelable(pParentRequest) != STATUS_CANCELLED )
{
完成主请求 request
}
// reuse subrequest
}
/*****************************************************************************
问题出现
*****************************************************************************/
代码架构描述清楚了,出现步骤如下
1、 开启程序,使数据开始传输,意味着源源不断的request发送给驱动,驱动又源源不断的产生subrequest
2、 此时,点击使设备睡眠(非长时间不操作后设备休眠)
3、 系统蓝屏
/**************************************************