如何判断某个进程假死或是这个进程处于一个什么状态,在线等

wenh7788 2012-04-01 01:08:55
RT
谢谢。

给我的感觉 应该有什么运行中,睡眠中,假死中,等等之类的,求指点,谢谢!
...全文
2729 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2012-04-01
  • 打赏
  • 举报
回复
用SendMessageTimeout或者IsHungAppWindow
http://blog.csdn.net/magictong/article/details/7296250
康斯坦汀 2012-04-01
  • 打赏
  • 举报
回复
关于 “进程处于一个什么状态 ”
NtQuerySystemInformation可以来查询

例子:


////////////////////////////////////////////////////////////////////////
// GetProcessState
//
//获取进程的状态
//返回0,表示发生异常
//返回1,表示进程处于挂起状态
//返回2,表示进程没有被挂起
DWORD GetProcessState(ULONG ulPID)
{
NtQuerySystemInformation pNtQuerySystemInformation;
HMODULE hModule=LoadLibrary("ntdll.dll");
if (hModule==NULL)
{
return 0;
}
pNtQuerySystemInformation=(NtQuerySystemInformation)GetProcAddress(hModule, "NtQuerySystemInformation");
if (pNtQuerySystemInformation==NULL)
{
FreeLibrary(hModule);
return 0;
}

//枚举得到所有进程
ULONG n = 0x100;
PSYSTEM_PROCESSES sp = new SYSTEM_PROCESSES[n];

while (pNtQuerySystemInformation(
5,sp, n*sizeof(SYSTEM_PROCESSES), 0)
== STATUS_INFO_LENGTH_MISMATCH)
{
delete[] sp;
sp = new SYSTEM_PROCESSES[n = n * 2];
}

bool done = false;

//遍历进程列表
for (PSYSTEM_PROCESSES p = sp; !done;
p = PSYSTEM_PROCESSES(PCHAR(p) + p->NextEntryDelta))
{
if (p->ProcessId==ulPID)
{
SYSTEM_THREADS systemThread=p->Threads[0];
if (systemThread.dwState==5 && systemThread.dwWaitReason==5)
{
delete[] sp;
FreeLibrary(hModule);
//进程处于挂起状态
return 1;
}
else
{
delete[] sp;
FreeLibrary(hModule);
//进程没有被挂起
return 2;
}
}
done = p->NextEntryDelta == 0;
}

delete[] sp;
FreeLibrary(hModule);
return 0;
}

////////////////////////////////////////////////////////////////////////
// GetThreadState
//
//获取线程的状态
//返回0,表示发生异常
//返回1,表示线程处于挂起状态
//返回2,表示线程没有被挂起
DWORD GetThreadState(ULONG ulPID,ULONG ulTID)
{
NtQuerySystemInformation pNtQuerySystemInformation;
HMODULE hModule=LoadLibrary("ntdll.dll");
if (hModule==NULL)
{
return 0;
}
pNtQuerySystemInformation=(NtQuerySystemInformation)GetProcAddress(hModule, "NtQuerySystemInformation");
if (pNtQuerySystemInformation==NULL)
{
FreeLibrary(hModule);
return 0;
}

//枚举得到所有进程
ULONG n = 0x100;
PSYSTEM_PROCESSES sp = new SYSTEM_PROCESSES[n];

while (pNtQuerySystemInformation(
5,sp, n*sizeof(SYSTEM_PROCESSES), 0)
== STATUS_INFO_LENGTH_MISMATCH)
{
delete[] sp;
sp = new SYSTEM_PROCESSES[n = n * 2];
}

bool done = false;

//遍历进程列表
for (PSYSTEM_PROCESSES p = sp; !done;
p = PSYSTEM_PROCESSES(PCHAR(p) + p->NextEntryDelta))
{
if (p->ProcessId==ulPID)
{
for(int i=0;i<p->ThreadCount;i++)
{
SYSTEM_THREADS systemThread=p->Threads[i];
if(systemThread.ClientId.TID == ulTID) //找到线程
{
if(systemThread.dwState == StateWait && systemThread.dwWaitReason == Suspended) //线程被挂起
{
delete[] sp;
FreeLibrary(hModule);
return 1;
}
else
{
delete[] sp;
FreeLibrary(hModule);
return 2;
}
}
}
}
done = p->NextEntryDelta == 0;
}

delete[] sp;
FreeLibrary(hModule);
return 0;
}
康斯坦汀 2012-04-01
  • 打赏
  • 举报
回复
至少有两种进程假死:

1)进程不响应了。
这个可以通过未公开函数NtQuerySystemInformation来查询,具体百度一下
NtQuerySystemInformation
也可以通过给其主窗体发消息来判断是否不响应了。
2)进程主窗体被强制关闭了。
还有一种假死通过1)的方法不能判断,因为进程可以响应,只不过主窗体由于某种原因
被强制关闭了,此时只能通过判断主窗体是否正常显示来判断。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