首页
社区
课程
招聘
[求助]结束了的进程为什么还会存在于ActiveProcessLinks中?
发表于: 2010-8-13 19:28 6544

[求助]结束了的进程为什么还会存在于ActiveProcessLinks中?

2010-8-13 19:28
6544
小弟最近的项目通过枚举EPROCESS->ActiveProcessLinks链表来枚举当前进程,结果运行一个程序(如a.exe),枚举打印之,能看到a.exe,结束a.exe之后,再打印,赫然发现还有a.exe!

a.exe只是举个例子,事实上,当我在系统中不断打开、关闭几个应用程序之后,打印出的进程列表会越变越大,其中包括了所有我运行过的、但是现在已经结束了的进程!

请问大家如何解决这个问题?还是说这是windows的固有设计?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
判断ExitTime或者ObjectTable等~~
2010-8-14 01:04
0
雪    币: 156
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
多谢achillis大牛~
经过实验,若是已终结的进程,ExitTime会不为0,而ObjectTable会等于0,如此可以判断。

那么是不是说windows会定期或不定期地清理ActiveProcessLinks链表呢?
2010-8-14 09:03
0
雪    币: 73
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不懂帮顶。。
2010-8-14 09:16
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
所谓进程.也是一个对象而已.

对象存在一个引用计数的问题.

而删除一个进程在PsActiveProcessHead链表中的项是在

进程对象的删除例程里面[PspProcessDelete]执行的.

但是对象管理器只有在这个对象引用计数为0的时候才会去销毁这个对象.

而销毁这个对象的时候才会去调用这个对象的删除例程(如果存在).

所以答案很明显.某些不规范的程序.增加了程序的引用计数.却忘了去减少引用.

导致在进程被PspTerminateProcess结束了之后进程对象本身引用计数还不符合

删除的标准.这就导致僵死进程的出现..(对象没被销毁.对象删除例程没有被调用.链表内自然就显示的有)
2010-8-14 09:31
0
雪    币: 156
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=傷遺忘;846945]所谓进程.也是一个对象而已.

对象存在一个引用计数的问题.

而删除一个进程在PsActiveProcessHead链表中的项是在

进程对象的删除例程里面[PspProcessDelete]执行的.

但是对象管理器只有在这个对象引用计数为0的时候才会去销毁这个对象.

而销...[/QUOTE]

这么分析也有道理,但是我实验的程序中不乏notepad.exe这样的程序啊

启动notepad后:
Process Name: notepad.exe        ID: 1208        Parent Process ID: 1496
Image File Path: \Device\HarddiskVolume1\WINDOWS\system32\notepad.exe
ObjectTable: e1196af0

关闭notepad后:
Process Name: notepad.exe        ID: 1208        Parent Process ID: 1496
Image File Path: \Device\HarddiskVolume1\WINDOWS\system32\notepad.exe
ObjectTable: 0
2010-8-14 09:54
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
不是的..

你误会了.

某些不规范的程序.

并不一定指的是这个程序它自身.

你比如说.随便建立一个驱动工程.

然后在入口内调用如下函数.

VOID        BadFunctionTest()
{
        ULONG        i=0;
        PEPROCESS        ProcessPointer=NULL;
        NTSTATUS        status=STATUS_UNSUCCESSFUL;

        for (;i<65535;i+=4)
        {
                status=PsLookupProcessByProcessId((HANDLE)i,&ProcessPointer);
                if (NT_SUCCESS(status))
                {
                        DbgPrint(" This Process Count Add...\n");
                }
        }

}

就会造成已经创建的进程的进程对象引用计数不平衡.

说简单一点就是说.系统中运行的第三方程序.都有可能设计不够完善.从而造成这种情况出现..
2010-8-14 10:29
0
雪    币: 156
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
是这样啊……这么说不规范的程序就是我的驱动

看了下WDK的文档,在PsLookupProcessByProcessId之后应该ObDereferenceObject一下……都怪自己平时不仔细啊,多谢指点了~
2010-8-14 13:04
0
游客
登录 | 注册 方可回帖
返回
//