Win32 API 日本語リファレンス
ホームSystem.Threading › UpdateProcThreadAttribute

UpdateProcThreadAttribute

関数
プロセス/スレッド属性リストに属性を設定する。
DLLKERNEL32.dll呼出規約winapiSetLastErrorあり対応OSWindows Vista 以降

シグネチャ

// 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
);

パラメーター

名前方向説明
lpAttributeListLPPROC_THREAD_ATTRIBUTE_LISTinoutInitializeProcThreadAttributeList 関数によって作成された属性リストへのポインターです。
dwFlagsDWORDinこのパラメーターは予約されており、ゼロを指定する必要があります。
AttributeUINT_PTRin

属性リスト内で更新する属性キーです。このパラメーターには次のいずれかの値を指定できます。

意味
PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY
lpValue パラメーターは、新しいスレッドのプロセッサグループアフィニティを指定する GROUP_AFFINITY 構造体へのポインターです。

Windows 7 以降および Windows Server 2008 R2 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_HANDLE_LIST
lpValue パラメーターは、子プロセスが継承するハンドルのリストへのポインターです。

これらのハンドルは継承可能なハンドルとして作成する必要があり、GetCurrentProcessGetCurrentThread 関数が返すような疑似ハンドルを含めることはできません。

注意 この属性を使用する場合は、CreateProcess 関数の bInheritHandles パラメーターに TRUE を渡してください。
PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR
lpValue パラメーターは、新しいスレッドの理想プロセッサを指定する PROCESSOR_NUMBER 構造体へのポインターです。

Windows 7 以降および Windows Server 2008 R2 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_MACHINE_TYPE
lpValue パラメーターは、子プロセスのマシンアーキテクチャを指定する WORD へのポインターです。

Windows 11 以降でサポートされます。

lpValue が指す WORD には、IMAGE FILE MACHINE CONSTANTS に記載されている値を指定できます。

PROC_THREAD_ATTRIBUTE_MITIGATION_POLICY
lpValue パラメーターは、子プロセスのエクスプロイト緩和ポリシーを指定する DWORD または DWORD64 へのポインターです。Windows 10 バージョン 1703 以降では、このパラメーターは 2 要素の DWORD64 配列へのポインターにすることもできます。

指定したポリシーは、アプリケーションおよびシステムに設定されたポリシーよりも優先され、子プロセスの実行開始後は変更できません。

lpValue が指す DWORD または DWORD64 には、注釈に記載されている値を 1 つ以上指定できます。

Windows 7 以降および Windows Server 2008 R2 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_PARENT_PROCESS
lpValue パラメーターは、作成されるプロセスの親として(呼び出し元プロセスの代わりに)使用するプロセスのハンドルへのポインターです。使用するプロセスのハンドルには PROCESS_CREATE_PROCESS アクセス権が必要です。

指定したプロセスから継承される属性には、ハンドル、デバイスマップ、プロセッサアフィニティ、優先度、クォータ、プロセストークン、ジョブオブジェクトが含まれます。(デバッグポートなどの一部の属性は、このハンドルで指定したプロセスではなく、作成元のプロセスから引き継がれる点に注意してください。)

PROC_THREAD_ATTRIBUTE_PREFERRED_NODE
lpValue パラメーターは、新しいプロセスの優先 NUMA ノードのノード番号へのポインターです。

Windows 7 以降および Windows Server 2008 R2 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_UMS_THREAD
lpValue パラメーターは、スレッドに関連付けるユーザーモードスケジューリング (UMS) スレッドコンテキストと UMS 完了リストを指定する UMS_CREATE_THREAD_ATTRIBUTES 構造体へのポインターです。

UMS スレッドの作成後、システムはそれを指定された完了リストにキューイングします。UMS スレッドは、アプリケーションの UMS スケジューラーが完了リストから UMS スレッドを取得し、実行対象として選択したときにのみ実行されます。詳細については、User-Mode Scheduling を参照してください。

Windows 7 以降および Windows Server 2008 R2 以降でサポートされます。

