SHCREATEPROCESSINFOW
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| cbSize | DWORD | 4 | +0 | +0 | この構造体のサイズ (バイト単位)。 |
| fMask | DWORD | 4 | +4 | +4 | 他のメンバーの内容と有効性を示すフラグの配列。次の値の組み合わせを指定できます。 SEE_MASK_CLASSKEYファイルのクラスレジストリキーを使用します。 SEE_MASK_CLASSNAMEファイルのクラス名を使用します。 SEE_MASK_CONNECTNETDRV共有を検証し、ドライブ文字に接続します。pszFile メンバーはネットワーク上のファイルの UNC パスです。 SEE_MASK_DOENVSUBST環境変数を展開します。 SEE_MASK_FLAG_DDEWAIT制御を返す前に、DDE 会話が終了するまで待機します。 SEE_MASK_FLAG_NO_UIエラーが発生してもエラーメッセージボックスを表示しません。 SEE_MASK_HMONITORマルチモニターシステムでモニターを指定する場合に、このフラグを使用します。 SEE_MASK_NOCLOSEPROCESSアプリケーションがプロセスを閉じます。lpProcessInformation メンバーが有効な PROCESS_INFORMATION ポインターであり、SEE_MASK_NOCLOSEPROCESS が設定されている場合、SHCreateProcessAsUserW が制御を返した後もプロセスは開いたままになります。PROCESS_INFORMATION 構造体の hProcess メンバーと hThread メンバーには、それぞれプロセスハンドルとスレッドハンドルが格納されます。このフラグは通常、SHCreateProcessAsUserW で作成されたプロセスがいつ終了したかをアプリケーションが知ることができるようにするために設定します。DDE 会話によって実行が行われた場合など、ハンドルが返されないケースもあります。呼び出し側のアプリケーションは、ハンドルが不要になった時点でそれを閉じる責任があります。このフラグが設定されていない場合、lpProcessInformation が有効なポインターであっても、SHCreateProcessAsUserW が制御を返す前にプロセスは閉じられます。 SEE_MASK_NO_CONSOLE新しいプロセスに親のコンソールを継承させるのではなく、新しいコンソールを作成します。これは CreateProcess で CREATE_NEW_CONSOLE フラグを使用するのと同等です。 SEE_MASK_UNICODEUnicode アプリケーションであることを示します。 |
| hwnd | HWND | 8/4 | +8 | +8 | 親ウィンドウのハンドル。 |
| pszFile | LPWSTR | 8/4 | +16 | +12 | SHCreateProcessAsUserW が runas 動詞で指定された処理を実行する対象の実行可能ファイルを指定する、NULL 終端の Unicode 文字列へのポインター。runas 動詞は、そのファイルのクラスでサポートされている必要があります。 注意 ファイル名にパスが含まれていない場合は、現在のディレクトリが想定されます。
|
| pszParameters | LPWSTR | 8/4 | +24 | +16 | アプリケーションのパラメーターを含む、NULL 終端の Unicode 文字列へのポインター。パラメーターはスペースで区切る必要があります。 |
| pszCurrentDirectory | LPWSTR | 8/4 | +32 | +20 | 現在のディレクトリを含む、NULL 終端の Unicode 文字列。 |
| hUserToken | HANDLE | 8/4 | +40 | +24 | 特定のユーザーを表すために使用できるアクセストークン。単一のユーザーに属するものとして扱われるフォルダーに対して複数のユーザーが存在する場合に必要です。呼び出し側のアプリケーションは、TOKEN_QUERY および TOKEN_IMPERSONATE を含む、対象ユーザーに対する適切なセキュリティ特権を持っている必要があり、またそのユーザーのレジストリハイブが現在マウントされている必要があります。アクセス制御に関する問題の詳細については、アクセス制御を参照してください。 |
| lpProcessAttributes | SECURITY_ATTRIBUTES* | 8/4 | +48 | +28 | 新しいプロセスのセキュリティ記述子を持つ SECURITY_ATTRIBUTES 構造体へのポインター。子プロセスが継承可能かどうかも指定します。このパラメーターに NULL を設定した場合、プロセスは既定のセキュリティ記述子を持ち、ハンドルは継承できません。 セキュリティに関する警告: セキュリティ記述子を誤って使用すると、アプリケーションのセキュリティが損なわれる可能性があります。詳細については、SECURITY_ATTRIBUTES を参照してください。 |
| lpThreadAttributes | SECURITY_ATTRIBUTES* | 8/4 | +56 | +32 | 新しいスレッドのセキュリティ記述子を持つ SECURITY_ATTRIBUTES 構造体へのポインター。子プロセスが継承可能かどうかも指定します。このパラメーターに NULL を設定した場合、プロセスは既定のセキュリティ記述子を持ち、ハンドルは継承できません。 セキュリティに関する警告: セキュリティ記述子を誤って使用すると、アプリケーションのセキュリティが損なわれる可能性があります。詳細については、SECURITY_ATTRIBUTES を参照してください。 |
| bInheritHandles | BOOL | 4 | +64 | +36 | 新しいプロセスが呼び出し側プロセスからハンドルを継承するかどうかを示す値。TRUE に設定した場合、呼び出し側プロセス内の継承可能な開いているハンドルは、それぞれ新しいプロセスに継承されます。継承されたハンドルは、元のハンドルと同じ値およびアクセス特権を持ちます。 |
| dwCreationFlags | DWORD | 4 | +68 | +40 | プロセスの作成方法と優先度クラスを制御するフラグ。使用可能なフラグの一覧については、CreateProcessAsUser を参照してください。 |
| lpStartupInfo | STARTUPINFOW* | 8/4 | +72 | +44 | 新しいプロセスのメインウィンドウをどのように表示するかを指定する STARTUPINFO 構造体へのポインター。 |
| lpProcessInformation | PROCESS_INFORMATION* | 8/4 | +80 | +48 | 新しいプロセスに関する情報を受け取る PROCESS_INFORMATION 構造体へのポインター。このメンバーに有効な構造体へのポインターを設定し、fMask メンバーに SEE_MASK_NOCLOSEPROCESS フラグを設定すると、関数が制御を返した後もプロセスは開いたままになります。その場合、PROCESS_INFORMATION 構造体の hProcess メンバーと hThread メンバーには、それぞれプロセスハンドルとスレッドハンドルが格納されます。このメンバーに NULL を設定すると、関数が制御を返す前にプロセスは閉じられます。 |
公式ドキュメント
[SHCreateProcessAsUserW は Windows XP 以降のバージョンでは実装されていません。]
SHCreateProcessAsUserW がプロセスを作成するために必要な情報を格納します。
解説(Remarks)
pszParameters に二重引用符を含めるには、次の例のように、それぞれの引用符を引用符のペアで囲む必要があります。
sei.lpParameters = "An example: \"\"\"quoted text\"\"\"";
この場合、アプリケーションは An、example:、"quoted text" という 3 つのパラメーターを受け取ります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// SHCREATEPROCESSINFOW (x64 88 / x86 52 バイト)
#pragma pack(push, 1)
typedef struct SHCREATEPROCESSINFOW {
DWORD cbSize;
DWORD fMask;
HWND hwnd;
LPWSTR pszFile;
LPWSTR pszParameters;
LPWSTR pszCurrentDirectory;
HANDLE hUserToken;
SECURITY_ATTRIBUTES* lpProcessAttributes;
SECURITY_ATTRIBUTES* lpThreadAttributes;
BOOL bInheritHandles;
DWORD dwCreationFlags;
STARTUPINFOW* lpStartupInfo;
PROCESS_INFORMATION* lpProcessInformation;
} SHCREATEPROCESSINFOW;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct SHCREATEPROCESSINFOW
{
public uint cbSize;
public uint fMask;
public IntPtr hwnd;
public IntPtr pszFile;
public IntPtr pszParameters;
public IntPtr pszCurrentDirectory;
public IntPtr hUserToken;
public IntPtr lpProcessAttributes;
public IntPtr lpThreadAttributes;
[MarshalAs(UnmanagedType.Bool)] public bool bInheritHandles;
public uint dwCreationFlags;
public IntPtr lpStartupInfo;
public IntPtr lpProcessInformation;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure SHCREATEPROCESSINFOW
Public cbSize As UInteger
Public fMask As UInteger
Public hwnd As IntPtr
Public pszFile As IntPtr
Public pszParameters As IntPtr
Public pszCurrentDirectory As IntPtr
Public hUserToken As IntPtr
Public lpProcessAttributes As IntPtr
Public lpThreadAttributes As IntPtr
<MarshalAs(UnmanagedType.Bool)> Public bInheritHandles As Boolean
Public dwCreationFlags As UInteger
Public lpStartupInfo As IntPtr
Public lpProcessInformation As IntPtr
End Structureimport ctypes
from ctypes import wintypes
class SHCREATEPROCESSINFOW(ctypes.Structure):
_pack_ = 1
_fields_ = [
("cbSize", wintypes.DWORD),
("fMask", wintypes.DWORD),
("hwnd", ctypes.c_void_p),
("pszFile", ctypes.c_void_p),
("pszParameters", ctypes.c_void_p),
("pszCurrentDirectory", ctypes.c_void_p),
("hUserToken", ctypes.c_void_p),
("lpProcessAttributes", ctypes.c_void_p),
("lpThreadAttributes", ctypes.c_void_p),
("bInheritHandles", wintypes.BOOL),
("dwCreationFlags", wintypes.DWORD),
("lpStartupInfo", ctypes.c_void_p),
("lpProcessInformation", ctypes.c_void_p),
]#[repr(C, packed(1))]
pub struct SHCREATEPROCESSINFOW {
pub cbSize: u32,
pub fMask: u32,
pub hwnd: *mut core::ffi::c_void,
pub pszFile: *mut core::ffi::c_void,
pub pszParameters: *mut core::ffi::c_void,
pub pszCurrentDirectory: *mut core::ffi::c_void,
pub hUserToken: *mut core::ffi::c_void,
pub lpProcessAttributes: *mut core::ffi::c_void,
pub lpThreadAttributes: *mut core::ffi::c_void,
pub bInheritHandles: i32,
pub dwCreationFlags: u32,
pub lpStartupInfo: *mut core::ffi::c_void,
pub lpProcessInformation: *mut core::ffi::c_void,
}import "golang.org/x/sys/windows"
type SHCREATEPROCESSINFOW struct {
cbSize uint32
fMask uint32
hwnd uintptr
pszFile uintptr
pszParameters uintptr
pszCurrentDirectory uintptr
hUserToken uintptr
lpProcessAttributes uintptr
lpThreadAttributes uintptr
bInheritHandles int32
dwCreationFlags uint32
lpStartupInfo uintptr
lpProcessInformation uintptr
}type
SHCREATEPROCESSINFOW = packed record
cbSize: DWORD;
fMask: DWORD;
hwnd: Pointer;
pszFile: Pointer;
pszParameters: Pointer;
pszCurrentDirectory: Pointer;
hUserToken: Pointer;
lpProcessAttributes: Pointer;
lpThreadAttributes: Pointer;
bInheritHandles: BOOL;
dwCreationFlags: DWORD;
lpStartupInfo: Pointer;
lpProcessInformation: Pointer;
end;const SHCREATEPROCESSINFOW = extern struct {
cbSize: u32,
fMask: u32,
hwnd: ?*anyopaque,
pszFile: ?*anyopaque,
pszParameters: ?*anyopaque,
pszCurrentDirectory: ?*anyopaque,
hUserToken: ?*anyopaque,
lpProcessAttributes: ?*anyopaque,
lpThreadAttributes: ?*anyopaque,
bInheritHandles: i32,
dwCreationFlags: u32,
lpStartupInfo: ?*anyopaque,
lpProcessInformation: ?*anyopaque,
};type
SHCREATEPROCESSINFOW {.packed.} = object
cbSize: uint32
fMask: uint32
hwnd: pointer
pszFile: pointer
pszParameters: pointer
pszCurrentDirectory: pointer
hUserToken: pointer
lpProcessAttributes: pointer
lpThreadAttributes: pointer
bInheritHandles: int32
dwCreationFlags: uint32
lpStartupInfo: pointer
lpProcessInformation: pointeralign(1)
struct SHCREATEPROCESSINFOW
{
uint cbSize;
uint fMask;
void* hwnd;
void* pszFile;
void* pszParameters;
void* pszCurrentDirectory;
void* hUserToken;
void* lpProcessAttributes;
void* lpThreadAttributes;
int bInheritHandles;
uint dwCreationFlags;
void* lpStartupInfo;
void* lpProcessInformation;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SHCREATEPROCESSINFOW サイズ: 52 バイト(x86)
dim st, 13 ; 4byte整数×13(構造体サイズ 52 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; fMask : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; hwnd : HWND (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; pszFile : LPWSTR (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; pszParameters : LPWSTR (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; pszCurrentDirectory : LPWSTR (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; hUserToken : HANDLE (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; lpProcessAttributes : SECURITY_ATTRIBUTES* (+28, 4byte) varptr(st)+28 を基点に操作(4byte:入れ子/配列)
; lpThreadAttributes : SECURITY_ATTRIBUTES* (+32, 4byte) varptr(st)+32 を基点に操作(4byte:入れ子/配列)
; bInheritHandles : BOOL (+36, 4byte) st.9 = 値 / 値 = st.9 (lpoke/lpeek も可)
; dwCreationFlags : DWORD (+40, 4byte) st.10 = 値 / 値 = st.10 (lpoke/lpeek も可)
; lpStartupInfo : STARTUPINFOW* (+44, 4byte) varptr(st)+44 を基点に操作(4byte:入れ子/配列)
; lpProcessInformation : PROCESS_INFORMATION* (+48, 4byte) varptr(st)+48 を基点に操作(4byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SHCREATEPROCESSINFOW サイズ: 88 バイト(x64)
dim st, 22 ; 4byte整数×22(構造体サイズ 88 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; fMask : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; hwnd : HWND (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; pszFile : LPWSTR (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; pszParameters : LPWSTR (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; pszCurrentDirectory : LPWSTR (+32, 8byte) qpoke st,32,値 / qpeek(st,32) ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; hUserToken : HANDLE (+40, 8byte) qpoke st,40,値 / qpeek(st,40) ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; lpProcessAttributes : SECURITY_ATTRIBUTES* (+48, 8byte) varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; lpThreadAttributes : SECURITY_ATTRIBUTES* (+56, 8byte) varptr(st)+56 を基点に操作(8byte:入れ子/配列)
; bInheritHandles : BOOL (+64, 4byte) st.16 = 値 / 値 = st.16 (lpoke/lpeek も可)
; dwCreationFlags : DWORD (+68, 4byte) st.17 = 値 / 値 = st.17 (lpoke/lpeek も可)
; lpStartupInfo : STARTUPINFOW* (+72, 8byte) varptr(st)+72 を基点に操作(8byte:入れ子/配列)
; lpProcessInformation : PROCESS_INFORMATION* (+80, 8byte) varptr(st)+80 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global SHCREATEPROCESSINFOW, pack=1
#field int cbSize
#field int fMask
#field intptr hwnd
#field intptr pszFile
#field intptr pszParameters
#field intptr pszCurrentDirectory
#field intptr hUserToken
#field intptr lpProcessAttributes
#field intptr lpThreadAttributes
#field bool bInheritHandles
#field int dwCreationFlags
#field intptr lpStartupInfo
#field intptr lpProcessInformation
#endstruct
stdim st, SHCREATEPROCESSINFOW ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize