1. 程式人生 > >17 遠端執行緒

17 遠端執行緒

執行緒
1.執行緒是附屬在程序上的執行實體,是程式碼的執行流程;
2.程式碼必須通過執行緒才能執行;

/*
 *test.c
 */
#include <stdio.h>
#include <windows.h>

void fun()
{
	for (int i = 0; i < 10; i++){
		printf("fun.......\n");
		Sleep(1000);
	}
}

DWORD WINAPI ThreadProc(LPVOID lpThreadParameter)
{
	fun();
	return 0;
}

int main()
{
	HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

	CloseHandle(hThread);

	getchar();
	return 0; 
}

首先我們將test.c編譯生成test.exe,並在ThreadProc執行緒函式處下斷點,記錄ThreadProc該函式在test.exe啟動時的虛擬地址(注意:由於VS2013每次編譯函式的虛擬地址有可能改變,自行百度能查到使它每次編譯產生固定虛擬地址的設定),記錄完不要重新編譯該程式,然後到目錄下啟動該程式。
在這裡插入圖片描述

/*
 *CreateRemoteThread.c
 */
#include <stdio.h>
#include <windows.h>

BOOL MyCreateRemoteThread(DWORD dwProcessID, LPTHREAD_START_ROUTINE  dwProcAddress)
{
	HANDLE hProcess;
	HANDLE hThread;
	DWORD dwThreadID;

	//1.獲取程序控制代碼
	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
	if (hProcess == INVALID_HANDLE_VALUE){
		return FALSE;
	}
	//2.建立遠端執行緒
	hThread = CreateRemoteThread(hProcess, NULL, 0, dwProcAddress, NULL, 0, &dwThreadID);
	if (hProcess == INVALID_HANDLE_VALUE){
		CloseHandle(hProcess);
		return FALSE;
	}
	//3.關閉資源
	CloseHandle(hThread);
	CloseHandle(hProcess);
	return TRUE;
}

int main()
{
	//此處第一個引數為工作管理員檢視的剛才啟動的test.exe的PID
	//第二個地址為上面記錄的該程序中執行緒處理函式的虛擬地址
	MyCreateRemoteThread((DWORD)23508, (LPTHREAD_START_ROUTINE)0x001713F0);
	return 0; 
}

填好連個引數後我們編譯啟動該程式,我們可以看到test.exe又開始繼續執行又列印了10個fun,如下圖:
在這裡插入圖片描述