Share via


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) ,線程的預設安全性描述項來自建立者的主要令牌。

Windowsxp: 線程預設安全性描述元中的 ACL 來自建立者的主要或模擬令牌。 此行為隨著 WINDOWS XP SP2 和 Windows Server 2003 而變更。

[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 的呼叫關閉為止。

ExitProcessExitThread、CreateThreadCreateRemoteThread 函式,以及啟動 (的程式,因為 CreateProcess 呼叫) 會在進程內彼此串行化。 一次只會在位址空間中發生其中一個事件。 這表示下列限制保留:

  • 在進程啟動和 DLL 初始化例程期間,可以建立新的線程,但在進程完成 DLL 初始化之前,它們不會開始執行。
  • 進程中只有一個線程可以一次位於 DLL 初始化或中斷連結例程中。
  • ExitProcess 會在所有線程完成 DLL 初始化或中斷連結例程之後傳回。
此函式的常見用法是將線程插入正在偵錯以發出中斷的進程。 不過,不建議使用此用法,因為額外的線程對偵錯應用程式的人造成混淆,而且使用這項技術會有數個副作用:
  • 它會將單個線程應用程式轉換成多線程應用程式。
  • 它會變更進程的計時和記憶體配置。
  • 這會導致呼叫進程中每個 DLL 的進入點。
此函式的另一個常見用法是將線程插入進程,以查詢堆積或其他進程資訊。 這可能會導致上一個段落中所述的相同副作用。 此外,如果線程嘗試取得另一個線程所使用的鎖定擁有權,應用程式可能會死結。

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 processthreadsapi.h (Windows Server 2003、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

執行緒