Windows 11 以降ではサポートされません(User-Mode Scheduling を参照)。

PROC_THREAD_ATTRIBUTE_SECURITY_CAPABILITIES
lpValue パラメーターは、アプリコンテナーのセキュリティ機能を定義する SECURITY_CAPABILITIES 構造体へのポインターです。この属性を設定すると、新しいプロセスは AppContainer プロセスとして作成されます。

Windows 8 以降および Windows Server 2012 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_PROTECTION_LEVEL
lpValue パラメーターは、PROTECTION_LEVEL_SAME という DWORD 値へのポインターです。これは、子プロセスの保護レベルを親プロセスの保護レベルと同じにすることを指定します。

Windows 8.1 以降および Windows Server 2012 R2 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_CHILD_PROCESS_POLICY
lpValue パラメーターは、子プロセスポリシーを指定する DWORD 値へのポインターです。このポリシーは、子プロセスの作成を許可するかどうかを指定します。

lpValue が指す DWORD に指定可能な値については、「注釈」を参照してください。

Windows 10 以降および Windows Server 2016 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_DESKTOP_APP_POLICY
この属性は、Desktop Bridge を使用して UWP パッケージに変換された win32 アプリケーションにのみ関係します。

lpValue パラメーターは、デスクトップアプリポリシーを指定する DWORD 値へのポインターです。このポリシーは、子孫プロセスをデスクトップ環境で実行し続けるかどうかを指定します。

lpValue が指す DWORD に指定可能な値については、「注釈」を参照してください。

Windows 10 バージョン 1703 以降および Windows Server バージョン 1709 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_JOB_LIST
lpValue パラメーターは、指定した順序で子プロセスに割り当てるジョブハンドルのリストへのポインターです。

Windows 10 以降および Windows Server 2016 以降でサポートされます。

PROC_THREAD_ATTRIBUTE_ENABLE_OPTIONAL_XSTATE_FEATURES
lpValue パラメーターは、新しいスレッドで有効にするオプションの XState 機能のセットを指定する DWORD64 値へのポインターです。

Windows 11 以降および Windows Server 2022 以降でサポートされます。

lpValuevoid*inoptional属性値へのポインターです。この値は、DeleteProcThreadAttributeList 関数を使用して属性リストが破棄されるまで保持されている必要があります
cbSizeUINT_PTRinlpValue パラメーターで指定した属性値のサイズです。
lpPreviousValuevoid*outoptionalこのパラメーターは予約されており、NULL を指定する必要があります。
lpReturnSizeUINT_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 ポリシーの制御には次の緩和オプションを使用できます。

さらに、EXE/DLL が CFG を有効にしていることを強制するために、次のポリシーを指定できます。CFG を有効にしていない EXE/DLL を読み込もうとすると、読み込みは失敗します。
動的コードポリシーを有効にすると、プロセスが動的コードを生成したり実行可能コードを変更したりできなくなります。

動的コードポリシーには次の緩和オプションを使用できます。

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_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)
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)

非 CETCOMPAT/非 EHCONT バイナリの読み込みのブロック:

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)

動的コードのセキュリティプロパティを指定するために使用される特定の HSP API を、プロセス外からのみ呼び出し可能に制限する:

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)

FSCTL システムコール無効化ポリシーを有効にすると、プロセスが NtFsControlFile 呼び出しを行えなくなります。 FSCTL システムコール無効化ポリシーには次の緩和オプションを使用できます。

PROCESS_CREATION_MITIGATION_POLICY2_FSCTL_SYSTEM_CALL_DISABLE_ALWAYS_ON (0x00000001ui64 << 56)
PROCESS_CREATION_MITIGATION_POLICY2_FSCTL_SYSTEM_CALL_DISABLE_ALWAYS_OFF (0x00000002ui64 << 56)

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 の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 方式にも切替可。
出力引数:
; 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 方式にも切替可。
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   // BOOL
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';
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 を使用。

関連項目

公式の関連項目