共用方式為


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_THREADPROCESS_QUERY_INFORMATIONPROCESS_VM_OPERATIONPROCESS_VM_WRITEPROCESS_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

控制線程建立的旗標。

價值 意義
0
線程會在建立後立即執行。
CREATE_SUSPENDED
0x00000004
線程是以暫止狀態建立,而且在呼叫 resumeThread 函式 之前不會執行。
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
dwStackSize 參數會指定堆疊的初始保留大小。 如果未指定此旗標,dwStackSize 指定認可大小。

[out] lpThreadId

接收線程標識碼之變數的指標。

如果此參數 NULL,則不會傳回線程標識符。

傳回值

如果函式成功,傳回值就是新線程的句柄。

如果函式失敗,則傳回值 NULL。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

請注意,即使 lpStartAddress 指向數據、程式代碼或無法存取,CreateRemoteThread 仍可能會成功。 如果線程執行時啟動位址無效,就會發生例外狀況,而線程會終止。 線程因無效的啟動位址而終止線程,會以線程進程的錯誤結束處理。 此行為類似於 CreateProcess的異步本質,即使進程參考無效或遺失的動態連結庫 (DLL),也會建立進程。

言論

CreateRemoteThread 函式會導致執行的新線程開始於指定進程的位址空間中。 線程可以存取進程開啟的所有物件。

在 Windows 8 之前,終端機服務會依設計隔離每個終端機會話。 因此,如果目標進程位於與呼叫進程不同的會話中,CreateRemoteThread 會失敗。

新的線程句柄是以新線程的完整存取權所建立。 如果未提供安全性描述元,則句柄可用於任何需要線程物件句柄的函式中。 提供安全性描述元時,會在授與存取權之前,先對句柄的所有後續使用執行存取檢查。 如果存取檢查拒絕存取,要求進程就無法使用句柄來取得線程的存取權。

如果線程是以可執行狀態建立的(也就是未使用 CREATE_SUSPENDED 旗標),線程可以在 CreateThread 傳回之前開始執行,特別是呼叫端收到所建立線程的句柄和標識符之前。

線程會以線程優先順序建立,THREAD_PRIORITY_NORMAL。 使用 GetThreadPrioritySetThreadPriority 函式來取得和設定線程的優先順序值。

當線程終止時,線程物件會取得訊號狀態,以符合正在等候對象的線程。

線程物件會保留在系統中,直到線程終止,而且所有句柄都會透過呼叫 closeHandle 關閉。

ExitProcessExitThreadCreateThreadCreateRemoteThread 函式,以及啟動的進程(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

另請參閱

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

進程和線程函式

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

ThreadProc

線程