UpdateProcThreadAttribute
関数シグネチャ
// KERNEL32.dll
#include <windows.h>
BOOL UpdateProcThreadAttribute(
LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
DWORD dwFlags,
UINT_PTR Attribute,
void* lpValue, // optional
UINT_PTR cbSize,
void* lpPreviousValue, // optional
UINT_PTR* lpReturnSize // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| lpAttributeList | LPPROC_THREAD_ATTRIBUTE_LIST | inout | InitializeProcThreadAttributeList 関数によって作成された属性リストへのポインターです。 | ||||||||||||||||||||||||||||||
| dwFlags | DWORD | in | このパラメーターは予約されており、ゼロを指定する必要があります。 | ||||||||||||||||||||||||||||||
| Attribute | UINT_PTR | in | 属性リスト内で更新する属性キーです。このパラメーターには次のいずれかの値を指定できます。
| ||||||||||||||||||||||||||||||
| lpValue | void* | inoptional | 属性値へのポインターです。この値は、DeleteProcThreadAttributeList 関数を使用して属性リストが破棄されるまで保持されている必要があります。 | ||||||||||||||||||||||||||||||
| cbSize | UINT_PTR | in | lpValue パラメーターで指定した属性値のサイズです。 | ||||||||||||||||||||||||||||||
| lpPreviousValue | void* | outoptional | このパラメーターは予約されており、NULL を指定する必要があります。 | ||||||||||||||||||||||||||||||
| lpReturnSize | UINT_PTR* | inoptional | このパラメーターは予約されており、NULL を指定する必要があります。 |
戻り値の型: BOOL
公式ドキュメント
プロセスおよびスレッド作成用の属性リスト内で、指定した属性を更新します。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗すると、戻り値は 0 になります。拡張エラー情報を取得するには、 GetLastError を呼び出してください。
解説(Remarks)
属性リストは、属性ごとに 1 つずつ並んだ一連のキー/値ペアで構成される不透明な構造体です。プロセスは、このトピックで説明されている属性キーのみを更新できます。
Attribute パラメーターに PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY を指定する場合、lpValue が指す DWORD または DWORD64 には次の値を 1 つ以上指定できます。
- PROCESS_CREATION_MITIGATION_POLICY_DEP_ENABLE (0x00000001)子プロセスでデータ実行防止 (DEP) を有効にします。詳細については、Data Execution Prevention を参照してください。
- PROCESS_CREATION_MITIGATION_POLICY_DEP_ATL_THUNK_ENABLE (0x00000002)子プロセスで DEP-ATL サンクエミュレーションを有効にします。DEP-ATL サンクエミュレーションでは、Active Template Library (ATL) サンクレイヤーから発生する NX フォールトをシステムがインターセプトします。この値は PROCESS_CREATION_MITIGATION_POLICY_DEP_ENABLE と組み合わせた場合にのみ指定できます。
- PROCESS_CREATION_MITIGATION_POLICY_SEHOP_ENABLE (0x00000004)子プロセスで構造化例外ハンドラー上書き保護 (SEHOP) を有効にします。SEHOP は、構造化例外ハンドラー (SEH) 上書き手法を使用するエクスプロイトをブロックします。
-
Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista: 次の値は Windows 8 および Windows Server 2012 までサポートされません。
-
強制アドレス空間レイアウトランダム化 (ASLR) ポリシーを有効にすると、動的ベースに非対応のイメージを、読み込み時にイメージベースの衝突が発生したかのように扱うことで強制的に再ベース化します。再配置が必要な場合、ベース再配置セクションを持たないイメージは読み込まれません。
強制 ASLR ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_FORCE_RELOCATE_IMAGES_ALWAYS_ON (0x00000001 << 8)
- PROCESS_CREATION_MITIGATION_POLICY_FORCE_RELOCATE_IMAGES_ALWAYS_OFF (0x00000002 << 8)
- PROCESS_CREATION_MITIGATION_POLICY_FORCE_RELOCATE_IMAGES_ALWAYS_ON_REQ_RELOCS (0x00000003 << 8)
-
破損時ヒープ終了ポリシーを有効にすると、ヒープが破損した場合にヒープを終了させます。なお、'always off' を指定しても、イメージヘッダーで現行のサブシステムバージョンが設定されているバイナリのデフォルトのオプトインは上書きされません。破損時ヒープ終了はユーザーモードで強制されます。
破損時ヒープ終了ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_HEAP_TERMINATE_ALWAYS_ON (0x00000001 << 12)
- PROCESS_CREATION_MITIGATION_POLICY_HEAP_TERMINATE_ALWAYS_OFF (0x00000002 << 12)
-
ボトムアップランダム化ポリシー(スタックランダム化オプションを含む)は、ユーザーアドレスの最下位としてランダムな場所を使用させます。
ボトムアップランダム化ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_BOTTOM_UP_ASLR_ALWAYS_ON (0x00000001 << 16)
- PROCESS_CREATION_MITIGATION_POLICY_BOTTOM_UP_ASLR_ALWAYS_OFF (0x00000002 << 16)
-
高エントロピーボトムアップランダム化ポリシーを有効にすると、最大 1TB のボトムアップ変動が使用されます。高エントロピーボトムアップランダム化はボトムアップ ASLR も有効な場合にのみ効果があり、ネイティブ 64 ビットプロセスでのみ意味を持つ点に注意してください。
高エントロピーボトムアップランダム化ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_HIGH_ENTROPY_ASLR_ALWAYS_ON (0x00000001 << 20)
- PROCESS_CREATION_MITIGATION_POLICY_HIGH_ENTROPY_ASLR_ALWAYS_OFF (0x00000002 << 20)
-
厳格ハンドルチェック適用ポリシーを有効にすると、不正なハンドル参照が発生した時点で直ちに例外が発生します。このポリシーを有効にしない場合、ハンドル参照からは失敗ステータスが返されます。
厳格ハンドルチェック適用ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_STRICT_HANDLE_CHECKS_ALWAYS_ON (0x00000001 << 24)
- PROCESS_CREATION_MITIGATION_POLICY_STRICT_HANDLE_CHECKS_ALWAYS_OFF (0x00000002 << 24)
-
Win32k システムコール無効化ポリシーを有効にすると、プロセスが Win32k 呼び出しを行えなくなります。
Win32k システムコール無効化ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_WIN32K_SYSTEM_CALL_DISABLE_ALWAYS_ON (0x00000001 << 28)
- PROCESS_CREATION_MITIGATION_POLICY_WIN32K_SYSTEM_CALL_DISABLE_ALWAYS_OFF (0x00000002 << 28)
-
拡張ポイント無効化ポリシーを有効にすると、特定の組み込みサードパーティ拡張ポイントが使用されなくなります。このポリシーは次の拡張ポイントをブロックします。
- AppInit DLL
- Winsock 階層化サービスプロバイダー (LSP)
- グローバル Windows フック
- レガシ入力方式エディター (IME)
拡張ポイント無効化ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_EXTENSION_POINT_DISABLE_ALWAYS_ON (0x00000001 << 32)
- PROCESS_CREATION_MITIGATION_POLICY_EXTENSION_POINT_DISABLE_ALWAYS_OFF (0x00000002 << 32)
-
Control Flow Guard (CFG) ポリシーを有効にすると、CFG を有効にしてビルドされたコード内の間接呼び出しに追加の制限が課されます。
CFG ポリシーの制御には次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_CONTROL_FLOW_GUARD_MASK (0x00000003ui64 << 40)
- PROCESS_CREATION_MITIGATION_POLICY_CONTROL_FLOW_GUARD_DEFER (0x00000000ui64 << 40)
- PROCESS_CREATION_MITIGATION_POLICY_CONTROL_FLOW_GUARD_ALWAYS_ON (0x00000001ui64 << 40)
- PROCESS_CREATION_MITIGATION_POLICY_CONTROL_FLOW_GUARD_ALWAYS_OFF (0x00000002ui64 << 40)
- PROCESS_CREATION_MITIGATION_POLICY_CONTROL_FLOW_GUARD_EXPORT_SUPPRESSION (0x00000003ui64 << 40)
-
さらに、EXE/DLL が CFG を有効にしていることを強制するために、次のポリシーを指定できます。CFG を有効にしていない EXE/DLL を読み込もうとすると、読み込みは失敗します。
- PROCESS_CREATION_MITIGATION_POLICY2_STRICT_CONTROL_FLOW_GUARD_MASK (0x00000003ui64 << 8)
- PROCESS_CREATION_MITIGATION_POLICY2_STRICT_CONTROL_FLOW_GUARD_DEFER (0x00000000ui64 << 8)
- PROCESS_CREATION_MITIGATION_POLICY2_STRICT_CONTROL_FLOW_GUARD_ALWAYS_ON (0x00000001ui64 << 8)
- PROCESS_CREATION_MITIGATION_POLICY2_STRICT_CONTROL_FLOW_GUARD_ALWAYS_OFF (0x00000002ui64 << 8)
- PROCESS_CREATION_MITIGATION_POLICY2_STRICT_CONTROL_FLOW_GUARD_RESERVED (0x00000003ui64 << 8)
-
動的コードポリシーを有効にすると、プロセスが動的コードを生成したり実行可能コードを変更したりできなくなります。
動的コードポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_MASK (0x00000003ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_DEFER (0x00000000ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_ON (0x00000001ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_OFF (0x00000002ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY_PROHIBIT_DYNAMIC_CODE_ALWAYS_ON_ALLOW_OPT_OUT (0x00000003ui64 << 36)
-
バイナリ署名ポリシーは、EXE/DLL が適切に署名されていることを要求します。
バイナリ署名ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_MASK (0x00000003ui64 << 44)
- PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_DEFER (0x00000000ui64 << 44)
- PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_ON (0x00000001ui64 << 44)
- PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALWAYS_OFF (0x00000002ui64 << 44)
- PROCESS_CREATION_MITIGATION_POLICY_BLOCK_NON_MICROSOFT_BINARIES_ALLOW_STORE (0x00000003ui64 << 44)
-
プロセスのフォント読み込み防止ポリシーは、プロセスに対して非システムフォントを読み込めるかどうかを決定します。このポリシーを有効にすると、プロセスは非システムフォントを読み込めなくなります。
フォント読み込み防止ポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_FONT_DISABLE_MASK (0x00000003ui64 << 48)
- PROCESS_CREATION_MITIGATION_POLICY_FONT_DISABLE_DEFER (0x00000000ui64 << 48)
- PROCESS_CREATION_MITIGATION_POLICY_FONT_DISABLE_ALWAYS_ON (0x00000001ui64 << 48)
- PROCESS_CREATION_MITIGATION_POLICY_FONT_DISABLE_ALWAYS_OFF (0x00000002ui64 << 48)
- PROCESS_CREATION_MITIGATION_POLICY_AUDIT_NONSYSTEM_FONTS (0x00000003ui64 << 48)
-
プロセスのイメージ読み込みポリシーは、プロセスにマップできる実行可能イメージの種類を決定します。このポリシーを有効にすると、リムーバブルデバイスや、Low の必須ラベルを持つファイルなど、一部の場所からイメージを読み込めなくなります。
イメージ読み込みポリシーには次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_MASK (0x00000003ui64 << 52)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_DEFER (0x00000000ui64 << 52)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_ALWAYS_ON (0x00000001ui64 << 52)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_ALWAYS_OFF (0x00000002ui64 << 52)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_REMOTE_RESERVED (0x00000003ui64 << 52)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_MASK (0x00000003ui64 << 56)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_DEFER (0x00000000ui64 << 56)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_ALWAYS_ON (0x00000001ui64 << 56)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_ALWAYS_OFF (0x00000002ui64 << 56)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_NO_LOW_LABEL_RESERVED (0x00000003ui64 << 56)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_MASK (0x00000003ui64 << 60)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_DEFER (0x00000000ui64 << 60)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON (0x00000001ui64 << 60)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_OFF (0x00000002ui64 << 60)
- PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_RESERVED (0x00000003ui64 << 60)
-
強制アドレス空間レイアウトランダム化 (ASLR) ポリシーを有効にすると、動的ベースに非対応のイメージを、読み込み時にイメージベースの衝突が発生したかのように扱うことで強制的に再ベース化します。再配置が必要な場合、ベース再配置セクションを持たないイメージは読み込まれません。
-
Windows 10 バージョン 1709: 次の値は Windows 10 バージョン 1709 以降でのみ利用可能であり、かつ 2018 年 1 月の Windows セキュリティ更新プログラムと、OEM デバイス製造元から提供される該当ファームウェア更新プログラムが適用されている場合にのみ利用できます。投機的実行サイドチャネル脆弱性から保護するための IT プロ向け Windows クライアントガイダンスを参照してください。
-
- PROCESS_CREATION_MITIGATION_POLICY2_RESTRICT_INDIRECT_BRANCH_PREDICTION_ALWAYS_ON (0x00000001ui64 << 16)このフラグは、兄弟ハードウェアスレッド(ハイパースレッド)が間接分岐予測に干渉するのを防ぐためにプロセスが使用できます。アドレス空間に機密情報を持つプロセスは、間接分岐予測を悪用する攻撃(CVE-2017-5715 など)から保護するために、このフラグの有効化を検討してください。
-
-
Windows 10 バージョン 1809: 次の値は Windows 10 バージョン 1809 以降でのみ利用可能です。
-
- PROCESS_CREATION_MITIGATION_POLICY2_SPECULATIVE_STORE_BYPASS_DISABLE_ALWAYS_ON (0x00000001ui64 << 24)このフラグは、SSB を悪用する投機的実行サイドチャネル攻撃(CVE-2018-3639)に対して脆弱な可能性のある CPU の Speculative Store Bypass (SSB) 機能を無効にするためにプロセスが使用できます。このフラグは、必要なハードウェア機能を備えた特定の Intel CPU でのみサポートされます。この機能をサポートしない CPU では、このフラグは効果を持ちません。
-
Windows 10 バージョン 2004: 次の値は Windows 10 バージョン 2004 以降でのみ利用可能です。
ハードウェア強制スタック保護 (HSP) は、シャドウスタック機構を用いて CPU が実行時に関数の戻りアドレスを検証するハードウェアベースのセキュリティ機能です。 ユーザーモード HSP のデフォルトモードは互換モードであり、シャドウスタックと互換性があるとみなされるモジュール (CETCOMPAT) で発生したシャドウスタック違反のみが致命的となります。 厳格モードでは、すべてのシャドウスタック違反が致命的となります。
ユーザーモードのハードウェア強制スタック保護および関連機能には次の緩和オプションを使用できます。
- PROCESS_CREATION_MITIGATION_POLICY2_CET_USER_SHADOW_STACKS_ALWAYS_ON (0x00000001ui64 << 28)
- PROCESS_CREATION_MITIGATION_POLICY2_CET_USER_SHADOW_STACKS_ALWAYS_OFF (0x00000002ui64 << 28)
- PROCESS_CREATION_MITIGATION_POLICY2_CET_USER_SHADOW_STACKS_STRICT_MODE (0x00000003ui64 << 28)
- PROCESS_CREATION_MITIGATION_POLICY2_USER_CET_SET_CONTEXT_IP_VALIDATION_ALWAYS_ON (0x00000001ui64 << 32)
- PROCESS_CREATION_MITIGATION_POLICY2_USER_CET_SET_CONTEXT_IP_VALIDATION_ALWAYS_OFF (0x00000002ui64 << 32)
- PROCESS_CREATION_MITIGATION_POLICY2_USER_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE (0x00000003ui64 << 32)
- PROCESS_CREATION_MITIGATION_POLICY2_BLOCK_NON_CET_BINARIES_ALWAYS_ON (0x00000001ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY2_BLOCK_NON_CET_BINARIES_ALWAYS_OFF (0x00000002ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY2_BLOCK_NON_CET_BINARIES_NON_EHCONT (0x00000003ui64 << 36)
- PROCESS_CREATION_MITIGATION_POLICY2_CET_DYNAMIC_APIS_OUT_OF_PROC_ONLY_ALWAYS_ON (0x00000001ui64 << 48)
- PROCESS_CREATION_MITIGATION_POLICY2_CET_DYNAMIC_APIS_OUT_OF_PROC_ONLY_ALWAYS_OFF (0x00000002ui64 << 48)
- PROCESS_CREATION_MITIGATION_POLICY2_FSCTL_SYSTEM_CALL_DISABLE_ALWAYS_ON (0x00000001ui64 << 56)
- PROCESS_CREATION_MITIGATION_POLICY2_FSCTL_SYSTEM_CALL_DISABLE_ALWAYS_OFF (0x00000002ui64 << 56)
命令ポインター検証:
非 CETCOMPAT/非 EHCONT バイナリの読み込みのブロック:
動的コードのセキュリティプロパティを指定するために使用される特定の HSP API を、プロセス外からのみ呼び出し可能に制限する:
FSCTL システムコール無効化ポリシーを有効にすると、プロセスが NtFsControlFile 呼び出しを行えなくなります。 FSCTL システムコール無効化ポリシーには次の緩和オプションを使用できます。
Attribute パラメーターに PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY を指定する場合、lpValue が指す DWORD には次の値を 1 つ以上指定できます。
PROCESS_CREATION_CHILD_PROCESS_RESTRICTED 0x01
作成されるプロセスは、子プロセスの作成を許可されません。この制限は、プロセスが実行されるトークンのプロパティになります。この制限は、特権プロセスハンドルがプロセスからアクセスできないことを保証するサンドボックス化されたアプリケーション(AppContainer など)でのみ有効である点に注意してください。たとえば、子プロセス作成を制限されているプロセスが、PROCESS_CREATE_PROCESS または PROCESS_VM_WRITE アクセス権を持つ別のプロセスハンドルにアクセスできる場合、子プロセス制限を回避できる可能性があります。
PROCESS_CREATION_CHILD_PROCESS_OVERRIDE 0x02
作成されるプロセスは、本来であれば制限される場合でも子プロセスの作成を許可されます。この値は、新しいプロセスを作成するプロセスが制限されていない場合にのみ指定できます。
Attribute パラメーターに PROC_THREAD_ATTRIBUTE_DESKTOP_APP_POLICY を指定する場合、lpValue が指す DWORD には次の値を 1 つ以上指定できます。
PROCESS_CREATION_DESKTOP_APP_BREAKAWAY_ENABLE_PROCESS_TREE 0x01
作成されるプロセスは、子プロセスをすべてデスクトップアプリランタイム環境の外で作成します。この動作は、ポリシーが設定されていないプロセスのデフォルトです。
PROCESS_CREATION_DESKTOP_APP_BREAKAWAY_DISABLE_PROCESS_TREE 0x02
作成されるプロセスは、子プロセスをすべてデスクトップアプリランタイム環境の内部で作成します。このポリシーは、PROCESS_CREATION_DESKTOP_APP_BREAKAWAY_ENABLE_PROCESS_TREE を指定してプロセスを作成することで上書きされるまで、子孫プロセスに継承されます。
PROCESS_CREATION_DESKTOP_APP_BREAKAWAY_OVERRIDE 0x04
作成されるプロセスは、デスクトップアプリランタイム環境の内部で実行されます。このポリシーは、作成されるプロセスにのみ適用され、その子孫には適用されません。
親プロセスと同じ保護レベルで子プロセスを起動するには、親プロセスが子プロセスに対して PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL 属性を指定する必要があります。これは保護されたプロセスと保護されていないプロセスの両方で使用できます。たとえば、保護されていないプロセスがこのフラグを使用すると、システムは保護されていないレベルで子プロセスを起動します。いずれの場合も CREATE_PROTECTED_PROCESS フラグを指定する必要があります。
次の例では、親プロセスと同じ保護レベルで子プロセスを起動します。
DWORD ProtectionLevel = PROTECTION_LEVEL_SAME;
SIZE_T AttributeListSize;
STARTUPINFOEXW StartupInfoEx = { 0 };
StartupInfoEx.StartupInfo.cb = sizeof(StartupInfoEx);
InitializeProcThreadAttributeList(NULL, 1, 0, &AttributeListSize)
StartupInfoEx.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST) HeapAlloc(
GetProcessHeap(),
0,
AttributeListSize
);
if (InitializeProcThreadAttributeList(StartupInfoEx.lpAttributeList,
1,
0,
&AttributeListSize) == FALSE)
{
Result = GetLastError();
goto exitFunc;
}
if (UpdateProcThreadAttribute(StartupInfoEx.lpAttributeList,
0,
PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL,
&ProtectionLevel,
sizeof(ProtectionLevel),
NULL,
NULL) == FALSE)
{
Result = GetLastError();
goto exitFunc;
}
PROCESS_INFORMATION ProcessInformation = { 0 };
if (CreateProcessW(ApplicationName,
CommandLine,
ProcessAttributes,
ThreadAttributes,
InheritHandles,
EXTENDED_STARTUPINFO_PRESENT | CREATE_PROTECTED_PROCESS,
Environment,
CurrentDirectory,
(LPSTARTUPINFOW)&StartupInfoEx,
&ProcessInformation) == FALSE)
{
Result = GetLastError();
goto exitFunc;
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// KERNEL32.dll
#include <windows.h>
BOOL UpdateProcThreadAttribute(
LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
DWORD dwFlags,
UINT_PTR Attribute,
void* lpValue, // optional
UINT_PTR cbSize,
void* lpPreviousValue, // optional
UINT_PTR* lpReturnSize // optional
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool UpdateProcThreadAttribute(
IntPtr lpAttributeList, // LPPROC_THREAD_ATTRIBUTE_LIST in/out
uint dwFlags, // DWORD
UIntPtr Attribute, // UINT_PTR
IntPtr lpValue, // void* optional
UIntPtr cbSize, // UINT_PTR
IntPtr lpPreviousValue, // void* optional, out
IntPtr lpReturnSize // UINT_PTR* optional
);<DllImport("KERNEL32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function UpdateProcThreadAttribute(
lpAttributeList As IntPtr, ' LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags As UInteger, ' DWORD
Attribute As UIntPtr, ' UINT_PTR
lpValue As IntPtr, ' void* optional
cbSize As UIntPtr, ' UINT_PTR
lpPreviousValue As IntPtr, ' void* optional, out
lpReturnSize As IntPtr ' UINT_PTR* optional
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out
' dwFlags : DWORD
' Attribute : UINT_PTR
' lpValue : void* optional
' cbSize : UINT_PTR
' lpPreviousValue : void* optional, out
' lpReturnSize : UINT_PTR* optional
Declare PtrSafe Function UpdateProcThreadAttribute Lib "kernel32" ( _
ByVal lpAttributeList As LongPtr, _
ByVal dwFlags As Long, _
ByVal Attribute As LongPtr, _
ByVal lpValue As LongPtr, _
ByVal cbSize As LongPtr, _
ByVal lpPreviousValue As LongPtr, _
ByVal lpReturnSize As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
UpdateProcThreadAttribute = ctypes.windll.kernel32.UpdateProcThreadAttribute
UpdateProcThreadAttribute.restype = wintypes.BOOL
UpdateProcThreadAttribute.argtypes = [
wintypes.HANDLE, # lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out
wintypes.DWORD, # dwFlags : DWORD
ctypes.c_size_t, # Attribute : UINT_PTR
ctypes.POINTER(None), # lpValue : void* optional
ctypes.c_size_t, # cbSize : UINT_PTR
ctypes.POINTER(None), # lpPreviousValue : void* optional, out
ctypes.POINTER(ctypes.c_size_t), # lpReturnSize : UINT_PTR* optional
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('KERNEL32.dll')
UpdateProcThreadAttribute = Fiddle::Function.new(
lib['UpdateProcThreadAttribute'],
[
Fiddle::TYPE_VOIDP, # lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out
-Fiddle::TYPE_INT, # dwFlags : DWORD
Fiddle::TYPE_UINTPTR_T, # Attribute : UINT_PTR
Fiddle::TYPE_VOIDP, # lpValue : void* optional
Fiddle::TYPE_UINTPTR_T, # cbSize : UINT_PTR
Fiddle::TYPE_VOIDP, # lpPreviousValue : void* optional, out
Fiddle::TYPE_VOIDP, # lpReturnSize : UINT_PTR* optional
],
Fiddle::TYPE_INT)#[link(name = "kernel32")]
extern "system" {
fn UpdateProcThreadAttribute(
lpAttributeList: *mut core::ffi::c_void, // LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags: u32, // DWORD
Attribute: usize, // UINT_PTR
lpValue: *mut (), // void* optional
cbSize: usize, // UINT_PTR
lpPreviousValue: *mut (), // void* optional, out
lpReturnSize: *mut usize // UINT_PTR* optional
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", SetLastError = true)]
public static extern bool UpdateProcThreadAttribute(IntPtr lpAttributeList, uint dwFlags, UIntPtr Attribute, IntPtr lpValue, UIntPtr cbSize, IntPtr lpPreviousValue, IntPtr lpReturnSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_UpdateProcThreadAttribute' -Namespace Win32 -PassThru
# $api::UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize)#uselib "KERNEL32.dll"
#func global UpdateProcThreadAttribute "UpdateProcThreadAttribute" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; UpdateProcThreadAttribute lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, varptr(lpReturnSize) ; 戻り値は stat
; lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "sptr"
; dwFlags : DWORD -> "sptr"
; Attribute : UINT_PTR -> "sptr"
; lpValue : void* optional -> "sptr"
; cbSize : UINT_PTR -> "sptr"
; lpPreviousValue : void* optional, out -> "sptr"
; lpReturnSize : UINT_PTR* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "KERNEL32.dll" #cfunc global UpdateProcThreadAttribute "UpdateProcThreadAttribute" sptr, int, sptr, sptr, sptr, sptr, var ; res = UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize) ; lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "sptr" ; dwFlags : DWORD -> "int" ; Attribute : UINT_PTR -> "sptr" ; lpValue : void* optional -> "sptr" ; cbSize : UINT_PTR -> "sptr" ; lpPreviousValue : void* optional, out -> "sptr" ; lpReturnSize : UINT_PTR* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "KERNEL32.dll" #cfunc global UpdateProcThreadAttribute "UpdateProcThreadAttribute" sptr, int, sptr, sptr, sptr, sptr, sptr ; res = UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, varptr(lpReturnSize)) ; lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "sptr" ; dwFlags : DWORD -> "int" ; Attribute : UINT_PTR -> "sptr" ; lpValue : void* optional -> "sptr" ; cbSize : UINT_PTR -> "sptr" ; lpPreviousValue : void* optional, out -> "sptr" ; lpReturnSize : UINT_PTR* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
; BOOL UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwFlags, UINT_PTR Attribute, void* lpValue, UINT_PTR cbSize, void* lpPreviousValue, UINT_PTR* lpReturnSize) #uselib "KERNEL32.dll" #cfunc global UpdateProcThreadAttribute "UpdateProcThreadAttribute" intptr, int, intptr, intptr, intptr, intptr, var ; res = UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize) ; lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "intptr" ; dwFlags : DWORD -> "int" ; Attribute : UINT_PTR -> "intptr" ; lpValue : void* optional -> "intptr" ; cbSize : UINT_PTR -> "intptr" ; lpPreviousValue : void* optional, out -> "intptr" ; lpReturnSize : UINT_PTR* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL UpdateProcThreadAttribute(LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList, DWORD dwFlags, UINT_PTR Attribute, void* lpValue, UINT_PTR cbSize, void* lpPreviousValue, UINT_PTR* lpReturnSize) #uselib "KERNEL32.dll" #cfunc global UpdateProcThreadAttribute "UpdateProcThreadAttribute" intptr, int, intptr, intptr, intptr, intptr, intptr ; res = UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, varptr(lpReturnSize)) ; lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "intptr" ; dwFlags : DWORD -> "int" ; Attribute : UINT_PTR -> "intptr" ; lpValue : void* optional -> "intptr" ; cbSize : UINT_PTR -> "intptr" ; lpPreviousValue : void* optional, out -> "intptr" ; lpReturnSize : UINT_PTR* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
procUpdateProcThreadAttribute = kernel32.NewProc("UpdateProcThreadAttribute")
)
// lpAttributeList (LPPROC_THREAD_ATTRIBUTE_LIST in/out), dwFlags (DWORD), Attribute (UINT_PTR), lpValue (void* optional), cbSize (UINT_PTR), lpPreviousValue (void* optional, out), lpReturnSize (UINT_PTR* optional)
r1, _, err := procUpdateProcThreadAttribute.Call(
uintptr(lpAttributeList),
uintptr(dwFlags),
uintptr(Attribute),
uintptr(lpValue),
uintptr(cbSize),
uintptr(lpPreviousValue),
uintptr(lpReturnSize),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction UpdateProcThreadAttribute(
lpAttributeList: THandle; // LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags: DWORD; // DWORD
Attribute: NativeUInt; // UINT_PTR
lpValue: Pointer; // void* optional
cbSize: NativeUInt; // UINT_PTR
lpPreviousValue: Pointer; // void* optional, out
lpReturnSize: Pointer // UINT_PTR* optional
): BOOL; stdcall;
external 'KERNEL32.dll' name 'UpdateProcThreadAttribute';result := DllCall("KERNEL32\UpdateProcThreadAttribute"
, "Ptr", lpAttributeList ; LPPROC_THREAD_ATTRIBUTE_LIST in/out
, "UInt", dwFlags ; DWORD
, "UPtr", Attribute ; UINT_PTR
, "Ptr", lpValue ; void* optional
, "UPtr", cbSize ; UINT_PTR
, "Ptr", lpPreviousValue ; void* optional, out
, "Ptr", lpReturnSize ; UINT_PTR* optional
, "Int") ; return: BOOL●UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize) = DLL("KERNEL32.dll", "bool UpdateProcThreadAttribute(void*, dword, int, void*, int, void*, void*)")
# 呼び出し: UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize)
# lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "void*"
# dwFlags : DWORD -> "dword"
# Attribute : UINT_PTR -> "int"
# lpValue : void* optional -> "void*"
# cbSize : UINT_PTR -> "int"
# lpPreviousValue : void* optional, out -> "void*"
# lpReturnSize : UINT_PTR* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "kernel32" fn UpdateProcThreadAttribute(
lpAttributeList: ?*anyopaque, // LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags: u32, // DWORD
Attribute: usize, // UINT_PTR
lpValue: ?*anyopaque, // void* optional
cbSize: usize, // UINT_PTR
lpPreviousValue: ?*anyopaque, // void* optional, out
lpReturnSize: [*c]usize // UINT_PTR* optional
) callconv(std.os.windows.WINAPI) i32;proc UpdateProcThreadAttribute(
lpAttributeList: pointer, # LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags: uint32, # DWORD
Attribute: uint, # UINT_PTR
lpValue: pointer, # void* optional
cbSize: uint, # UINT_PTR
lpPreviousValue: pointer, # void* optional, out
lpReturnSize: ptr uint # UINT_PTR* optional
): int32 {.importc: "UpdateProcThreadAttribute", stdcall, dynlib: "KERNEL32.dll".}pragma(lib, "kernel32");
extern(Windows)
int UpdateProcThreadAttribute(
void* lpAttributeList, // LPPROC_THREAD_ATTRIBUTE_LIST in/out
uint dwFlags, // DWORD
size_t Attribute, // UINT_PTR
void* lpValue, // void* optional
size_t cbSize, // UINT_PTR
void* lpPreviousValue, // void* optional, out
size_t* lpReturnSize // UINT_PTR* optional
);ccall((:UpdateProcThreadAttribute, "KERNEL32.dll"), stdcall, Int32,
(Ptr{Cvoid}, UInt32, Csize_t, Ptr{Cvoid}, Csize_t, Ptr{Cvoid}, Ptr{Csize_t}),
lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize)
# lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> Ptr{Cvoid}
# dwFlags : DWORD -> UInt32
# Attribute : UINT_PTR -> Csize_t
# lpValue : void* optional -> Ptr{Cvoid}
# cbSize : UINT_PTR -> Csize_t
# lpPreviousValue : void* optional, out -> Ptr{Cvoid}
# lpReturnSize : UINT_PTR* optional -> Ptr{Csize_t}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t UpdateProcThreadAttribute(
void* lpAttributeList,
uint32_t dwFlags,
uintptr_t Attribute,
void* lpValue,
uintptr_t cbSize,
void* lpPreviousValue,
uintptr_t* lpReturnSize);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize)
-- lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out
-- dwFlags : DWORD
-- Attribute : UINT_PTR
-- lpValue : void* optional
-- cbSize : UINT_PTR
-- lpPreviousValue : void* optional, out
-- lpReturnSize : UINT_PTR* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const UpdateProcThreadAttribute = lib.func('__stdcall', 'UpdateProcThreadAttribute', 'int32_t', ['void *', 'uint32_t', 'uintptr_t', 'void *', 'uintptr_t', 'void *', 'uintptr_t *']);
// UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize)
// lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> 'void *'
// dwFlags : DWORD -> 'uint32_t'
// Attribute : UINT_PTR -> 'uintptr_t'
// lpValue : void* optional -> 'void *'
// cbSize : UINT_PTR -> 'uintptr_t'
// lpPreviousValue : void* optional, out -> 'void *'
// lpReturnSize : UINT_PTR* optional -> 'uintptr_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("KERNEL32.dll", {
UpdateProcThreadAttribute: { parameters: ["pointer", "u32", "usize", "pointer", "usize", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize)
// lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> "pointer"
// dwFlags : DWORD -> "u32"
// Attribute : UINT_PTR -> "usize"
// lpValue : void* optional -> "pointer"
// cbSize : UINT_PTR -> "usize"
// lpPreviousValue : void* optional, out -> "pointer"
// lpReturnSize : UINT_PTR* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t UpdateProcThreadAttribute(
void* lpAttributeList,
uint32_t dwFlags,
size_t Attribute,
void* lpValue,
size_t cbSize,
void* lpPreviousValue,
size_t* lpReturnSize);
C, "KERNEL32.dll");
// $ffi->UpdateProcThreadAttribute(lpAttributeList, dwFlags, Attribute, lpValue, cbSize, lpPreviousValue, lpReturnSize);
// lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out
// dwFlags : DWORD
// Attribute : UINT_PTR
// lpValue : void* optional
// cbSize : UINT_PTR
// lpPreviousValue : void* optional, out
// lpReturnSize : UINT_PTR* optional
// 構造体/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 Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
boolean UpdateProcThreadAttribute(
Pointer lpAttributeList, // LPPROC_THREAD_ATTRIBUTE_LIST in/out
int dwFlags, // DWORD
long Attribute, // UINT_PTR
Pointer lpValue, // void* optional
long cbSize, // UINT_PTR
Pointer lpPreviousValue, // void* optional, out
LongByReference lpReturnSize // UINT_PTR* optional
);
}@[Link("kernel32")]
lib LibKERNEL32
fun UpdateProcThreadAttribute = UpdateProcThreadAttribute(
lpAttributeList : Void*, # LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags : UInt32, # DWORD
Attribute : LibC::SizeT, # UINT_PTR
lpValue : Void*, # void* optional
cbSize : LibC::SizeT, # UINT_PTR
lpPreviousValue : Void*, # void* optional, out
lpReturnSize : LibC::SizeT* # UINT_PTR* optional
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef UpdateProcThreadAttributeNative = Int32 Function(Pointer<Void>, Uint32, UintPtr, Pointer<Void>, UintPtr, Pointer<Void>, Pointer<UintPtr>);
typedef UpdateProcThreadAttributeDart = int Function(Pointer<Void>, int, int, Pointer<Void>, int, Pointer<Void>, Pointer<UintPtr>);
final UpdateProcThreadAttribute = DynamicLibrary.open('KERNEL32.dll')
.lookupFunction<UpdateProcThreadAttributeNative, UpdateProcThreadAttributeDart>('UpdateProcThreadAttribute');
// lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> Pointer<Void>
// dwFlags : DWORD -> Uint32
// Attribute : UINT_PTR -> UintPtr
// lpValue : void* optional -> Pointer<Void>
// cbSize : UINT_PTR -> UintPtr
// lpPreviousValue : void* optional, out -> Pointer<Void>
// lpReturnSize : UINT_PTR* optional -> Pointer<UintPtr>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function UpdateProcThreadAttribute(
lpAttributeList: THandle; // LPPROC_THREAD_ATTRIBUTE_LIST in/out
dwFlags: DWORD; // DWORD
Attribute: NativeUInt; // UINT_PTR
lpValue: Pointer; // void* optional
cbSize: NativeUInt; // UINT_PTR
lpPreviousValue: Pointer; // void* optional, out
lpReturnSize: Pointer // UINT_PTR* optional
): BOOL; stdcall;
external 'KERNEL32.dll' name 'UpdateProcThreadAttribute';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "UpdateProcThreadAttribute"
c_UpdateProcThreadAttribute :: Ptr () -> Word32 -> CUIntPtr -> Ptr () -> CUIntPtr -> Ptr () -> Ptr CUIntPtr -> IO CInt
-- lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> Ptr ()
-- dwFlags : DWORD -> Word32
-- Attribute : UINT_PTR -> CUIntPtr
-- lpValue : void* optional -> Ptr ()
-- cbSize : UINT_PTR -> CUIntPtr
-- lpPreviousValue : void* optional, out -> Ptr ()
-- lpReturnSize : UINT_PTR* optional -> Ptr CUIntPtr
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let updateprocthreadattribute =
foreign "UpdateProcThreadAttribute"
((ptr void) @-> uint32_t @-> size_t @-> (ptr void) @-> size_t @-> (ptr void) @-> (ptr size_t) @-> returning int32_t)
(* lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> (ptr void) *)
(* dwFlags : DWORD -> uint32_t *)
(* Attribute : UINT_PTR -> size_t *)
(* lpValue : void* optional -> (ptr void) *)
(* cbSize : UINT_PTR -> size_t *)
(* lpPreviousValue : void* optional, out -> (ptr void) *)
(* lpReturnSize : UINT_PTR* optional -> (ptr size_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)
(cffi:defcfun ("UpdateProcThreadAttribute" update-proc-thread-attribute :convention :stdcall) :int32
(lp-attribute-list :pointer) ; LPPROC_THREAD_ATTRIBUTE_LIST in/out
(dw-flags :uint32) ; DWORD
(attribute :uint64) ; UINT_PTR
(lp-value :pointer) ; void* optional
(cb-size :uint64) ; UINT_PTR
(lp-previous-value :pointer) ; void* optional, out
(lp-return-size :pointer)) ; UINT_PTR* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $UpdateProcThreadAttribute = Win32::API::More->new('KERNEL32',
'BOOL UpdateProcThreadAttribute(HANDLE lpAttributeList, DWORD dwFlags, WPARAM Attribute, LPVOID lpValue, WPARAM cbSize, LPVOID lpPreviousValue, LPVOID lpReturnSize)');
# my $ret = $UpdateProcThreadAttribute->Call($lpAttributeList, $dwFlags, $Attribute, $lpValue, $cbSize, $lpPreviousValue, $lpReturnSize);
# lpAttributeList : LPPROC_THREAD_ATTRIBUTE_LIST in/out -> HANDLE
# dwFlags : DWORD -> DWORD
# Attribute : UINT_PTR -> WPARAM
# lpValue : void* optional -> LPVOID
# cbSize : UINT_PTR -> WPARAM
# lpPreviousValue : void* optional, out -> LPVOID
# lpReturnSize : UINT_PTR* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。関連項目
- f DeleteProcThreadAttributeList — プロセス/スレッド属性リストを破棄する。
- f InitializeProcThreadAttributeList — プロセス/スレッド属性リストを初期化する。