C/C++获取指定线程挂起次数
前提:windows系统版本≥6.3
#include <windows.h>
#include <tchar.h>
#include<iostream>
#define UNICODE
#define _UNICODE
typedef LONG KPRIORITY;
typedef enum _THREADINFOCLASS {
ThreadSuspendCount =0x23
}THREADINFOCLASS;
//从NTDLL里定义原型
typedef DWORD(WINAPI* PNtQueryInformationThread) (HANDLE ThreadHandle,
THREADINFOCLASS ThreadInformationClass,
PVOID ThreadInformation,
ULONG ThreadInformationLength,
PULONG ReturnLength);
BOOL QueryThreadSuspendCount(HANDLE Thread,DWORD * SuspendCount) {
BOOL ret = FALSE;
PNtQueryInformationThread NtQueryInformationThread = NULL;
NtQueryInformationThread = (PNtQueryInformationThread)GetProcAddress(LoadLibrary(L"ntdll.dll"), "NtQueryInformationThread");
if (NtQueryInformationThread != NULL) {
DWORD count=0;
ULONG RetLength = 0;
if (NtQueryInformationThread(Thread, ThreadSuspendCount, &count, sizeof(count), &RetLength) == 0) {
ret = true;
*SuspendCount = count;
}
}
return ret;
}
DWORD ThreadA(LPVOID param) {
while (1)
getchar();
}
int main() {
setlocale(LC_ALL, ".utf8");//控制台宽字符打印乱码解决方式
HANDLE ThreadHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadA,NULL,0,NULL);
SuspendThread(ThreadHandle);
SuspendThread(ThreadHandle);
SuspendThread(ThreadHandle);
DWORD SuspendCount =0;
if (QueryThreadSuspendCount(ThreadHandle, &SuspendCount))
{
_tprintf(L"挂起次数:%d\n",SuspendCount);
}
system("pause");
}
总结
可以结合遍历指定进程的线程信息来查看其他进程中线程的挂起计数。