CreateRemoteThread

別のプロセスの仮想アドレス空間で実行されるスレッドを作成する。

CreateRemoteThread hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId

hProcess : [intptr] スレッドを作成するプロセスへのハンドル。ハンドルは PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_VM_WRITE、PROCESS_VM_READ のアクセス権が必要で、特定のプラットフォームではこれらなしでは失敗する可能性がある。詳細は Process Security and Access Rights を参照。
lpThreadAttributes : [var] 新しいスレッドのセキュリティ記述子を指定し、子プロセスが返されたハンドルを継承できるかを決定する SECURITY_ATTRIBUTES 構造体へのポインタ。lpThreadAttributes が NULL の場合、スレッドは既定のセキュリティ記述子を取得し、ハンドルは継承できない。スレッドの既定セキュリティ記述子の ACL は作成者のプライマリトークンから取得される。Windows XP: スレッドの既定セキュリティ記述子の ACL は作成者のプライマリトークンまたは impersonation トークンから取得される。この動作は Windows XP SP2 および Windows Server 2003 から変更された。
dwStackSize : [int] スタックの初期サイズ(バイト単位)。システムはこの値を最も近いページに丸める。このパラメータが 0 の場合、新しいスレッドは実行ファイルの既定サイズを使用する。詳細は Thread Stack Size を参照。
lpStartAddress : [int] スレッドが実行するアプリケーション定義の LPTHREAD_START_ROUTINE 型関数へのポインタで、リモートプロセス内のスレッドの開始アドレスを表す。関数はリモートプロセスに存在しなければならない。詳細は ThreadProc を参照。
lpParameter : [intptr] スレッド関数に渡される変数へのポインタ。
dwCreationFlags : [int] スレッドの作成を制御するフラグ。
lpThreadId : [var] スレッド識別子を受け取る変数へのポインタ。

(プラグイン / モジュール : kernel32.dll)

解説

別のプロセスの仮想アドレス空間で実行されるスレッドを作成する。

[戻り値]
関数が成功した場合、戻り値は新しいスレッドへのハンドル。関数が失敗した場合、戻り値は NULL。拡張エラー情報を取得するには
GetLastError を呼ぶ。lpStartAddress がデータやコード、またはアクセス不可能な場所を指していても
CreateRemoteThread
は成功することがある。スレッドが実行されるとき開始アドレスが無効であれば、例外が発生しスレッドは終了する。無効な開始アドレスによるスレッドの終了はスレッドのプロセスのエラー終了として扱われる。この動作は
CreateProcess の非同期的な性質に似ており、無効な DLL や欠落した DLL を参照していてもプロセスは作成される。

[備考]
CreateRemoteThread
関数は、指定されたプロセスのアドレス空間で新しい実行スレッドを開始する。スレッドはそのプロセスが開いているすべてのオブジェクトにアクセスできる。Windows
8
より前ではターミナルサービスは設計上各ターミナルセッションを分離する。したがって、ターゲットプロセスが呼び出し側プロセスとは別のセッションにある場合、CreateRemoteThread
は失敗する。新しいスレッドハンドルは新しいスレッドへのフルアクセスで作成される。セキュリティ記述子が提供されない場合、ハンドルはスレッドオブジェクトハンドルを必要とする任意の関数で使用できる。セキュリティ記述子が提供された場合、ハンドルの後続のすべての使用でアクセスチェックが実行される。アクセスチェックがアクセスを拒否した場合、要求側プロセスはスレッドへのアクセスを得るためにハンドルを使用できない。スレッドが実行可能状態で作成された場合(つまり
CREATE_SUSPENDED フラグが使われなかった場合)、スレッドは CreateThread
が戻る前に、特に呼び出し側が作成されたスレッドのハンドルと識別子を受け取る前に実行を開始する可能性がある。スレッドはスレッド優先度
THREAD_PRIORITY_NORMAL で作成される。スレッドの優先度値を取得・設定するには GetThreadPriority
および SetThreadPriority
関数を使う。スレッドが終了すると、スレッドオブジェクトはシグナル状態となり、オブジェクトを待機していたスレッドを満たす。スレッドオブジェクトは、スレッドが終了しそれへのすべてのハンドルが
CloseHandle
の呼び出しで閉じられるまでシステム内に残る。ExitProcess、ExitThread、CreateThreadCreateRemoteThread
関数と、CreateProcess
呼び出しの結果として起動するプロセスは、プロセス内で互いにシリアライズされる。これらのイベントはアドレス空間内で一度に 1
つしか発生しない。つまり、以下の制限が成り立つ:
(以下省略)

情報

プラグイン / モジュールkernel32.dll
バージョン1.0
作成日2026/04/16
著作者IronHSP / CsWin32 bridge
URLhttps://github.com/inovia/IronHSP
備考Win32 API の kernel32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_kernel32_gen2.hs