ホーム › System.Threading › SetProcessDynamicEnforcedCetCompatibleRanges
SetProcessDynamicEnforcedCetCompatibleRanges
関数プロセスのCET強制適用対象アドレス範囲を動的に設定する。
シグネチャ
// KERNEL32.dll
#include <windows.h>
BOOL SetProcessDynamicEnforcedCetCompatibleRanges(
HANDLE Process,
WORD NumberOfRanges,
PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* Ranges
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| Process | HANDLE | in | プロセスのハンドル。このハンドルには PROCESS_SET_INFORMATION アクセス権が必要です。 詳細については、Process Security and Access Rights を参照してください。 |
| NumberOfRanges | WORD | in | 設定する動的な強制 CETCOMPAT 範囲の数を指定します。 |
| Ranges | PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* | inout | 動的な強制 CETCOMPAT 範囲の配列へのポインター。この構造体の詳細については、PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE を参照してください。 |
戻り値の型: BOOL
公式ドキュメント
指定したプロセスに対して、動的な強制 CETCOMPAT 範囲を設定します。
戻り値
関数が成功した場合、戻り値は 0 以外の値になります。
関数が失敗した場合、戻り値は 0 になります。拡張エラー情報を取得するには、 GetLastError を呼び出します。 関数が失敗した場合でも、指定された CETCOMPAT 範囲の一部が正常に処理されている可能性がある点に注意してください。 呼び出し元は、Ranges で指定した個々の CETCOMPAT 範囲のフラグを確認し、その範囲が正常に処理されたかどうかを判断する必要があります。
解説(Remarks)
ユーザーモードのハードウェア強制スタック保護 (HSP) は、ハードウェアがサポートしている場合に、シャドウ スタック機構を利用して CPU が実行時に関数の戻りアドレスを検証するセキュリティ機能です。 HSP 互換モードでは、シャドウ スタックと互換性があると見なされるモジュール (CETCOMPAT) で発生したシャドウ スタック違反のみが致命的になります。 モジュールが CETCOMPAT と見なされるには、バイナリの場合は CETCOMPAT を指定してコンパイルされているか、動的コードの場合は SetProcessDynamicEnforcedCetCompatibleRanges によってマークされている必要があります。 HSP 厳格モードでは、すべてのシャドウ スタック違反が致命的になります。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// KERNEL32.dll
#include <windows.h>
BOOL SetProcessDynamicEnforcedCetCompatibleRanges(
HANDLE Process,
WORD NumberOfRanges,
PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* Ranges
);[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", ExactSpelling = true)]
static extern bool SetProcessDynamicEnforcedCetCompatibleRanges(
IntPtr Process, // HANDLE
ushort NumberOfRanges, // WORD
IntPtr Ranges // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
);<DllImport("KERNEL32.dll", ExactSpelling:=True)>
Public Shared Function SetProcessDynamicEnforcedCetCompatibleRanges(
Process As IntPtr, ' HANDLE
NumberOfRanges As UShort, ' WORD
Ranges As IntPtr ' PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function' Process : HANDLE
' NumberOfRanges : WORD
' Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
Declare PtrSafe Function SetProcessDynamicEnforcedCetCompatibleRanges Lib "kernel32" ( _
ByVal Process As LongPtr, _
ByVal NumberOfRanges As Integer, _
ByVal Ranges As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
SetProcessDynamicEnforcedCetCompatibleRanges = ctypes.windll.kernel32.SetProcessDynamicEnforcedCetCompatibleRanges
SetProcessDynamicEnforcedCetCompatibleRanges.restype = wintypes.BOOL
SetProcessDynamicEnforcedCetCompatibleRanges.argtypes = [
wintypes.HANDLE, # Process : HANDLE
ctypes.c_ushort, # NumberOfRanges : WORD
ctypes.c_void_p, # Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('KERNEL32.dll')
SetProcessDynamicEnforcedCetCompatibleRanges = Fiddle::Function.new(
lib['SetProcessDynamicEnforcedCetCompatibleRanges'],
[
Fiddle::TYPE_VOIDP, # Process : HANDLE
-Fiddle::TYPE_SHORT, # NumberOfRanges : WORD
Fiddle::TYPE_VOIDP, # Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
],
Fiddle::TYPE_INT)#[link(name = "kernel32")]
extern "system" {
fn SetProcessDynamicEnforcedCetCompatibleRanges(
Process: *mut core::ffi::c_void, // HANDLE
NumberOfRanges: u16, // WORD
Ranges: *mut PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll")]
public static extern bool SetProcessDynamicEnforcedCetCompatibleRanges(IntPtr Process, ushort NumberOfRanges, IntPtr Ranges);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_SetProcessDynamicEnforcedCetCompatibleRanges' -Namespace Win32 -PassThru
# $api::SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges)#uselib "KERNEL32.dll"
#func global SetProcessDynamicEnforcedCetCompatibleRanges "SetProcessDynamicEnforcedCetCompatibleRanges" sptr, sptr, sptr
; SetProcessDynamicEnforcedCetCompatibleRanges Process, NumberOfRanges, varptr(Ranges) ; 戻り値は stat
; Process : HANDLE -> "sptr"
; NumberOfRanges : WORD -> "sptr"
; Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。出力引数:
#uselib "KERNEL32.dll" #cfunc global SetProcessDynamicEnforcedCetCompatibleRanges "SetProcessDynamicEnforcedCetCompatibleRanges" sptr, int, var ; res = SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges) ; Process : HANDLE -> "sptr" ; NumberOfRanges : WORD -> "int" ; Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。#uselib "KERNEL32.dll" #cfunc global SetProcessDynamicEnforcedCetCompatibleRanges "SetProcessDynamicEnforcedCetCompatibleRanges" sptr, int, sptr ; res = SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, varptr(Ranges)) ; Process : HANDLE -> "sptr" ; NumberOfRanges : WORD -> "int" ; Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。
出力引数:
; BOOL SetProcessDynamicEnforcedCetCompatibleRanges(HANDLE Process, WORD NumberOfRanges, PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* Ranges) #uselib "KERNEL32.dll" #cfunc global SetProcessDynamicEnforcedCetCompatibleRanges "SetProcessDynamicEnforcedCetCompatibleRanges" intptr, int, var ; res = SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges) ; Process : HANDLE -> "intptr" ; NumberOfRanges : WORD -> "int" ; Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; BOOL SetProcessDynamicEnforcedCetCompatibleRanges(HANDLE Process, WORD NumberOfRanges, PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* Ranges) #uselib "KERNEL32.dll" #cfunc global SetProcessDynamicEnforcedCetCompatibleRanges "SetProcessDynamicEnforcedCetCompatibleRanges" intptr, int, intptr ; res = SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, varptr(Ranges)) ; Process : HANDLE -> "intptr" ; NumberOfRanges : WORD -> "int" ; Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
procSetProcessDynamicEnforcedCetCompatibleRanges = kernel32.NewProc("SetProcessDynamicEnforcedCetCompatibleRanges")
)
// Process (HANDLE), NumberOfRanges (WORD), Ranges (PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out)
r1, _, err := procSetProcessDynamicEnforcedCetCompatibleRanges.Call(
uintptr(Process),
uintptr(NumberOfRanges),
uintptr(Ranges),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // BOOLfunction SetProcessDynamicEnforcedCetCompatibleRanges(
Process: THandle; // HANDLE
NumberOfRanges: Word; // WORD
Ranges: Pointer // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
): BOOL; stdcall;
external 'KERNEL32.dll' name 'SetProcessDynamicEnforcedCetCompatibleRanges';result := DllCall("KERNEL32\SetProcessDynamicEnforcedCetCompatibleRanges"
, "Ptr", Process ; HANDLE
, "UShort", NumberOfRanges ; WORD
, "Ptr", Ranges ; PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
, "Int") ; return: BOOL●SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges) = DLL("KERNEL32.dll", "bool SetProcessDynamicEnforcedCetCompatibleRanges(void*, int, void*)")
# 呼び出し: SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges)
# Process : HANDLE -> "void*"
# NumberOfRanges : WORD -> "int"
# Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "kernel32" fn SetProcessDynamicEnforcedCetCompatibleRanges(
Process: ?*anyopaque, // HANDLE
NumberOfRanges: u16, // WORD
Ranges: [*c]PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
) callconv(std.os.windows.WINAPI) i32;proc SetProcessDynamicEnforcedCetCompatibleRanges(
Process: pointer, # HANDLE
NumberOfRanges: uint16, # WORD
Ranges: ptr PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE # PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
): int32 {.importc: "SetProcessDynamicEnforcedCetCompatibleRanges", stdcall, dynlib: "KERNEL32.dll".}pragma(lib, "kernel32");
extern(Windows)
int SetProcessDynamicEnforcedCetCompatibleRanges(
void* Process, // HANDLE
ushort NumberOfRanges, // WORD
PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* Ranges // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
);ccall((:SetProcessDynamicEnforcedCetCompatibleRanges, "KERNEL32.dll"), stdcall, Int32,
(Ptr{Cvoid}, UInt16, Ptr{PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE}),
Process, NumberOfRanges, Ranges)
# Process : HANDLE -> Ptr{Cvoid}
# NumberOfRanges : WORD -> UInt16
# Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> Ptr{PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
int32_t SetProcessDynamicEnforcedCetCompatibleRanges(
void* Process,
uint16_t NumberOfRanges,
void* Ranges);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges)
-- Process : HANDLE
-- NumberOfRanges : WORD
-- Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const SetProcessDynamicEnforcedCetCompatibleRanges = lib.func('__stdcall', 'SetProcessDynamicEnforcedCetCompatibleRanges', 'int32_t', ['void *', 'uint16_t', 'void *']);
// SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges)
// Process : HANDLE -> 'void *'
// NumberOfRanges : WORD -> 'uint16_t'
// Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("KERNEL32.dll", {
SetProcessDynamicEnforcedCetCompatibleRanges: { parameters: ["pointer", "u16", "pointer"], result: "i32" },
});
// lib.symbols.SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges)
// Process : HANDLE -> "pointer"
// NumberOfRanges : WORD -> "u16"
// Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
int32_t SetProcessDynamicEnforcedCetCompatibleRanges(
void* Process,
uint16_t NumberOfRanges,
void* Ranges);
C, "KERNEL32.dll");
// $ffi->SetProcessDynamicEnforcedCetCompatibleRanges(Process, NumberOfRanges, Ranges);
// Process : HANDLE
// NumberOfRanges : WORD
// Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/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 Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
boolean SetProcessDynamicEnforcedCetCompatibleRanges(
Pointer Process, // HANDLE
short NumberOfRanges, // WORD
Pointer Ranges // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
);
}@[Link("kernel32")]
lib LibKERNEL32
fun SetProcessDynamicEnforcedCetCompatibleRanges = SetProcessDynamicEnforcedCetCompatibleRanges(
Process : Void*, # HANDLE
NumberOfRanges : UInt16, # WORD
Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* # PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef SetProcessDynamicEnforcedCetCompatibleRangesNative = Int32 Function(Pointer<Void>, Uint16, Pointer<Void>);
typedef SetProcessDynamicEnforcedCetCompatibleRangesDart = int Function(Pointer<Void>, int, Pointer<Void>);
final SetProcessDynamicEnforcedCetCompatibleRanges = DynamicLibrary.open('KERNEL32.dll')
.lookupFunction<SetProcessDynamicEnforcedCetCompatibleRangesNative, SetProcessDynamicEnforcedCetCompatibleRangesDart>('SetProcessDynamicEnforcedCetCompatibleRanges');
// Process : HANDLE -> Pointer<Void>
// NumberOfRanges : WORD -> Uint16
// Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function SetProcessDynamicEnforcedCetCompatibleRanges(
Process: THandle; // HANDLE
NumberOfRanges: Word; // WORD
Ranges: Pointer // PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
): BOOL; stdcall;
external 'KERNEL32.dll' name 'SetProcessDynamicEnforcedCetCompatibleRanges';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "SetProcessDynamicEnforcedCetCompatibleRanges"
c_SetProcessDynamicEnforcedCetCompatibleRanges :: Ptr () -> Word16 -> Ptr () -> IO CInt
-- Process : HANDLE -> Ptr ()
-- NumberOfRanges : WORD -> Word16
-- Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let setprocessdynamicenforcedcetcompatibleranges =
foreign "SetProcessDynamicEnforcedCetCompatibleRanges"
((ptr void) @-> uint16_t @-> (ptr void) @-> returning int32_t)
(* Process : HANDLE -> (ptr void) *)
(* NumberOfRanges : WORD -> uint16_t *)
(* Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)
(cffi:defcfun ("SetProcessDynamicEnforcedCetCompatibleRanges" set-process-dynamic-enforced-cet-compatible-ranges :convention :stdcall) :int32
(process :pointer) ; HANDLE
(number-of-ranges :uint16) ; WORD
(ranges :pointer)) ; PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $SetProcessDynamicEnforcedCetCompatibleRanges = Win32::API::More->new('KERNEL32',
'BOOL SetProcessDynamicEnforcedCetCompatibleRanges(HANDLE Process, WORD NumberOfRanges, LPVOID Ranges)');
# my $ret = $SetProcessDynamicEnforcedCetCompatibleRanges->Call($Process, $NumberOfRanges, $Ranges);
# Process : HANDLE -> HANDLE
# NumberOfRanges : WORD -> WORD
# Ranges : PROCESS_DYNAMIC_ENFORCED_ADDRESS_RANGE* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。