CreateRemoteThread 函式 (processthreadsapi.h)
建立線程,該線程會在另一個進程的虛擬位址空間中執行。
使用 CreateRemoteThreadEx 函式來建立線程,以在另一個進程的虛擬位址空間中執行,並選擇性地指定擴充屬性。
語法
HANDLE CreateRemoteThread(
[in] HANDLE hProcess,
[in] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in] LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out] LPDWORD lpThreadId
);
參數
[in] hProcess
要在其中建立線程之進程的句柄。 句柄必須具有 PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_VM_WRITE和 PROCESS_VM_READ 訪問許可權,而且在特定平臺上沒有這些許可權可能會失敗。 如需詳細資訊,請參閱 處理安全性和存取權限。
[in] lpThreadAttributes
SECURITY_ATTRIBUTES 結構的指標,指定新線程的安全性描述元,並判斷子進程是否可以繼承傳回的句柄。 如果 lpThreadAttributes 為 NULL,線程會取得預設的安全性描述元,而且無法繼承句柄。 線程的預設安全性描述元中的訪問控制清單 (ACL) 來自建立者的主要令牌。
Windows XP:線程的預設安全性描述元中的 ACL 來自建立者的主要或模擬令牌。 使用SP2和 Windows Server 2003 的 Windows XP 變更此行為。
[in] dwStackSize
堆疊的初始大小,以位元組為單位。 系統會將此值四捨五入至最接近的頁面。 如果此參數為 0(零),新線程會使用可執行文件的預設大小。 如需詳細資訊,請參閱 線程堆疊大小。
[in] lpStartAddress
線程所要執行之類型之應用程式定義函式的指標 LPTHREAD_START_ROUTINE,並代表遠端進程中線程的起始位址。 函式必須存在於遠端進程中。 如需詳細資訊,請參閱 ThreadProc。
[in] lpParameter
要傳遞至線程函式之變數的指標。
[in] dwCreationFlags
控制線程建立的旗標。
價值 | 意義 |
---|---|
|
線程會在建立後立即執行。 |
|
線程是以暫止狀態建立,而且在呼叫 resumeThread 函式 |
|
dwStackSize 參數會指定堆疊的初始保留大小。 如果未指定此旗標,dwStackSize 指定認可大小。 |
[out] lpThreadId
接收線程標識碼之變數的指標。
如果此參數 NULL,則不會傳回線程標識符。
傳回值
如果函式成功,傳回值就是新線程的句柄。
如果函式失敗,則傳回值 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。
請注意,即使 lpStartAddress 指向數據、程式代碼或無法存取,CreateRemoteThread 仍可能會成功。 如果線程執行時啟動位址無效,就會發生例外狀況,而線程會終止。 線程因無效的啟動位址而終止線程,會以線程進程的錯誤結束處理。 此行為類似於 CreateProcess的異步本質,即使進程參考無效或遺失的動態連結庫 (DLL),也會建立進程。
言論
CreateRemoteThread 函式會導致執行的新線程開始於指定進程的位址空間中。 線程可以存取進程開啟的所有物件。
在 Windows 8 之前,終端機服務會依設計隔離每個終端機會話。 因此,如果目標進程位於與呼叫進程不同的會話中,CreateRemoteThread 會失敗。
新的線程句柄是以新線程的完整存取權所建立。 如果未提供安全性描述元,則句柄可用於任何需要線程物件句柄的函式中。 提供安全性描述元時,會在授與存取權之前,先對句柄的所有後續使用執行存取檢查。 如果存取檢查拒絕存取,要求進程就無法使用句柄來取得線程的存取權。
如果線程是以可執行狀態建立的(也就是未使用 CREATE_SUSPENDED 旗標),線程可以在 CreateThread 傳回之前開始執行,特別是呼叫端收到所建立線程的句柄和標識符之前。
線程會以線程優先順序建立,THREAD_PRIORITY_NORMAL。 使用 GetThreadPriority 和 SetThreadPriority 函式來取得和設定線程的優先順序值。
當線程終止時,線程物件會取得訊號狀態,以符合正在等候對象的線程。
線程物件會保留在系統中,直到線程終止,而且所有句柄都會透過呼叫 closeHandle 關閉。
ExitProcess、ExitThread、CreateThread、CreateRemoteThread 函式,以及啟動的進程(CreateProcess 呼叫的結果)會在進程內彼此串行化。 一次只會在位址空間中發生其中一個事件。 這表示下列限制保留:
- 在進程啟動和 DLL 初始化例程期間,可以建立新的線程,但在進程完成 DLL 初始化之前,它們才會開始執行。
- 進程中只有一個線程可以在 DLL 初始化中,或一次中斷連結例程。
- ExitProcess 在所有線程完成 DLL 初始化或中斷連結例程之後傳回。
- 它會將單個線程應用程式轉換成多線程應用程式。
- 它會變更進程的計時和記憶體配置。
- 這會導致呼叫進程中每個 DLL 的進入點。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2003 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | processthreadsapi.h (包括 Windows Server 2003 上的 Windows.h、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
連結庫 | Kernel32.lib |
DLL | Kernel32.dll |