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 呼び出しの結果として) 開始されるプロセスは、プロセス内で相互にシリアル化されます。 これらのイベントのうち、一度に 1 つのアドレス空間で発生するイベントは 1 つだけです。 つまり、次の制限が保持されます。
- プロセスの起動および DLL 初期化ルーチン中に、新しいスレッドを作成できますが、プロセスに対して DLL の初期化が行われるまで実行は開始されません。
- プロセス内のスレッドは、一度に 1 つの 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 の Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |