利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态

版权声明:专注于计算机网络安全学习 https://blog.csdn.net/u011672712/article/details/51586030


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)

#define STATUS_SUCCESS              ((NTSTATUS) 0x00000000)

#define SystemProcessesAndThreadsInformation    5 // 功能号

#define NTAPI    __stdcall

// 线程状态的枚举常量

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 ,

    MaximumWaitReason

}KWAIT_REASON;

typedef LONG   NTSTATUS;

typedef LONG    KPRIORITY;

typedef struct _CLIENT_ID

{

    DWORD        UniqueProcess;

    DWORD        UniqueThread;

} CLIENT_ID , *PCLIENT_ID;

typedef struct _VM_COUNTERS

{

    SIZE_T        PeakVirtualSize;

    SIZE_T        VirtualSize;

    ULONG         PageFaultCount;

    SIZE_T        PeakWorkingSetSize;

    SIZE_T        WorkingSetSize;

    SIZE_T        QuotaPeakPagedPoolUsage;

    SIZE_T        QuotaPagedPoolUsage;

    SIZE_T        QuotaPeakNonPagedPoolUsage;

    SIZE_T        QuotaNonPagedPoolUsage;

    SIZE_T        PagefileUsage;

    SIZE_T        PeakPagefileUsage;

} VM_COUNTERS;

// 线程信息结构体

typedef struct _SYSTEM_THREAD_INFORMATION

{

    LARGE_INTEGER   KernelTime;

    LARGE_INTEGER   UserTime;

    LARGE_INTEGER   CreateTime;

    ULONG           WaitTime;

    PVOID           StartAddress;

    CLIENT_ID       ClientId;

    KPRIORITY       Priority;

    KPRIORITY       BasePriority;

    ULONG           ContextSwitchCount;

    LONG            State;// 状态,是THREAD_STATE枚举类型中的一个值

    LONG            WaitReason;//等待原因, KWAIT_REASON中的一个值

} SYSTEM_THREAD_INFORMATION , *PSYSTEM_THREAD_INFORMATION;

typedef struct _UNICODE_STRING

{

    USHORT Length;

    USHORT MaximumLength;

    PWSTR  Buffer;

} UNICODE_STRING , *PUNICODE_STRING;

// 进程信息结构体

typedef struct _SYSTEM_PROCESS_INFORMATION

{

    ULONG            NextEntryDelta; // 指向下一个结构体的指针

    ULONG            ThreadCount; // 本进程的总线程数

    ULONG            Reserved1[ 6 ]; // 保留

    LARGE_INTEGER    CreateTime; // 进程的创建时间

    LARGE_INTEGER    UserTime; // 在用户层的使用时间

    LARGE_INTEGER    KernelTime; // 在内核层的使用时间

    UNICODE_STRING   ProcessName; // 进程名

    KPRIORITY        BasePriority; // 

    ULONG            ProcessId; // 进程ID

    ULONG            InheritedFromProcessId;

    ULONG            HandleCount; // 进程的句柄总数

    ULONG            Reserved2[ 2 ]; // 保留

    VM_COUNTERS      VmCounters;

    IO_COUNTERS      IoCounters;

    SYSTEM_THREAD_INFORMATION Threads[ 5 ]; // 子线程信息数组

}SYSTEM_PROCESS_INFORMATION , *PSYSTEM_PROCESS_INFORMATION;

// NtQuerySystemInformation 函数的原型

// 由于该没有导出,所以得自己定义函数的原型

typedef DWORD(WINAPI* PQUERYSYSTEM)(UINT PVOID DWORD , PDWORD);

/*

※※* 函数名 : IsThreadSuspend

※※* 功  能 : 获取线程是被是否被挂起

※※* 返回值 : int 1: 表示线程被挂起 , 0: 表示线程正常。 -1 未知状态

※※* 形  参 : DWORD dwThreadID 要验证的线程的ID

※※* 形  参 : wchar_t * szProcessName 表示线程所在的进程名

*/

int IsThreadSuspend(DWORD dwProcessID , DWORD dwThreadID)

{

    int nRet = 0;

    NTSTATUS Status = 0;

    PQUERYSYSTEM NtQuerySystemInformation = NULL;

    PSYSTEM_PROCESS_INFORMATION pInfo = { 0 };

    // 获取函数地址

    NtQuerySystemInformation = (PQUERYSYSTEM)

        GetProcAddress(LoadLibrary(L"ntdll.dll") , "NtQuerySystemInformation");

    DWORD   dwSize = 0;

    // 获取信息所需的缓冲区大小

    Status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation ,//要获取的信息的类型

                                      NULL , // 用于接收信息的缓冲区

                                      0 ,  // 缓冲区大小

                                      &dwSize

                                      );

    // 申请缓冲区

    char* pBuff = new char[ dwSize ];

    pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuff ;

    if(pInfo == NULL)

        return -1;

    // 再次调用函数, 获取信息

    Status = NtQuerySystemInformation(SystemProcessesAndThreadsInformation ,//要获取的信息的类型

                                      pInfo , // 用于接收信息的缓冲区

                                      dwSize ,  // 缓冲区大小

                                      &dwSize

                                      );

    if(!NT_SUCCESS(Status)) {/*如果函数执行失败*/

        printf("失败\n");

        delete[] pInfo;

        return -1;

    }

    // 遍历结构体,找到对应的进程

    while(1) {

        // 判断是否还有下一个进程

        if(pInfo->NextEntryDelta == 0)

            break;

        // 判断是否找到了ID

        if(pInfo->ProcessId == dwProcessID) {

            // 找到该进程下的对应的线程,也就是遍历所有线程

            for(DWORD i = 0; i < pInfo->ThreadCount ; i++) {

                if(pInfo->Threads[ i ].ClientId.UniqueThread == dwThreadID) { //找到线程 

                    //如果线程被挂起

                    if(pInfo->Threads[ i ].State == StateWait

                       && pInfo->Threads[ i ].WaitReason == Suspended) {

                        nRet = 1;

                        break;

                    }

                }

            }

            break;

        }

        // 迭代到下一个节点

        pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo) + pInfo->NextEntryDelta);

    }

    delete[] pBuff;

    return nRet;

}

