NtQuerySystemInformation判断线程是否被挂起/判断线程状态
2013-09-23 18:19
477 查看
NtQuerySystemInformation判断线程是否被挂起/判断线程状态
这里采用“功能号5”来枚举系统中所有的进程和线程及其相关信息.
#include "stdafx.h"
#include "Process.h"
//获取进程的状态
//返回0,表示发生异常
//返回1,表示进程处于挂起状态
//返回2,表示进程没有被挂起
DWORD GetProcessState(ULONG ulPID)
{
NtQuerySystemInformation pNtQuerySystemInformation;
HMODULE hModule=LoadLibrary(L"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
;
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;
}
//获取线程的状态
//返回0,表示发生异常
//返回1,表示线程处于挂起状态
//返回2,表示线程没有被挂起
DWORD GetThreadState(ULONG ulPID,ULONG ulTID)
{
NtQuerySystemInformation pNtQuerySystemInformation;
HMODULE hModule=LoadLibrary(L"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
;
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;
}
//Process.h:包含一些进程操作等
//
//
#ifndef _PROCESS_
#define _PROCESS_
#include <stdio.h>
#include <windows.h>
#include <TlHelp32.h>
#include <PSAPI.H>
#pragma comment(lib,"User32.lib")
#pragma comment(lib,"psapi.lib")
#pragma comment(lib,"advapi32.lib")
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
typedef LONG NTSTATUS;
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
//系统模块信息
typedef struct _SYSTEM_MODULE_INFORMATION {
ULONG Reserved[2];
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT Index;
USHORT Unknown;
USHORT LoadCount;
USHORT ModuleNameOffset;
CHAR ImageName[256];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
//存放系统模块列表
typedef struct _SystemModuleList{
ULONG ulCount;
SYSTEM_MODULE_INFORMATION smi[1];
} SYSTEMMODULELIST, *PSYSTEMMODULELIST;
typedef enum _THREAD_STATE{
StateInitialized,
StateReady,
StateRunning,
StateStandby,
StateTerminated,
StateWait,
StateTransition,
StateUnknown
} THREAD_STATE;
typedef enum _KWAIT_REASON {
Executive,
FreePage,
PageIn,
PoolAllocation,
DelayExecution,
Suspended,
UserRequest,
WrExecutive,
WrFreePage,
WrPageIn,
WrPoolAllocation,
WrDelayExecution,
WrSuspended,
WrUserRequest,
WrEventPair,
WrQueue,
WrLpcReceive,
WrLpcReply,
WrVirtualMemory,
WrPageOut,
WrRendezvous,
Spare2,
Spare3,
Spare4,
Spare5,
Spare6,
WrKernel
} KWAIT_REASON;
typedef struct _VM_COUNTERS {
ULONG PeakVirtualSize;
ULONG VirtualSize;
ULONG PageFaultCount;
ULONG PeakWorkingSetSize;
ULONG WorkingSetSize;
ULONG QuotaPeakPagedPoolUsage;
ULONG QuotaPagedPoolUsage;
ULONG QuotaPeakNonPagedPoolUsage;
ULONG QuotaNonPagedPoolUsage;
ULONG PagefileUsage;
ULONG PeakPagefileUsage;
} VM_COUNTERS, *PVM_COUNTERS;
typedef struct _CLIENT_ID
{
ULONG PID;
ULONG TID;
}CLIENT_ID,*PCLIENT_ID;
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
//KPRIORITY Priority;
LONG Priority;
//KPRIORITY BasePriority;
LONG BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE dwState;
//DWORD dwState;
KWAIT_REASON dwWaitReason;
//DWORD dwWaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
typedef struct _SYSTEM_PROCESSES { // Information Class 5
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
//KPRIORITY BasePriority;
LONG BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters; // Windows 2000 only
SYSTEM_THREADS Threads[1];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
//定义NtQuerySystemInformation函数原型
typedef ULONG (WINAPI *NtQuerySystemInformation)(
IN ULONG SysInfoClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG nRet
);
//定义NtQueryInformationThread函数原型
typedef ULONG (WINAPI *NtQueryInformationThread)(
IN HANDLE ThreadHandle,
IN ULONG ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
//获取进程的状态
//返回0,表示发生异常
//返回1,表示进程处于挂起状态
//返回2,表示进程没有被挂起
DWORD GetProcessState(ULONG ulPID);
//获取进程的状态
//返回0,表示发生异常
//返回1,表示线程处于挂起状态
//返回2,表示线程没有被挂起
DWORD GetThreadState(ULONG ulPID,ULONG ulTID);
#endif //_PROCESS_
相关文章推荐
- 利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态
- 利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态
- 子进程system_service创建后while一直判断子进程状态是否died,如果会则zygote也kill自己
- java 获取线程状态 判断线程是否已启动(未测试)
- java中判断线程是否是停止状态
- Java判断线程是否是停止状态的两种方法
- IsHungAppWindow 判断窗体某程序是否挂起
- delphi判断线程是否正在运行
- Android中判断网络连接是否可用及监控网络状态
- Android判断是否在主线程
- 判断窗口是否在最大化状态和最小化状态
- C#判断本地文件是否处于打开状态的方法
- Android 判断当前线程是否是主线程
- jquery判断checkbox是否选中及改变checkbox状态
- 使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断
- Android判断当前是否处于屏幕锁定状态
- Android中判断网络连接是否可用及监控网络状态
- 判断线程池中的线程是否全部执行完毕
- BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作