次の方法で共有


CreateRemoteThreadEx 関数 (processthreadsapi.h)

別のプロセスの仮想アドレス空間で実行され、必要に応じてプロセッサ グループアフィニティなどの拡張属性を指定するスレッドを作成します。

構文

HANDLE CreateRemoteThreadEx(
  [in]            HANDLE                       hProcess,
  [in, optional]  LPSECURITY_ATTRIBUTES        lpThreadAttributes,
  [in]            SIZE_T                       dwStackSize,
  [in]            LPTHREAD_START_ROUTINE       lpStartAddress,
  [in, optional]  LPVOID                       lpParameter,
  [in]            DWORD                        dwCreationFlags,
  [in, optional]  LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
  [out, optional] LPDWORD                      lpThreadId
);

パラメーター

[in] hProcess

スレッドを作成するプロセスのハンドル。 ハンドルには、PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_VM_WRITE、PROCESS_VM_READアクセス権が必要です。 Windows 10 バージョン 1607 では、コードは新しいハンドルに対してこれらのアクセス権を取得する必要があります。 ただし、Windows 10 バージョン 1703 以降では、新しいハンドルにこれらのアクセス権が付与されている場合は、システムによって取得されます。 詳細については、「 セキュリティとアクセス権の処理」を参照してください。

[in, optional] lpThreadAttributes

新しい スレッドのセキュリティ 記述子を指定し、子プロセスが返されたハンドルを継承できるかどうかを判断するSECURITY_ATTRIBUTES構造体へのポインター。 lpThreadAttributes が NULL の場合、スレッドは既定のセキュリティ記述子を取得し、ハンドルを継承できません。 スレッドの既定のセキュリティ記述子のアクセス制御リスト (ACL) は、作成者のプライマリ トークンから取得されます。

[in] dwStackSize

スタックの初期サイズ (バイト単位)。 システムは、この値を最も近いページに丸めます。 このパラメーターが 0 (ゼロ) の場合、新しいスレッドは実行可能ファイルの既定のサイズを使用します。 詳細については、「 スレッド スタック サイズ」を参照してください。

[in] lpStartAddress

型のアプリケーション定義関数へのポインター LPTHREAD_START_ROUTINE スレッドによって実行され、リモート プロセス内のスレッドの開始アドレスを表します。 関数はリモート プロセスに存在する必要があります。 詳細については、「 ThreadProc」を参照してください。

[in, optional] lpParameter

lpStartAddress が指すスレッド関数に渡される変数へのポインター。 このパラメーターは、NULL でもかまいません。

[in] dwCreationFlags

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

意味
0
スレッドは作成直後に実行されます。
CREATE_SUSPENDED
0x00000004
スレッドは中断状態で作成され、 ResumeThread 関数が呼び出されるまで実行されません。
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
dwStackSize パラメーターは、スタックの初期予約サイズを指定します。 このフラグを指定しない場合、 dwStackSize はコミット サイズを指定します。

[in, optional] lpAttributeList

新しいスレッドの追加パラメーターを含む属性リスト。 このリストは InitializeProcThreadAttributeList 関数によって作成されます。

[out, optional] lpThreadId

スレッド識別子を受け取る変数へのポインター。

このパラメーターが NULL の場合、スレッド識別子は返されません。

戻り値

関数が成功した場合、戻り値は新しいスレッドへのハンドルです。

関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

CreateRemoteThreadEx 関数を使用すると、指定したプロセスのアドレス空間で新しい実行スレッドが開始されます。 スレッドは、プロセスが開くすべてのオブジェクトにアクセスできます。 lpAttribute パラメーターを使用して、新しいスレッドのプロセッサ グループ アフィニティなどの拡張属性を指定できます。 lpAttribute が NULL の場合、関数の動作は CreateRemoteThread と同じです。

ターミナル サービスは、Windows 8する前に、各ターミナル セッションを設計によって分離します。 したがって、ターゲット プロセスが呼び出し元プロセスとは異なるセッションにある場合、 CreateRemoteThread は失敗します。

新しいスレッド ハンドルは、新しいスレッドへのフル アクセスを使用して作成されます。 セキュリティ記述子が指定されていない場合は、スレッド オブジェクト ハンドルを必要とする任意の関数でハンドルを使用できます。 セキュリティ記述子を指定すると、アクセスが許可される前に、ハンドルの後続のすべての使用に対してアクセス チェックが実行されます。 アクセスチェックがアクセスを拒否した場合、要求プロセスは ハンドルを使用してスレッドにアクセスすることはできません。

スレッドが実行可能な状態で作成された場合 (つまり、CREATE_SUSPENDED フラグが使用されていない場合)、 CreateThread が返される前、特に呼び出し元が作成されたスレッドのハンドルと識別子を受け取る前に、スレッドの実行を開始できます。

スレッドは、スレッドの優先度が THREAD_PRIORITY_NORMAL で作成されます。 スレッドの優先度値を取得して設定するには、 GetThreadPriority 関数と SetThreadPriority 関数を 使用します。

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

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

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

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

要件

要件
サポートされている最小のクライアント Windows 7 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 R2 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー processthreadsapi.h (Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CreateRemoteThread