首页
社区
课程
招聘
[求助]dump文件显示很诡异 MJ解释下为何重入APC
发表于: 2009-7-20 14:45 34545

[求助]dump文件显示很诡异 MJ解释下为何重入APC

2009-7-20 14:45
34545
收藏
免费 7
支持
分享
最新回复 (117)
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
101
APC重入原因:RP不行,电脑硬件或者系统问题你们可以测试下95楼代码
2009-7-24 01:08
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
102
实机试了一下结束notepad.exe没蓝……
2009-7-24 02:14
0
雪    币: 235
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
103
APC重入,RP有什么关系..
重入,又不是系统版本不同结构体不同
2009-7-24 22:53
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
104
看了下我自己机器的ActiveThread,貌似是会有重复的几率的...主要原因是你读取的东西是可能被别人操作的东西...

用ZwQueryXX方式取thread后逐个插入试试吧
传统点比较好
2009-7-24 22:55
0
雪    币: 235
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
105
看了下代码,很明显有问题.
KernelKillThreadRoutine里面调用PsTerminateSystemThread,
而PsTerminateSystemThread->PspTerminateThreadByPointer->PspExitThread->结束线程前调用线程的APC,然后你的KernelKillThreadRoutine又被执行了.这样循环不就重入了吗.
所以重入的原因在这吧.
2009-7-24 22:59
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
106
换台电脑就不重入了  
2009-7-24 23:00
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
107
不是这样解释的 你还是看看APC吧
2009-7-24 23:01
0
雪    币: 235
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
108
无所谓了.
每个人都得到了自己的答案.
2009-7-24 23:31
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
109
按我的理解,如果没有重复插入APC,那么KeDeliverApc调用KernelKillThreadRoutine时相应KAPC结构已经被从链表上脱链了(因此在KernelKillThreadRoutine中可以直接ExFreePool释放其所占的空间),因此进入KernelKillThreadRoutine后调用PsTerminateSystemThread,线程退出时再调用KeDeliverApc时,ApcStates链表上应该已经没有KernelRoutine为KernelKillThreadRoutine的表项了,就不会重入。而如果重复插入使得链表上有多个KernelRoutine为KernelKillThreadRoutine的表项,当第一个这样的表项被KeDeliverApc取出并调用时,就会导致重入。但似乎也不会无限循环啊,还是说重复插入的表项实在太多使得还没有调用完之前堆栈就爆了?从dump文件中看真是重入了N多回啊……
2009-7-25 01:15
0
雪    币: 8833
活跃值: (2419)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
110
我个人认为 用了ActiveThreadList而不是传统方式导致的

传统方式获得线程插入APC貌似没啥问题~
2009-7-25 03:47
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
111
这个是正确的。

.text:00426160                 mov     ecx, [eax]    // 链表脱钩
.text:00426162                 mov     eax, [eax+4]
.text:00426165                 mov     [eax], ecx
.text:00426167                 mov     [ecx+4], eax
.text:0042616A                 lea     ecx, [ebp+LockHandle] ; LockHandle
.text:0042616D                 mov     byte ptr [edi+2Eh], 0
.text:00426171                 call    ds:__imp_@KeReleaseInStackQueuedSpinLock@4 ; KeReleaseInStackQueuedSpinLock(x)
.text:00426177                 lea     eax, [ebp+var_8]
.text:0042617A                 push    eax
.text:0042617B                 lea     eax, [ebp+var_C]
.text:0042617E                 push    eax
.text:0042617F                 lea     eax, [ebp+var_10]
.text:00426182                 push    eax
.text:00426183                 lea     eax, [ebp+var_4]
.text:00426186                 push    eax
.text:00426187                 push    edi
.text:00426188                 call    [ebp+var_14]     //调用KernelKillThreadRoutine

正常情况是不应该重入的,不过当ActiveThread的值很大或者重复调用KillProcessWithApc就有会重入。

但是把ActiveThread改成很大会有副作用吗,期待牛人解答~
2009-7-25 09:48
0
雪    币: 250
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
112
膜拜
2009-7-25 11:06
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
113
膜拜啊
2009-7-25 15:12
0
雪    币: 306
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
114
膜拜mj
2009-8-1 21:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
115
顶顶顶顶顶顶
2009-8-2 00:57
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
116
mj真是好人。
2009-8-2 20:50
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
117
ExFreePool(ExitApc);  //释放内存,防止内存泄露*/

这句有问题啊
取掉这句
2009-8-3 15:16
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
118
mj is who
2009-9-1 17:02
0
游客
登录 | 注册 方可回帖
返回