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 は、作成者のプライマリ トークンまたは偽装トークンから取得されます。 この動作は、WINDOWS XP SP2 および Windows Server 2003 で変更されました。
[in] dwStackSize
スタックの初期サイズ (バイト単位)。 システムは、この値を最も近いページに丸めます。 このパラメーターが 0 (ゼロ) の場合、新しいスレッドは実行可能ファイルの既定のサイズを使用します。 詳細については、「スレッド スタック サイズのを
[in] lpStartAddress
型のアプリケーション定義関数へのポインター LPTHREAD_START_ROUTINE スレッドによって実行され、リモート プロセス内のスレッドの開始アドレスを表します。 関数はリモート プロセスに存在する必要があります。 詳細については、ThreadProc
[in] lpParameter
スレッド関数に渡される変数へのポインター。
[in] dwCreationFlags
スレッドの作成を制御するフラグ。
価値 | 意味 |
---|---|
|
スレッドは作成直後に実行されます。 |
|
スレッドは中断状態で作成され、ResumeThread 関数が呼び出されるまで実行されません。 |
|
dwStackSize パラメーターは、スタックの初期予約サイズを指定します。 このフラグを指定しない場合は、dwStackSize |
[out] lpThreadId
スレッド識別子を受け取る変数へのポインター。
このパラメーターが NULL
戻り値
関数が成功した場合、戻り値は新しいスレッドへのハンドルです。
関数が失敗した場合、戻り値は NULL
備考
CreateRemoteThread 関数を使用すると、指定したプロセスのアドレス空間で新しい実行スレッドが開始されます。 スレッドは、プロセスが開くすべてのオブジェクトにアクセスできます。
Windows 8 より前のターミナル サービスでは、各ターミナル セッションが設計によって分離されています。 そのため、ターゲット プロセスが呼び出し元プロセスとは異なるセッションにある場合、CreateRemoteThread
新しいスレッド ハンドルは、新しいスレッドへのフル アクセスで作成されます。 セキュリティ記述子が指定されていない場合は、スレッド オブジェクト ハンドルを必要とする任意の関数でハンドルを使用できます。 セキュリティ記述子を指定すると、アクセスが許可される前に、以降のすべてのハンドルの使用に対してアクセス チェックが実行されます。 アクセス チェックでアクセスが拒否された場合、要求プロセスはハンドルを使用してスレッドにアクセスすることはできません。
スレッドが実行可能な状態で作成された場合 (つまり、
スレッドは、スレッドの優先度が THREAD_PRIORITY_NORMALで作成されます。
スレッドが終了すると、スレッド オブジェクトはシグナル状態を取得し、オブジェクトを待機しているスレッドを満たします。
スレッド オブジェクトは、スレッドが終了し、それに対するすべてのハンドルが CloseHandleの呼び出しによって閉じられるまで、システム
ExitProcess、ExitThread、createThread、CreateRemoteThread 関数、および開始中のプロセス (CreateProcess 呼び出しの結果) は、プロセス内で相互にシリアル化されます。 アドレス空間で一度に発生するイベントは 1 つだけです。 つまり、次の制限が保持されます。
- プロセスの起動および DLL 初期化ルーチン中に、新しいスレッドを作成できますが、プロセスに対して DLL の初期化が行われるまで実行は開始されません。
- プロセス内のスレッドは、一度に 1 つの DLL 初期化またはデタッチ ルーチンに含めることができます。
- ExitProcess は、すべてのスレッドが DLL の初期化またはデタッチ ルーチンを完了した後に返されます。
- シングル スレッド アプリケーションをマルチスレッド アプリケーションに変換します。
- プロセスのタイミングとメモリのレイアウトが変更されます。
- その結果、プロセス内の各 DLL のエントリ ポイントが呼び出されます。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows XP [デスクトップ アプリのみ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリのみ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | processthreadsapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む) |
ライブラリ | Kernel32.lib |
DLL | Kernel32.dll |
関連項目
CloseHandle の
CreateProcess の
CreateRemoteThreadEx の
CreateThread の
ExitProcess の
ExitThread の
GetThreadPriority を
SetThreadPriority の
ThreadProc の