15,471
社区成员
发帖
与我相关
我的任务
分享
////////////////////////////////////////////////////////////////////////
// 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;
}