/*

※※* 函数名 : IsThreadAlive

※※* 功  能 :  判断线程是否被终止 , 如果终止返回FALSE,如果还活着返回TRUE

※※* 返回值 : BOOL

※※* 形  参 : DWORD dwThreadID 线程ID

*/

BOOL IsThreadAlive(DWORD dwThreadID)

{

    BOOL bRet = FALSE;

    DWORD ExitCode = 0;

    HANDLE hThread = OpenThread(THREAD_QUERY_INFORMATION , FALSE , dwThreadID);

    if(hThread != NULL) {

        if(GetExitCodeThread(hThread , &ExitCode)) {

            if(ExitCode == STILL_ACTIVE)

                bRet = TRUE;

        }

        CloseHandle(hThread);

    }

    return bRet;

}

int main()

{

    BOOL bRET = IsThreadSuspend(2640 , 1111);

    if(bRET) {

        printf(" 2320线程被挂起了!");

    }

jpg转 rar

原文地址:https://www.cnblogs.com/kuangke/p/9524310.html

时间: 2024-07-28 16:42:48

利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态的相关文章

Python的线程&amp;进程&amp;协程[0] -&gt; 线程 -&gt; 多线程锁的使用

锁与信号量 目录 添加线程锁 锁的本质 互斥锁与可重入锁 死锁的产生 锁的上下文管理 信号量与有界信号量 1 添加线程锁 由于多线程对资源的抢占顺序不同,可能会产生冲突,通过添加线程锁来对共有资源进行控制. 1 import atexit 2 from random import randrange 3 from threading import Thread, Lock, current_thread # or currentThread 4 from time import ctime, s

用快照对进程、模块、线程进行遍历(代码段)

前置知识:windows提供了一组快照API,使用前需要包含TlHelp32.h头文件. 1.能够给当前系统中的所有进程拍一个快照,能够获取所有进程的一些基本信息: 2.能够给当前系统中的线程拍一个快照: 3.能够给某一个进程拍模块快照: 4.能够给某一个进程拍堆快照. 一:遍历进程 int _tmain(int argc, _TCHAR* argv[]) { HANDLE hProcessSnap; // 进程快照句柄 HANDLE hProcess; // 进程句柄 PROCESSENTRY

VC中遍历进程并获取进程信息

代码如下: /***************************************************/ /* 函数: 遍历进程信息 /* 参数:进程名称 例如: aaa.exe /* 返回: 无 /* 创建人: 日期 内容 /* 金胖胖 2015年2月26日 新建 /***************************************************/ void CUIConsoleDlg::GetAllProcessInfo(char* szExeFile)

遍历进程链表找到游戏进程

为了省去自己注册窗口类,创建窗口类可以直接使用Windows提供的API 函数:DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, DialogProc); //注册快捷键 F1 RegisterHotKey(hwnd, 1, 0, VK_F1); //注册热键的系统API ,详细定义见MSDN: 获取系统进程常用API: CreateToolhelp32Snapshot() Process32First() Process3

014 进程遍历

进程遍历  ● 枚举 ○ Windows API ○ 数据库 -> 注册表来访问 -> RegQuery函数来获取 ○ ToolHelp库 ○ 兼容性比较好 ○ WIndows 95 就存在 ○ Process Startus库 EnumProcess 函数 PSAPI.DLL ● Tool Help Reference ○ Tool Help Structures ○ 结构体 ○ HEAPENTRY32 1 typedef struct tagHEAPENTRY32 { 2 SIZE_T d

内核模块遍历进程和任务队列保存到proc文件中

实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏). 下面是我的内核模块的实现部分: /************************************************************ * 使用内核模块从当前进程开始先前遍历,知道找到第一个进程为止 * * 并将遍历的结果保存到proc文件中 * ******

C语言实现windows进程遍历

#include <windows.h> #include <tlhelp32.h> //进程快照函数头文件 #include <stdio.h> int main() { int countProcess=0; //当前进程数量计数变量 PROCESSENTRY32 currentProcess; //存放快照进程信息的一个结构体 currentProcess.dwSize = sizeof(currentProcess); //在使用这个结构之前,先设置它的大小 H

C/C++遍历进程和进程ID的小工具

原文:http://blog.csdn.net/qq78442761/article/details/54646010 当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取ID 对于上述功能,我们先介绍几个API 1.CreateToolhelp32Snapshout function 得到进程.模块或者线程的快照 语法如下: [cpp] view plain copy HANDLE WINAPI CreateToolhelp32Snapshot( _In_ DWORD dwFlags, _

Linux下利用ioctl函数获取网卡信息

linux下的ioctl函数原型如下: #include <sys/ioctl.h> int ioctl(int handle, int cmd, [int *argc, int argv]) 函数成功返回0,失败返回-1. 其相关命令接口如下: 类别 Request 说明 数据类型 套 接 口 SIOCATMARK SIOCSPGRP SIOCGPGRP 是否位于带外标记 设置套接口的进程ID 或进程组ID 获取套接口的进程ID 或进程组ID int int int 文 件 FIONBIO