次の方法で共有


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

スレッドの作成を制御するフラグ。

価値 意味
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で作成されます。 GetThreadPriority と SetThreadPriority 関数 使用して、スレッドの優先度値を取得および設定します。

スレッドが終了すると、スレッド オブジェクトはシグナル状態を取得し、オブジェクトを待機しているスレッドを満たします。

スレッド オブジェクトは、スレッドが終了し、それに対するすべてのハンドルが CloseHandleの呼び出しによって閉じられるまで、システム 残ります。

ExitProcessExitThreadcreateThreadCreateRemoteThread 関数、および開始中のプロセス (CreateProcess 呼び出しの結果) は、プロセス内で相互にシリアル化されます。 アドレス空間で一度に発生するイベントは 1 つだけです。 つまり、次の制限が保持されます。

  • プロセスの起動および DLL 初期化ルーチン中に、新しいスレッドを作成できますが、プロセスに対して DLL の初期化が行われるまで実行は開始されません。
  • プロセス内のスレッドは、一度に 1 つの DLL 初期化またはデタッチ ルーチンに含めることができます。
  • ExitProcess は、すべてのスレッドが DLL の初期化またはデタッチ ルーチンを完了した後に返されます。
この関数の一般的な用途は、中断を発行するためにデバッグ中のプロセスにスレッドを挿入することです。 ただし、この使用は推奨されません。これは、追加のスレッドがアプリケーションをデバッグしているユーザーに混乱を招き、この手法を使用する場合にいくつかの副作用があるためです。
  • シングル スレッド アプリケーションをマルチスレッド アプリケーションに変換します。
  • プロセスのタイミングとメモリのレイアウトが変更されます。
  • その結果、プロセス内の各 DLL のエントリ ポイントが呼び出されます。
この関数のもう 1 つの一般的な用途は、スレッドをプロセスに挿入して、ヒープまたはその他のプロセス情報を照会することです。 これにより、前の段落で説明したのと同じ副作用が発生する可能性があります。 また、スレッドが別のスレッドが使用しているロックの所有権を取得しようとすると、アプリケーションがデッドロックする可能性があります。

必要条件

要件 価値
サポートされる最小クライアント 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 を する

プロセス関数とスレッド関数の

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority の

ThreadProc の

スレッド