首页
社区
课程
招聘
ExQueueWorkItem 引发的小几率蓝屏
发表于: 2023-4-22 03:16 6589

ExQueueWorkItem 引发的小几率蓝屏

2023-4-22 03:16
6589
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
VOID WINAPI WorkerThreadRoutineCope(_In_ PVOID Parameter)
{
    WORK_CALL_ITEM lpCallItem;
    memcpy(&lpCallItem, Parameter, sizeof(lpCallItem));
    ExFreePool(Parameter);//这个释放内存很关键,如果太快释放那么蓝屏
 
    lpCallItem.Routine(lpCallItem.Context);
 
 
}
void ExWorkItemCode(_In_opt_ PWORKER_THREAD_ROUTINE Routine, _In_opt_ PVOID Context, _In_opt_ WORK_QUEUE_TYPE QueueType)
{
    NT_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
 
    PWORK_CALL_ITEM lpCallQueue = (PWORK_CALL_ITEM)ExAllocatePool(NonPagedPool, sizeof(WORK_CALL_ITEM));
    lpCallQueue->Context = Context;
    lpCallQueue->Routine = Routine;
    ExInitializeWorkItem(&lpCallQueue->Queue, WorkerThreadRoutineCope, lpCallQueue);
    ExQueueWorkItem(&lpCallQueue->Queue, QueueType);
}

如上所述如果回调执行 lpCallItem.Routine 执行的比较慢(慢到什么程度?大概几十毫秒吧)
并且WORK_QUEUE_ITEM 被释放,那么将小概率蓝屏。执行到不可控位置。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 56
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
微软调用ExQueueWorkItem后都会等待事件,这个事件在你的回调里setevent。倒是没见过微软在回调里释放WORK_QUEUE_ITEM的写法。
2023-4-22 10:31
0
雪    币: 2229
活跃值: (3757)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
绿色玩家999 微软调用ExQueueWorkItem后都会等待事件,这个事件在你的回调里setevent。倒是没见过微软在回调里释放WORK_QUEUE_ITEM的写法。[em_79]
是的 看过了  WORK_QUEUE_ITEM 内存会被多次访问 显然是内核没有做这方面的东西,这块内存被占用
如果释放有概率执行二次执行到未知位置,排查原因很麻烦
2023-4-22 22:29
0
雪    币: 56
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
逍遥m 是的 看过了 WORK_QUEUE_ITEM 内存会被多次访问 显然是内核没有做这方面的东西,这块内存被占用 如果释放有概率执行二次执行到未知位置,排查原因很麻烦
微软文档里不推荐我们用这个函数是有原因的
2023-4-22 22:35
0
雪    币: 2229
活跃值: (3757)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
5
绿色玩家999 微软文档里不推荐我们用这个函数是有原因的[em_19]
目前而言没有找到更好替代的函数,主要还是这个函数方便
2023-4-23 00:19
0
雪    币: 3538
活跃值: (4674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不能这样释放,得自己写个垃圾回收机制
2023-4-23 00:40
0
游客
登录 | 注册 方可回帖
返回
//