CreateProcessWithTokenW
関数シグネチャ
// ADVAPI32.dll
#include <windows.h>
BOOL CreateProcessWithTokenW(
HANDLE hToken,
CREATE_PROCESS_LOGON_FLAGS dwLogonFlags,
LPCWSTR lpApplicationName, // optional
LPWSTR lpCommandLine, // optional
PROCESS_CREATION_FLAGS dwCreationFlags,
void* lpEnvironment, // optional
LPCWSTR lpCurrentDirectory, // optional
STARTUPINFOW* lpStartupInfo,
PROCESS_INFORMATION* lpProcessInformation
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| hToken | HANDLE | in | ユーザーを表すプライマリトークンへのハンドル。このハンドルには、TOKEN_QUERY、TOKEN_DUPLICATE、および TOKEN_ASSIGN_PRIMARY のアクセス権が必要です。詳細については、 Access Rights for Access-Token Objects を参照してください。トークンが表すユーザーは、lpApplicationName パラメーターまたは lpCommandLine パラメーターで指定されたアプリケーションに対する読み取りおよび実行アクセス権を持っている必要があります。 指定したユーザーを表すプライマリトークンを取得するには、 LogonUser 関数を呼び出します。あるいは、 DuplicateTokenEx 関数を呼び出して、偽装トークンをプライマリトークンに変換することもできます。これにより、クライアントを偽装しているサーバーアプリケーションが、そのクライアントのセキュリティコンテキストを持つプロセスを作成できます。 ターミナルサービス: 呼び出し元のプロセスは常に呼び出し元のセッションで実行され、トークンで指定されたセッションでは実行されません。トークンで指定されたセッションでプロセスを実行するには、CreateProcessAsUser 関数を使用してください。 | ||||||
| dwLogonFlags | CREATE_PROCESS_LOGON_FLAGS | in | ログオンオプション。このパラメーターには、0 または次のいずれかの値を指定できます。
| ||||||
| lpApplicationName | LPCWSTR | inoptional | 実行するモジュールの名前。このモジュールは Windows ベースのアプリケーションにすることができます。ローカルコンピューター上に適切なサブシステムが利用可能な場合は、それ以外の種類のモジュール(たとえば MS-DOS や OS/2)にすることもできます。 文字列には、実行するモジュールのフルパスとファイル名を指定するか、部分的な名前を指定できます。部分的な名前の場合、関数は現在のドライブと現在のディレクトリを使用して指定を補完します。関数は検索パスを使用しません。このパラメーターにはファイル名の拡張子を含める必要があります。既定の拡張子は想定されません。 lpApplicationName パラメーターには NULL を指定できます。その場合、モジュール名は lpCommandLine 文字列内で最初の空白文字で区切られたトークンでなければなりません。空白を含む長いファイル名を使用する場合は、引用符付きの文字列を使用してファイル名の終わりと引数の始まりを示してください。そうしないと、ファイル名があいまいになります。たとえば、文字列 "c:\program files\sub dir\program name" を考えてみます。この文字列はいくつかの方法で解釈できます。システムは次の順序で可能性を解釈しようとします。 c:\program.exe c:\program files\sub.exe c:\program files\sub dir\program.exe c:\program files\sub dir\program name.exe 実行可能モジュールが 16 ビットアプリケーションの場合、lpApplicationName は NULL にし、lpCommandLine が指す文字列で実行可能モジュールとその引数を指定する必要があります。 | ||||||
| lpCommandLine | LPWSTR | inoutoptional | 実行するコマンドライン。 この文字列の最大長は 1024 文字です。lpApplicationName が NULL の場合、lpCommandLine のモジュール名部分は MAX_PATH 文字までに制限されます。 この関数は、この文字列の内容を変更することがあります。そのため、このパラメーターを読み取り専用メモリ(const 変数やリテラル文字列など)へのポインターにすることはできません。このパラメーターが定数文字列の場合、関数はアクセス違反を引き起こす可能性があります。 lpCommandLine パラメーターには NULL を指定できます。その場合、関数は lpApplicationName が指す文字列をコマンドラインとして使用します。 lpApplicationName と lpCommandLine の両方が NULL でない場合、lpApplicationName が実行するモジュールを指定し、lpCommandLine がコマンドラインを指定します。新しいプロセスは GetCommandLine を使用してコマンドライン全体を取得できます。C で記述されたコンソールプロセスは、argc および argv 引数を使用してコマンドラインを解析できます。argv[0] はモジュール名であるため、C プログラマーは通常、コマンドラインの最初のトークンとしてモジュール名を繰り返します。 lpApplicationName が NULL の場合、コマンドラインの最初の空白文字で区切られたトークンがモジュール名を指定します。空白を含む長いファイル名を使用する場合は、引用符付きの文字列を使用してファイル名の終わりと引数の始まりを示してください(lpApplicationName パラメーターの説明を参照)。ファイル名に拡張子が含まれていない場合は、.exe が付加されます。そのため、ファイル名の拡張子が .com の場合は、このパラメーターに .com 拡張子を含める必要があります。ファイル名がピリオド(.)で終わり拡張子がない場合、またはファイル名にパスが含まれている場合は、.exe は付加されません。ファイル名にディレクトリパスが含まれていない場合、システムは次の順序で実行可能ファイルを検索します。
| ||||||
| dwCreationFlags | PROCESS_CREATION_FLAGS | in | プロセスの作成方法を制御するフラグ。CREATE_DEFAULT_ERROR_MODE、CREATE_NEW_CONSOLE、および CREATE_NEW_PROCESS_GROUP フラグは既定で有効になっています。値の一覧については、Process Creation Flags を参照してください。 このパラメーターは、新しいプロセスの優先順位クラスも制御します。優先順位クラスは、プロセスのスレッドのスケジューリング優先順位を決定するために使用されます。値の一覧については、 GetPriorityClass を参照してください。優先順位クラスフラグがいずれも指定されていない場合、優先順位クラスは既定で NORMAL_PRIORITY_CLASS になります。ただし、作成元プロセスの優先順位クラスが IDLE_PRIORITY_CLASS または BELOW_NORMAL_PRIORITY_CLASS の場合は除きます。この場合、子プロセスは呼び出し元プロセスの既定の優先順位クラスを受け取ります。 dwCreationFlags パラメーターの値が 0 の場合:
| ||||||
| lpEnvironment | void* | inoptional | 新しいプロセスの環境ブロックへのポインター。このパラメーターが NULL の場合、新しいプロセスは lpUsername で指定されたユーザーのプロファイルから作成された環境を使用します。 環境ブロックは、NULL で終わる文字列の NULL で終わるブロックで構成されます。各文字列は次の形式です。 name=value 等号(=)は区切り文字として使用されるため、環境変数の名前には使用できません。 環境ブロックには Unicode 文字または ANSI 文字を含めることができます。lpEnvironment が指す環境ブロックに Unicode 文字が含まれている場合は、dwCreationFlags に CREATE_UNICODE_ENVIRONMENT が含まれていることを確認してください。 ANSI 環境ブロックは 2 つのゼロバイトで終端されます。1 つは最後の文字列用、もう 1 つはブロックを終端するためのものです。Unicode 環境ブロックは 4 つのゼロバイトで終端されます。2 つは最後の文字列用、もう 2 つはブロックを終端するためのものです。 特定のユーザーの環境ブロックのコピーを取得するには、 CreateEnvironmentBlock 関数を使用します。 | ||||||
| lpCurrentDirectory | LPCWSTR | inoptional | プロセスの現在のディレクトリへのフルパス。文字列には UNC パスを指定することもできます。 このパラメーターが NULL の場合、新しいプロセスは呼び出し元プロセスと同じ現在のドライブおよびディレクトリを持ちます。(この機能は主に、アプリケーションを起動し、その初期ドライブと作業ディレクトリを指定する必要があるシェル向けに提供されています。) | ||||||
| lpStartupInfo | STARTUPINFOW* | in | STARTUPINFO または STARTUPINFOEX 構造体へのポインター。 lpDesktop メンバーが NULL または空の文字列の場合、新しいプロセスは親プロセスのデスクトップとウィンドウステーションを継承します。関数は、継承したウィンドウステーションとデスクトップに指定したユーザーアカウントのアクセス許可を追加します。それ以外の場合、このメンバーがデスクトップを指定しているときは、WinSta0\Default であっても、指定したウィンドウステーションとデスクトップに指定したユーザーアカウントのアクセス許可を追加するのはアプリケーションの責任です。 STARTUPINFO または STARTUPINFOEX 内のハンドルは、不要になったときに CloseHandle で閉じる必要があります。 重要 STARTUPINFO 構造体の dwFlags メンバーが STARTF_USESTDHANDLES を指定している場合、標準ハンドルフィールドは検証されずにそのまま子プロセスにコピーされます。これらのフィールドに有効なハンドル値が含まれていることを保証するのは呼び出し元の責任です。値が正しくないと、子プロセスが誤動作したりクラッシュしたりする可能性があります。無効なハンドルを検出するには、Application Verifier ランタイム検証ツールを使用してください。
| ||||||
| lpProcessInformation | PROCESS_INFORMATION* | out | PROCESS_INFORMATION 構造体へのポインター。この構造体は、プロセスへのハンドルを含む、新しいプロセスの識別情報を受け取ります。 PROCESS_INFORMATION 内のハンドルは、不要になったときに CloseHandle 関数で閉じる必要があります。 |
戻り値の型: BOOL
公式ドキュメント
新しいプロセスとそのプライマリスレッドを作成します。新しいプロセスは、指定されたトークンのセキュリティコンテキストで実行されます。オプションで、指定したユーザーのユーザープロファイルを読み込むこともできます。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗すると、戻り値は 0 になります。拡張エラー情報を取得するには、 GetLastError を呼び出します。
この関数は、プロセスの初期化が完了する前に戻ることに注意してください。必要な DLL が見つからない場合や初期化に失敗した場合、プロセスは終了します。プロセスの終了ステータスを取得するには、GetExitCodeProcess を呼び出します。
解説(Remarks)
既定では、 CreateProcessWithTokenW は指定したユーザーのプロファイルを HKEY_USERS レジストリキーに読み込みません。つまり、HKEY_CURRENT_USER レジストリキー内の情報へのアクセスは、通常の対話型ログオンと一致する結果を生成しない場合があります。LOGON_WITH_PROFILE を使用するか、この関数を呼び出す前に LoadUserProfile 関数を呼び出すことによって、ユーザーのレジストリハイブを HKEY_USERS に読み込むのは、利用者の責任です。
lpEnvironment パラメーターが NULL の場合、新しいプロセスは lpUserName で指定されたユーザーのプロファイルから作成された環境ブロックを使用します。HOMEDRIVE 変数と HOMEPATH 変数が設定されていない場合、CreateProcessWithTokenW は、ユーザーの作業ディレクトリのドライブとパスを使用するように環境ブロックを変更します。
作成時、新しいプロセスおよびスレッドハンドルはフルアクセス権(PROCESS_ALL_ACCESS および THREAD_ALL_ACCESS)を受け取ります。いずれのハンドルについても、セキュリティ記述子が指定されていない場合、そのハンドルはその種類のオブジェクトハンドルを必要とする任意の関数で使用できます。セキュリティ記述子が指定されている場合は、アクセスが許可される前に、ハンドルのその後のすべての使用に対してアクセスチェックが実行されます。アクセスが拒否されると、要求元のプロセスはそのハンドルを使用してプロセスまたはスレッドへのアクセスを得ることができません。
セキュリティトークンを取得するには、 PROCESS_INFORMATION 構造体内のプロセスハンドルを OpenProcessToken 関数に渡します。
プロセスにはプロセス識別子が割り当てられます。この識別子はプロセスが終了するまで有効です。プロセスの識別に使用したり、 OpenProcess 関数でプロセスへのハンドルを開くために指定したりできます。プロセス内の最初のスレッドにもスレッド識別子が割り当てられます。これは、 OpenThread 関数でスレッドへのハンドルを開くために指定できます。この識別子はスレッドが終了するまで有効で、システム内でスレッドを一意に識別するために使用できます。これらの識別子は PROCESS_INFORMATION で返されます。
呼び出し元スレッドは、 WaitForInputIdle 関数を使用して、新しいプロセスが初期化を完了し、保留中の入力がない状態でユーザー入力を待機するまで待つことができます。CreateProcessWithTokenW は新しいプロセスの初期化完了を待たずに戻るため、これは親プロセスと子プロセス間の同期に役立ちます。たとえば、作成元プロセスは、新しいプロセスに関連付けられたウィンドウを見つけようとする前に WaitForInputIdle を使用します。
プロセスをシャットダウンする推奨される方法は、 ExitProcess 関数を使用することです。この関数は、プロセスにアタッチされているすべての DLL に終了が近づいていることを通知するためです。プロセスをシャットダウンする他の手段では、アタッチされている DLL に通知されません。スレッドが ExitProcess を呼び出すと、プロセスの他のスレッドは追加のコード(アタッチされている DLL のスレッド終了コードを含む)を実行する機会なく終了することに注意してください。詳細については、 Terminating a Process を参照してください。
この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT を 0x0500 以降として定義します。詳細については、 Using the Windows Headers を参照してください。
セキュリティに関する注意事項
lpApplicationName パラメーターには NULL を指定できます。その場合、実行可能ファイル名は lpCommandLine 内で最初の空白文字で区切られた文字列でなければなりません。実行可能ファイル名やパス名に空白が含まれている場合、関数が空白を解析する方法のために、別の実行可能ファイルが実行されるリスクがあります。次の例は危険です。関数は、"MyApp.exe" の代わりに、存在する場合は "Program.exe" を実行しようとするためです。 LPTSTR szCmdline = L"C:\\Program Files\\MyApp";
CreateProcessWithTokenW(/*...*/, szCmdline, /*...*/);
悪意のあるユーザーがシステム上に "Program.exe" というアプリケーションを作成した場合、Program Files ディレクトリを使用して CreateProcessWithTokenW を誤って呼び出すプログラムは、意図したアプリケーションの代わりにこのアプリケーションを実行してしまいます。
この問題を回避するには、lpApplicationName に NULL を渡さないでください。lpApplicationName に NULL を渡す場合は、次の例に示すように、lpCommandLine 内の実行可能ファイルパスを引用符で囲んでください。
LPTSTR szCmdline = L"\"C:\\Program Files\\MyApp\"";
CreateProcessWithTokenW(/*...*/, szCmdline, /*...*/);
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// ADVAPI32.dll
#include <windows.h>
BOOL CreateProcessWithTokenW(
HANDLE hToken,
CREATE_PROCESS_LOGON_FLAGS dwLogonFlags,
LPCWSTR lpApplicationName, // optional
LPWSTR lpCommandLine, // optional
PROCESS_CREATION_FLAGS dwCreationFlags,
void* lpEnvironment, // optional
LPCWSTR lpCurrentDirectory, // optional
STARTUPINFOW* lpStartupInfo,
PROCESS_INFORMATION* lpProcessInformation
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool CreateProcessWithTokenW(
IntPtr hToken, // HANDLE
uint dwLogonFlags, // CREATE_PROCESS_LOGON_FLAGS
[MarshalAs(UnmanagedType.LPWStr)] string lpApplicationName, // LPCWSTR optional
[MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpCommandLine, // LPWSTR optional, in/out
uint dwCreationFlags, // PROCESS_CREATION_FLAGS
IntPtr lpEnvironment, // void* optional
[MarshalAs(UnmanagedType.LPWStr)] string lpCurrentDirectory, // LPCWSTR optional
IntPtr lpStartupInfo, // STARTUPINFOW*
IntPtr lpProcessInformation // PROCESS_INFORMATION* out
);<DllImport("ADVAPI32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function CreateProcessWithTokenW(
hToken As IntPtr, ' HANDLE
dwLogonFlags As UInteger, ' CREATE_PROCESS_LOGON_FLAGS
<MarshalAs(UnmanagedType.LPWStr)> lpApplicationName As String, ' LPCWSTR optional
<MarshalAs(UnmanagedType.LPWStr)> lpCommandLine As System.Text.StringBuilder, ' LPWSTR optional, in/out
dwCreationFlags As UInteger, ' PROCESS_CREATION_FLAGS
lpEnvironment As IntPtr, ' void* optional
<MarshalAs(UnmanagedType.LPWStr)> lpCurrentDirectory As String, ' LPCWSTR optional
lpStartupInfo As IntPtr, ' STARTUPINFOW*
lpProcessInformation As IntPtr ' PROCESS_INFORMATION* out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' hToken : HANDLE
' dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS
' lpApplicationName : LPCWSTR optional
' lpCommandLine : LPWSTR optional, in/out
' dwCreationFlags : PROCESS_CREATION_FLAGS
' lpEnvironment : void* optional
' lpCurrentDirectory : LPCWSTR optional
' lpStartupInfo : STARTUPINFOW*
' lpProcessInformation : PROCESS_INFORMATION* out
Declare PtrSafe Function CreateProcessWithTokenW Lib "advapi32" ( _
ByVal hToken As LongPtr, _
ByVal dwLogonFlags As Long, _
ByVal lpApplicationName As LongPtr, _
ByVal lpCommandLine As LongPtr, _
ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As LongPtr, _
ByVal lpCurrentDirectory As LongPtr, _
ByVal lpStartupInfo As LongPtr, _
ByVal lpProcessInformation As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
CreateProcessWithTokenW = ctypes.windll.advapi32.CreateProcessWithTokenW
CreateProcessWithTokenW.restype = wintypes.BOOL
CreateProcessWithTokenW.argtypes = [
wintypes.HANDLE, # hToken : HANDLE
wintypes.DWORD, # dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS
wintypes.LPCWSTR, # lpApplicationName : LPCWSTR optional
wintypes.LPWSTR, # lpCommandLine : LPWSTR optional, in/out
wintypes.DWORD, # dwCreationFlags : PROCESS_CREATION_FLAGS
ctypes.POINTER(None), # lpEnvironment : void* optional
wintypes.LPCWSTR, # lpCurrentDirectory : LPCWSTR optional
ctypes.c_void_p, # lpStartupInfo : STARTUPINFOW*
ctypes.c_void_p, # lpProcessInformation : PROCESS_INFORMATION* out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('ADVAPI32.dll')
CreateProcessWithTokenW = Fiddle::Function.new(
lib['CreateProcessWithTokenW'],
[
Fiddle::TYPE_VOIDP, # hToken : HANDLE
-Fiddle::TYPE_INT, # dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS
Fiddle::TYPE_VOIDP, # lpApplicationName : LPCWSTR optional
Fiddle::TYPE_VOIDP, # lpCommandLine : LPWSTR optional, in/out
-Fiddle::TYPE_INT, # dwCreationFlags : PROCESS_CREATION_FLAGS
Fiddle::TYPE_VOIDP, # lpEnvironment : void* optional
Fiddle::TYPE_VOIDP, # lpCurrentDirectory : LPCWSTR optional
Fiddle::TYPE_VOIDP, # lpStartupInfo : STARTUPINFOW*
Fiddle::TYPE_VOIDP, # lpProcessInformation : PROCESS_INFORMATION* out
],
Fiddle::TYPE_INT)#[link(name = "advapi32")]
extern "system" {
fn CreateProcessWithTokenW(
hToken: *mut core::ffi::c_void, // HANDLE
dwLogonFlags: u32, // CREATE_PROCESS_LOGON_FLAGS
lpApplicationName: *const u16, // LPCWSTR optional
lpCommandLine: *mut u16, // LPWSTR optional, in/out
dwCreationFlags: u32, // PROCESS_CREATION_FLAGS
lpEnvironment: *mut (), // void* optional
lpCurrentDirectory: *const u16, // LPCWSTR optional
lpStartupInfo: *mut STARTUPINFOW, // STARTUPINFOW*
lpProcessInformation: *mut PROCESS_INFORMATION // PROCESS_INFORMATION* out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true)]
public static extern bool CreateProcessWithTokenW(IntPtr hToken, uint dwLogonFlags, [MarshalAs(UnmanagedType.LPWStr)] string lpApplicationName, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpCommandLine, uint dwCreationFlags, IntPtr lpEnvironment, [MarshalAs(UnmanagedType.LPWStr)] string lpCurrentDirectory, IntPtr lpStartupInfo, IntPtr lpProcessInformation);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_CreateProcessWithTokenW' -Namespace Win32 -PassThru
# $api::CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)#uselib "ADVAPI32.dll"
#func global CreateProcessWithTokenW "CreateProcessWithTokenW" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; CreateProcessWithTokenW hToken, dwLogonFlags, lpApplicationName, varptr(lpCommandLine), dwCreationFlags, lpEnvironment, lpCurrentDirectory, varptr(lpStartupInfo), varptr(lpProcessInformation) ; 戻り値は stat
; hToken : HANDLE -> "sptr"
; dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "sptr"
; lpApplicationName : LPCWSTR optional -> "sptr"
; lpCommandLine : LPWSTR optional, in/out -> "sptr"
; dwCreationFlags : PROCESS_CREATION_FLAGS -> "sptr"
; lpEnvironment : void* optional -> "sptr"
; lpCurrentDirectory : LPCWSTR optional -> "sptr"
; lpStartupInfo : STARTUPINFOW* -> "sptr"
; lpProcessInformation : PROCESS_INFORMATION* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "ADVAPI32.dll" #cfunc global CreateProcessWithTokenW "CreateProcessWithTokenW" sptr, int, wstr, var, int, sptr, wstr, var, var ; res = CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation) ; hToken : HANDLE -> "sptr" ; dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "int" ; lpApplicationName : LPCWSTR optional -> "wstr" ; lpCommandLine : LPWSTR optional, in/out -> "var" ; dwCreationFlags : PROCESS_CREATION_FLAGS -> "int" ; lpEnvironment : void* optional -> "sptr" ; lpCurrentDirectory : LPCWSTR optional -> "wstr" ; lpStartupInfo : STARTUPINFOW* -> "var" ; lpProcessInformation : PROCESS_INFORMATION* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "ADVAPI32.dll" #cfunc global CreateProcessWithTokenW "CreateProcessWithTokenW" sptr, int, wstr, sptr, int, sptr, wstr, sptr, sptr ; res = CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, varptr(lpCommandLine), dwCreationFlags, lpEnvironment, lpCurrentDirectory, varptr(lpStartupInfo), varptr(lpProcessInformation)) ; hToken : HANDLE -> "sptr" ; dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "int" ; lpApplicationName : LPCWSTR optional -> "wstr" ; lpCommandLine : LPWSTR optional, in/out -> "sptr" ; dwCreationFlags : PROCESS_CREATION_FLAGS -> "int" ; lpEnvironment : void* optional -> "sptr" ; lpCurrentDirectory : LPCWSTR optional -> "wstr" ; lpStartupInfo : STARTUPINFOW* -> "sptr" ; lpProcessInformation : PROCESS_INFORMATION* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; BOOL CreateProcessWithTokenW(HANDLE hToken, CREATE_PROCESS_LOGON_FLAGS dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, PROCESS_CREATION_FLAGS dwCreationFlags, void* lpEnvironment, LPCWSTR lpCurrentDirectory, STARTUPINFOW* lpStartupInfo, PROCESS_INFORMATION* lpProcessInformation) #uselib "ADVAPI32.dll" #cfunc global CreateProcessWithTokenW "CreateProcessWithTokenW" intptr, int, wstr, var, int, intptr, wstr, var, var ; res = CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation) ; hToken : HANDLE -> "intptr" ; dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "int" ; lpApplicationName : LPCWSTR optional -> "wstr" ; lpCommandLine : LPWSTR optional, in/out -> "var" ; dwCreationFlags : PROCESS_CREATION_FLAGS -> "int" ; lpEnvironment : void* optional -> "intptr" ; lpCurrentDirectory : LPCWSTR optional -> "wstr" ; lpStartupInfo : STARTUPINFOW* -> "var" ; lpProcessInformation : PROCESS_INFORMATION* out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL CreateProcessWithTokenW(HANDLE hToken, CREATE_PROCESS_LOGON_FLAGS dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, PROCESS_CREATION_FLAGS dwCreationFlags, void* lpEnvironment, LPCWSTR lpCurrentDirectory, STARTUPINFOW* lpStartupInfo, PROCESS_INFORMATION* lpProcessInformation) #uselib "ADVAPI32.dll" #cfunc global CreateProcessWithTokenW "CreateProcessWithTokenW" intptr, int, wstr, intptr, int, intptr, wstr, intptr, intptr ; res = CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, varptr(lpCommandLine), dwCreationFlags, lpEnvironment, lpCurrentDirectory, varptr(lpStartupInfo), varptr(lpProcessInformation)) ; hToken : HANDLE -> "intptr" ; dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "int" ; lpApplicationName : LPCWSTR optional -> "wstr" ; lpCommandLine : LPWSTR optional, in/out -> "intptr" ; dwCreationFlags : PROCESS_CREATION_FLAGS -> "int" ; lpEnvironment : void* optional -> "intptr" ; lpCurrentDirectory : LPCWSTR optional -> "wstr" ; lpStartupInfo : STARTUPINFOW* -> "intptr" ; lpProcessInformation : PROCESS_INFORMATION* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
procCreateProcessWithTokenW = advapi32.NewProc("CreateProcessWithTokenW")
)
// hToken (HANDLE), dwLogonFlags (CREATE_PROCESS_LOGON_FLAGS), lpApplicationName (LPCWSTR optional), lpCommandLine (LPWSTR optional, in/out), dwCreationFlags (PROCESS_CREATION_FLAGS), lpEnvironment (void* optional), lpCurrentDirectory (LPCWSTR optional), lpStartupInfo (STARTUPINFOW*), lpProcessInformation (PROCESS_INFORMATION* out)
r1, _, err := procCreateProcessWithTokenW.Call(
uintptr(hToken),
uintptr(dwLogonFlags),
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpApplicationName))),
uintptr(lpCommandLine),
uintptr(dwCreationFlags),
uintptr(lpEnvironment),
uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(lpCurrentDirectory))),
uintptr(lpStartupInfo),
uintptr(lpProcessInformation),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction CreateProcessWithTokenW(
hToken: THandle; // HANDLE
dwLogonFlags: DWORD; // CREATE_PROCESS_LOGON_FLAGS
lpApplicationName: PWideChar; // LPCWSTR optional
lpCommandLine: PWideChar; // LPWSTR optional, in/out
dwCreationFlags: DWORD; // PROCESS_CREATION_FLAGS
lpEnvironment: Pointer; // void* optional
lpCurrentDirectory: PWideChar; // LPCWSTR optional
lpStartupInfo: Pointer; // STARTUPINFOW*
lpProcessInformation: Pointer // PROCESS_INFORMATION* out
): BOOL; stdcall;
external 'ADVAPI32.dll' name 'CreateProcessWithTokenW';result := DllCall("ADVAPI32\CreateProcessWithTokenW"
, "Ptr", hToken ; HANDLE
, "UInt", dwLogonFlags ; CREATE_PROCESS_LOGON_FLAGS
, "WStr", lpApplicationName ; LPCWSTR optional
, "Ptr", lpCommandLine ; LPWSTR optional, in/out
, "UInt", dwCreationFlags ; PROCESS_CREATION_FLAGS
, "Ptr", lpEnvironment ; void* optional
, "WStr", lpCurrentDirectory ; LPCWSTR optional
, "Ptr", lpStartupInfo ; STARTUPINFOW*
, "Ptr", lpProcessInformation ; PROCESS_INFORMATION* out
, "Int") ; return: BOOL●CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation) = DLL("ADVAPI32.dll", "bool CreateProcessWithTokenW(void*, dword, char*, char*, dword, void*, char*, void*, void*)")
# 呼び出し: CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
# hToken : HANDLE -> "void*"
# dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "dword"
# lpApplicationName : LPCWSTR optional -> "char*"
# lpCommandLine : LPWSTR optional, in/out -> "char*"
# dwCreationFlags : PROCESS_CREATION_FLAGS -> "dword"
# lpEnvironment : void* optional -> "void*"
# lpCurrentDirectory : LPCWSTR optional -> "char*"
# lpStartupInfo : STARTUPINFOW* -> "void*"
# lpProcessInformation : PROCESS_INFORMATION* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "advapi32" fn CreateProcessWithTokenW(
hToken: ?*anyopaque, // HANDLE
dwLogonFlags: u32, // CREATE_PROCESS_LOGON_FLAGS
lpApplicationName: [*c]const u16, // LPCWSTR optional
lpCommandLine: [*c]u16, // LPWSTR optional, in/out
dwCreationFlags: u32, // PROCESS_CREATION_FLAGS
lpEnvironment: ?*anyopaque, // void* optional
lpCurrentDirectory: [*c]const u16, // LPCWSTR optional
lpStartupInfo: [*c]STARTUPINFOW, // STARTUPINFOW*
lpProcessInformation: [*c]PROCESS_INFORMATION // PROCESS_INFORMATION* out
) callconv(std.os.windows.WINAPI) i32;proc CreateProcessWithTokenW(
hToken: pointer, # HANDLE
dwLogonFlags: uint32, # CREATE_PROCESS_LOGON_FLAGS
lpApplicationName: WideCString, # LPCWSTR optional
lpCommandLine: ptr uint16, # LPWSTR optional, in/out
dwCreationFlags: uint32, # PROCESS_CREATION_FLAGS
lpEnvironment: pointer, # void* optional
lpCurrentDirectory: WideCString, # LPCWSTR optional
lpStartupInfo: ptr STARTUPINFOW, # STARTUPINFOW*
lpProcessInformation: ptr PROCESS_INFORMATION # PROCESS_INFORMATION* out
): int32 {.importc: "CreateProcessWithTokenW", stdcall, dynlib: "ADVAPI32.dll".}pragma(lib, "advapi32");
extern(Windows)
int CreateProcessWithTokenW(
void* hToken, // HANDLE
uint dwLogonFlags, // CREATE_PROCESS_LOGON_FLAGS
const(wchar)* lpApplicationName, // LPCWSTR optional
wchar* lpCommandLine, // LPWSTR optional, in/out
uint dwCreationFlags, // PROCESS_CREATION_FLAGS
void* lpEnvironment, // void* optional
const(wchar)* lpCurrentDirectory, // LPCWSTR optional
STARTUPINFOW* lpStartupInfo, // STARTUPINFOW*
PROCESS_INFORMATION* lpProcessInformation // PROCESS_INFORMATION* out
);ccall((:CreateProcessWithTokenW, "ADVAPI32.dll"), stdcall, Int32,
(Ptr{Cvoid}, UInt32, Cwstring, Ptr{UInt16}, UInt32, Ptr{Cvoid}, Cwstring, Ptr{STARTUPINFOW}, Ptr{PROCESS_INFORMATION}),
hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
# hToken : HANDLE -> Ptr{Cvoid}
# dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> UInt32
# lpApplicationName : LPCWSTR optional -> Cwstring
# lpCommandLine : LPWSTR optional, in/out -> Ptr{UInt16}
# dwCreationFlags : PROCESS_CREATION_FLAGS -> UInt32
# lpEnvironment : void* optional -> Ptr{Cvoid}
# lpCurrentDirectory : LPCWSTR optional -> Cwstring
# lpStartupInfo : STARTUPINFOW* -> Ptr{STARTUPINFOW}
# lpProcessInformation : PROCESS_INFORMATION* out -> Ptr{PROCESS_INFORMATION}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t CreateProcessWithTokenW(
void* hToken,
uint32_t dwLogonFlags,
const uint16_t* lpApplicationName,
uint16_t* lpCommandLine,
uint32_t dwCreationFlags,
void* lpEnvironment,
const uint16_t* lpCurrentDirectory,
void* lpStartupInfo,
void* lpProcessInformation);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
-- hToken : HANDLE
-- dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS
-- lpApplicationName : LPCWSTR optional
-- lpCommandLine : LPWSTR optional, in/out
-- dwCreationFlags : PROCESS_CREATION_FLAGS
-- lpEnvironment : void* optional
-- lpCurrentDirectory : LPCWSTR optional
-- lpStartupInfo : STARTUPINFOW*
-- lpProcessInformation : PROCESS_INFORMATION* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const CreateProcessWithTokenW = lib.func('__stdcall', 'CreateProcessWithTokenW', 'int32_t', ['void *', 'uint32_t', 'str16', 'uint16_t *', 'uint32_t', 'void *', 'str16', 'void *', 'void *']);
// CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
// hToken : HANDLE -> 'void *'
// dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> 'uint32_t'
// lpApplicationName : LPCWSTR optional -> 'str16'
// lpCommandLine : LPWSTR optional, in/out -> 'uint16_t *'
// dwCreationFlags : PROCESS_CREATION_FLAGS -> 'uint32_t'
// lpEnvironment : void* optional -> 'void *'
// lpCurrentDirectory : LPCWSTR optional -> 'str16'
// lpStartupInfo : STARTUPINFOW* -> 'void *'
// lpProcessInformation : PROCESS_INFORMATION* out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("ADVAPI32.dll", {
CreateProcessWithTokenW: { parameters: ["pointer", "u32", "buffer", "buffer", "u32", "pointer", "buffer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation)
// hToken : HANDLE -> "pointer"
// dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> "u32"
// lpApplicationName : LPCWSTR optional -> "buffer"
// lpCommandLine : LPWSTR optional, in/out -> "buffer"
// dwCreationFlags : PROCESS_CREATION_FLAGS -> "u32"
// lpEnvironment : void* optional -> "pointer"
// lpCurrentDirectory : LPCWSTR optional -> "buffer"
// lpStartupInfo : STARTUPINFOW* -> "pointer"
// lpProcessInformation : PROCESS_INFORMATION* out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t CreateProcessWithTokenW(
void* hToken,
uint32_t dwLogonFlags,
const uint16_t* lpApplicationName,
uint16_t* lpCommandLine,
uint32_t dwCreationFlags,
void* lpEnvironment,
const uint16_t* lpCurrentDirectory,
void* lpStartupInfo,
void* lpProcessInformation);
C, "ADVAPI32.dll");
// $ffi->CreateProcessWithTokenW(hToken, dwLogonFlags, lpApplicationName, lpCommandLine, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
// hToken : HANDLE
// dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS
// lpApplicationName : LPCWSTR optional
// lpCommandLine : LPWSTR optional, in/out
// dwCreationFlags : PROCESS_CREATION_FLAGS
// lpEnvironment : void* optional
// lpCurrentDirectory : LPCWSTR optional
// lpStartupInfo : STARTUPINFOW*
// lpProcessInformation : PROCESS_INFORMATION* out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Advapi32 extends StdCallLibrary {
Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class);
boolean CreateProcessWithTokenW(
Pointer hToken, // HANDLE
int dwLogonFlags, // CREATE_PROCESS_LOGON_FLAGS
WString lpApplicationName, // LPCWSTR optional
char[] lpCommandLine, // LPWSTR optional, in/out
int dwCreationFlags, // PROCESS_CREATION_FLAGS
Pointer lpEnvironment, // void* optional
WString lpCurrentDirectory, // LPCWSTR optional
Pointer lpStartupInfo, // STARTUPINFOW*
Pointer lpProcessInformation // PROCESS_INFORMATION* out
);
}@[Link("advapi32")]
lib LibADVAPI32
fun CreateProcessWithTokenW = CreateProcessWithTokenW(
hToken : Void*, # HANDLE
dwLogonFlags : UInt32, # CREATE_PROCESS_LOGON_FLAGS
lpApplicationName : UInt16*, # LPCWSTR optional
lpCommandLine : UInt16*, # LPWSTR optional, in/out
dwCreationFlags : UInt32, # PROCESS_CREATION_FLAGS
lpEnvironment : Void*, # void* optional
lpCurrentDirectory : UInt16*, # LPCWSTR optional
lpStartupInfo : STARTUPINFOW*, # STARTUPINFOW*
lpProcessInformation : PROCESS_INFORMATION* # PROCESS_INFORMATION* out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef CreateProcessWithTokenWNative = Int32 Function(Pointer<Void>, Uint32, Pointer<Utf16>, Pointer<Utf16>, Uint32, Pointer<Void>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
typedef CreateProcessWithTokenWDart = int Function(Pointer<Void>, int, Pointer<Utf16>, Pointer<Utf16>, int, Pointer<Void>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>);
final CreateProcessWithTokenW = DynamicLibrary.open('ADVAPI32.dll')
.lookupFunction<CreateProcessWithTokenWNative, CreateProcessWithTokenWDart>('CreateProcessWithTokenW');
// hToken : HANDLE -> Pointer<Void>
// dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> Uint32
// lpApplicationName : LPCWSTR optional -> Pointer<Utf16>
// lpCommandLine : LPWSTR optional, in/out -> Pointer<Utf16>
// dwCreationFlags : PROCESS_CREATION_FLAGS -> Uint32
// lpEnvironment : void* optional -> Pointer<Void>
// lpCurrentDirectory : LPCWSTR optional -> Pointer<Utf16>
// lpStartupInfo : STARTUPINFOW* -> Pointer<Void>
// lpProcessInformation : PROCESS_INFORMATION* out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function CreateProcessWithTokenW(
hToken: THandle; // HANDLE
dwLogonFlags: DWORD; // CREATE_PROCESS_LOGON_FLAGS
lpApplicationName: PWideChar; // LPCWSTR optional
lpCommandLine: PWideChar; // LPWSTR optional, in/out
dwCreationFlags: DWORD; // PROCESS_CREATION_FLAGS
lpEnvironment: Pointer; // void* optional
lpCurrentDirectory: PWideChar; // LPCWSTR optional
lpStartupInfo: Pointer; // STARTUPINFOW*
lpProcessInformation: Pointer // PROCESS_INFORMATION* out
): BOOL; stdcall;
external 'ADVAPI32.dll' name 'CreateProcessWithTokenW';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "CreateProcessWithTokenW"
c_CreateProcessWithTokenW :: Ptr () -> Word32 -> CWString -> CWString -> Word32 -> Ptr () -> CWString -> Ptr () -> Ptr () -> IO CInt
-- hToken : HANDLE -> Ptr ()
-- dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> Word32
-- lpApplicationName : LPCWSTR optional -> CWString
-- lpCommandLine : LPWSTR optional, in/out -> CWString
-- dwCreationFlags : PROCESS_CREATION_FLAGS -> Word32
-- lpEnvironment : void* optional -> Ptr ()
-- lpCurrentDirectory : LPCWSTR optional -> CWString
-- lpStartupInfo : STARTUPINFOW* -> Ptr ()
-- lpProcessInformation : PROCESS_INFORMATION* out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let createprocesswithtokenw =
foreign "CreateProcessWithTokenW"
((ptr void) @-> uint32_t @-> (ptr uint16_t) @-> (ptr uint16_t) @-> uint32_t @-> (ptr void) @-> (ptr uint16_t) @-> (ptr void) @-> (ptr void) @-> returning int32_t)
(* hToken : HANDLE -> (ptr void) *)
(* dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> uint32_t *)
(* lpApplicationName : LPCWSTR optional -> (ptr uint16_t) *)
(* lpCommandLine : LPWSTR optional, in/out -> (ptr uint16_t) *)
(* dwCreationFlags : PROCESS_CREATION_FLAGS -> uint32_t *)
(* lpEnvironment : void* optional -> (ptr void) *)
(* lpCurrentDirectory : LPCWSTR optional -> (ptr uint16_t) *)
(* lpStartupInfo : STARTUPINFOW* -> (ptr void) *)
(* lpProcessInformation : PROCESS_INFORMATION* out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)
(cffi:defcfun ("CreateProcessWithTokenW" create-process-with-token-w :convention :stdcall) :int32
(h-token :pointer) ; HANDLE
(dw-logon-flags :uint32) ; CREATE_PROCESS_LOGON_FLAGS
(lp-application-name (:string :encoding :utf-16le)) ; LPCWSTR optional
(lp-command-line :pointer) ; LPWSTR optional, in/out
(dw-creation-flags :uint32) ; PROCESS_CREATION_FLAGS
(lp-environment :pointer) ; void* optional
(lp-current-directory (:string :encoding :utf-16le)) ; LPCWSTR optional
(lp-startup-info :pointer) ; STARTUPINFOW*
(lp-process-information :pointer)) ; PROCESS_INFORMATION* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $CreateProcessWithTokenW = Win32::API::More->new('ADVAPI32',
'BOOL CreateProcessWithTokenW(HANDLE hToken, DWORD dwLogonFlags, LPCWSTR lpApplicationName, LPWSTR lpCommandLine, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPVOID lpStartupInfo, LPVOID lpProcessInformation)');
# my $ret = $CreateProcessWithTokenW->Call($hToken, $dwLogonFlags, $lpApplicationName, $lpCommandLine, $dwCreationFlags, $lpEnvironment, $lpCurrentDirectory, $lpStartupInfo, $lpProcessInformation);
# hToken : HANDLE -> HANDLE
# dwLogonFlags : CREATE_PROCESS_LOGON_FLAGS -> DWORD
# lpApplicationName : LPCWSTR optional -> LPCWSTR
# lpCommandLine : LPWSTR optional, in/out -> LPWSTR
# dwCreationFlags : PROCESS_CREATION_FLAGS -> DWORD
# lpEnvironment : void* optional -> LPVOID
# lpCurrentDirectory : LPCWSTR optional -> LPCWSTR
# lpStartupInfo : STARTUPINFOW* -> LPVOID
# lpProcessInformation : PROCESS_INFORMATION* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f CloseHandle — オープンされたオブジェクトハンドルを閉じる。
- f CreateEnvironmentBlock — 指定ユーザートークンに基づく環境ブロックを作成する。
- f ExitProcess — 現在のプロセスを指定終了コードで終了する。
- f GetExitCodeProcess — 指定プロセスの終了コードを取得する。
- f OpenProcess — 指定プロセスIDの既存プロセスを開いてハンドルを取得する。
- f SetErrorMode — 重大エラー時のシステム既定処理を制御するエラーモードを設定する。
- f WaitForInputIdle — プロセスが入力待ちのアイドル状態になるまで待機する。