遍历进程线程

typedef struct _CL_PROCESS_THREADINFO
{
LPVOID pvStartAddr; // 线程的起始地址
DWORD dwTid; // 线程Id
WCHAR wszModuleName[MAX_PATH]; // 所属的模块路径

}CL_PROCESS_THREADINFO;

 BOOL CLThread::QueryThreadInfo_By_Pid(__in DWORD dwPid, __out vector<CL_PROCESS_THREADINFO>& vlst)
{
/************************************************************************/
/* 
extern "C" LONG(__stdcall *ZwQueryInformationThread) (
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
) = NULL;


extern "C" LONG(__stdcall *RtlNtStatusToDosError) (
IN  ULONG status) = NULL;

HINSTANCE hNTDLL = ::GetModuleHandle(TEXT("ntdll"));

(FARPROC&)ZwQueryInformationThread =
::GetProcAddress(hNTDLL, "ZwQueryInformationThread");

(FARPROC&)RtlNtStatusToDosError =
::GetProcAddress(hNTDLL, "RtlNtStatusToDosError");


可以直接用
status = ZwQueryInformationThread(thread,
ThreadQuerySetWin32StartAddress,
&startaddr,
sizeof (startaddr),
NULL);

*/
/************************************************************************/
typedef enum _THREADINFOCLASS {
ThreadBasicInformation,
ThreadTimes,
ThreadPriority,
ThreadBasePriority,
ThreadAffinityMask,
ThreadImpersonationToken,
ThreadDescriptorTableEntry,
ThreadEnableAlignmentFaultFixup,
ThreadEventPair_Reusable,
ThreadQuerySetWin32StartAddress,
ThreadZeroTlsCell,
ThreadPerformanceCount,
ThreadAmILastThread,
ThreadIdealProcessor,
ThreadPriorityBoost,
ThreadSetTlsArrayAddress,
ThreadIsIoPending,
ThreadHideFromDebugger,
ThreadBreakOnTermination,
MaxThreadInfoClass
} THREADINFOCLASS;

typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;

typedef struct _THREAD_BASIC_INFORMATION { // Information Class 0
LONG     ExitStatus;
PVOID    TebBaseAddress;
CLIENT_ID ClientId;
LONG AffinityMask;
LONG Priority;
LONG BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;

typedef LONG(__stdcall *ZwQueryInformationThread) (
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

ZwQueryInformationThread pZwQueryInformationThread = NULL;

auto fnSetThreadInfo_By_Tid = [&pZwQueryInformationThread](__in DWORD dwTid, __out CL_PROCESS_THREADINFO& ThreadInfo)
{
THREAD_BASIC_INFORMATION    tbi = { 0 };
PVOID                       pvStartAddr = NULL;
LONG                        lnStatus = NULL;
HANDLE                      hThread = NULL;
HANDLE hProcess = NULL;

hThread = ::OpenThread(THREAD_ALL_ACCESS, FALSE, dwTid);
if (hThread == NULL)
return FALSE;

lnStatus = pZwQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &pvStartAddr, sizeof (pvStartAddr), NULL);
if (lnStatus < 0)
{
CloseHandle(hThread);
return FALSE;
}

ZeroMemory(&ThreadInfo, sizeof(ThreadInfo));
ThreadInfo.dwTid = dwTid;
ThreadInfo.pvStartAddr = pvStartAddr;

lnStatus = pZwQueryInformationThread(hThread, ThreadBasicInformation, &tbi, sizeof (tbi), NULL);
if (lnStatus < 0)
{
CloseHandle(hThread);
return FALSE;
};

hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)tbi.ClientId.UniqueProcess);
if (hProcess == NULL)
{
CloseHandle(hThread);
return FALSE;
};

GetMappedFileName(hProcess, pvStartAddr, ThreadInfo.wszModuleName, MAX_PATH);

CloseHandle(hProcess);
CloseHandle(hThread);
return TRUE;
};

try
{
HMODULE hmNtDLL = ::GetModuleHandleW(L"ntdll.dll");
if (hmNtDLL == NULL)
return FALSE;

pZwQueryInformationThread = (ZwQueryInformationThread)::GetProcAddress(hmNtDLL, "ZwQueryInformationThread");
if (pZwQueryInformationThread == NULL)
return FALSE;

static CL_PROCESS_THREADINFO ThreadInfo;
HANDLE hSnapshot = NULL;
THREADENTRY32 te = { 0 };
te.dwSize = sizeof (te);

hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (Thread32First(hSnapshot, &te))
{
do
{
if (te.th32OwnerProcessID == dwPid && fnSetThreadInfo_By_Tid(te.th32ThreadID, ThreadInfo))
vlst.push_back(ThreadInfo);
} while (Thread32Next(hSnapshot, &te));
};
CloseHandle(hSnapshot);
return vlst.size() != NULL ? TRUE : FALSE;
}
catch (...)
{
CPrintLog::PrintLog_W(_SELF, __LINE__, L"QueryThreadInfo_By_Pid出现异常");
}
return FALSE;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值