- 公開視頻 ->?鏈接點擊跳轉公開課程
- 博客首頁 ->?鏈接點擊跳轉博客主頁
目錄
Thread
Thread Control
創建 - Create
?執行 - Execute
掛起 - Suspend
恢復 - Resume
終止 - Terminate
?遠程 - Remote
Thread Info
GetCurrentThread/Id
GetThreadContext
CreateToolhelp32Snapshot
Thread
-
什么是線程?
-
線程是CPU進行調度的最小單位,它被包含在進程中。
-
一個進程可以并發多條線程,每條線程分別執行不同的任務。
-
每條線程都擁有自己的一套寄存器以及堆棧信息,并且線程可以同時共享同一進程中的數據以及代碼資源。
-
-
線程與進程的關系?
-
進程
-
擁有獨立的內存空間。
-
擁有獨立的執行環境。
-
進程間通信需要特殊機制。
-
-
線程
-
線程是進程的一部分,共享相同的內存空間。
-
每條線程都有自己獨立的執行環境。
-
線程間可以直接讀寫進程中的數據資源等。
-
-
關系
-
進程是操作系統進程資源分配以及調度的基本單位。
-
線程作為進程的一部分,是進程內部的執行單位,一個進程至少包含一個線程,即主線程。
-
-
Thread Control
創建 - Create
-
線程是通過CreateThread來創建的,該API會為線程分配必要的資源并返回一個內核對象句柄。
-
創建線程是可以通過參數指定線程的屬性,線程運行狀態(創建運行線程 、創建掛起線程),以及堆棧大小。
-
CreateThread
-
WaitForSingleObject
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (dwCount <= 10){std::cout << " WorkThread " << dwCount++ << std::endl;Sleep(1000);}std::cout << "WorkThread Exit" << std::endl;return 0;
}int main()
{DWORD dwTid = 0;HANDLE hThread = CreateThread(NULL,0,WorkThread,NULL,0,&dwTid);if (hThread == NULL) return 0;DWORD dwTime = WaitForSingleObject(hThread, INFINITE);std::cout << dwTime << std::endl;return 0;
}#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (dwCount <= 10){std::cout << " WorkThread " << (DWORD)lp << "\t" << dwCount++ << std::endl;Sleep(1000);}std::cout << "WorkThread " << (DWORD)lp << "\t" << " Exit " << std::endl;return 0;
}int main()
{HANDLE hThread[3] = { 0 };hThread[0] = CreateThread(NULL, 0, WorkThread, (LPVOID)1, 0, NULL);hThread[1] = CreateThread(NULL, 0, WorkThread, (LPVOID)2, 0, NULL);hThread[2] = CreateThread(NULL, 0, WorkThread, (LPVOID)3, 0, NULL);DWORD dwTime = WaitForMultipleObjects(3, hThread, TRUE, -1);return 0;
}
?執行 - Execute
-
使用CreateThread創建線程時,當參數不指定CREATE_SUSPENDED時,線程會進去就緒等待調度。
-
指定CREATE_SUSPENDED時,線程會進入掛起狀態,需要使用ResumeThread恢復線程運行狀態。
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{while (1){std::cout << "WorkThread" << std::endl;Sleep(1000);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, CREATE_SUSPENDED, NULL);system("pause");ResumeThread(hThread);system("pause");return 0;
}
掛起 - Suspend
- SuspendThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (1){std::cout << dwCount++ << std::endl;Sleep(500);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;system("pause");SuspendThread(hThread);system("pause");ResumeThread(hThread);system("pause");return 0;
}
恢復 - Resume
- ResumeThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (1){std::cout << dwCount++ << std::endl;Sleep(500);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;system("pause");SuspendThread(hThread);system("pause");ResumeThread(hThread);system("pause");return 0;
}
終止 - Terminate
- TerminateThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{while (1){std::cout << "WorkThread" << std::endl;Sleep(500);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;system("pause");TerminateThread(hThread, 3);WaitForSingleObject(hThread, -1);//0x103 == ACTIVEDWORD dwCode = -1;GetExitCodeThread(hThread, &dwCode);system("pause");CloseHandle(hThread);return 0;
}
- ExitThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (1){std::cout << "WorkThread" << std::endl;Sleep(500);if (dwCount++ >= 5){ExitThread(5);}}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;WaitForSingleObject(hThread, -1);DWORD dwCode = 0;GetExitCodeThread(hThread, &dwCode);CloseHandle(hThread);return 0;
}
?遠程 - Remote
#include <iostream>
#include <Windows.h>int main()
{HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 67780);if (hProcess == INVALID_HANDLE_VALUE) return 0;HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)0x487085,NULL,0,NULL);if (hThread == NULL) return 0;WaitForSingleObject(hThread, -1);CloseHandle(hProcess);CloseHandle(hThread);/*VirtualAllocEx Addr 68 C4 08 01 00 push 108C4h6A 00 push 068 FF FF 1F 00 push 1FFFFFhFF 15 0C A0 51 00 call dword ptr [__imp__OpenProcess@12 (051A00Ch)]C3 ret*/return 0;
}
Thread Info
GetCurrentThread/Id
#include <iostream>
#include <Windows.h>int main()
{printf("Process Handle -> 0x%08x \r\n", GetCurrentProcess());printf("Thread Handle -> 0x%08x \r\n", GetCurrentThread());printf("Process Id -> 0x%08x \r\n", GetCurrentProcessId());printf("Thread Id -> 0x%08x \r\n", GetCurrentThreadId());printf("Thread Id -> 0x%08x \r\n", GetProcessId(GetCurrentProcess()));printf("Thread Id -> 0x%08x \r\n", GetThreadId(GetCurrentThread()));return 0;
}
GetThreadContext
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{std::cout << "WorkThread " << (DWORD)lp << std::endl;while (true){Sleep(1000);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;Sleep(3000);SuspendThread(hThread);CONTEXT context = { 0 };context.ContextFlags = CONTEXT_ALL;GetThreadContext(hThread, &context);ResumeThread(hThread);return 0;
}
CreateToolhelp32Snapshot
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>int main()
{HANDLE hSnapProcess = NULL;HANDLE hSnapThread = NULL;PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(pe32);THREADENTRY32 te32 = { 0 };te32.dwSize = sizeof(te32);// 系統進程快照hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapProcess == INVALID_HANDLE_VALUE) return 0;// 遍歷系統進程if (Process32First(hSnapProcess, &pe32)){do{// 獲取進程標識std::cout << "Process Id -> " << pe32.th32ProcessID << std::endl;// 系統線程快照hSnapThread = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);if (hSnapThread == INVALID_HANDLE_VALUE) return 0;// 遍歷系統線程if (Thread32First(hSnapThread, &te32)){do{// 比較線程進程if (te32.th32OwnerProcessID == pe32.th32ProcessID){std::cout << "\t" << "Thread Id -> " << te32.th32ThreadID << std::endl;}} while (Thread32Next(hSnapThread, &te32));}CloseHandle(hSnapThread);} while (Process32Next(hSnapProcess, &pe32));}CloseHandle(hSnapProcess);return 0;
}