Win32 API 日本語リファレンス
ホームSecurity.Authorization › SetSecurityInfo

SetSecurityInfo

関数
ハンドルで指定したオブジェクトのセキュリティ情報を設定する。
DLLADVAPI32.dll呼出規約winapi対応OSWindows XP 以降

シグネチャ

// ADVAPI32.dll
#include <windows.h>

WIN32_ERROR SetSecurityInfo(
    HANDLE handle,
    SE_OBJECT_TYPE ObjectType,
    OBJECT_SECURITY_INFORMATION SecurityInfo,
    PSID psidOwner,   // optional
    PSID psidGroup,   // optional
    ACL* pDacl,   // optional
    ACL* pSacl   // optional
);

パラメーター

名前方向説明
handleHANDLEinセキュリティ情報を設定する対象オブジェクトのハンドルです。
ObjectTypeSE_OBJECT_TYPEinhandle パラメーターで識別されるオブジェクトの種類を示す SE_OBJECT_TYPE 列挙体のメンバーです。
SecurityInfoOBJECT_SECURITY_INFORMATIONin設定するセキュリティ情報の種類を示す ビットフラグのセットです。このパラメーターには SECURITY_INFORMATION ビットフラグの組み合わせを指定できます。
psidOwnerPSIDinoptionalオブジェクトの所有者を識別する SID へのポインターです。この SID は、セキュリティ記述子の所有者 SID として割り当て可能なものである必要があります。SecurityInfo パラメーターには OWNER_SECURITY_INFORMATION フラグを含める必要があります。所有者 SID を設定しない場合、このパラメーターは NULL にできます。
psidGroupPSIDinoptionalオブジェクトのプライマリグループを識別する SID へのポインターです。SecurityInfo パラメーターには GROUP_SECURITY_INFORMATION フラグを含める必要があります。プライマリグループの SID を設定しない場合、このパラメーターは NULL にできます。
pDaclACL*inoptionalオブジェクトの新しい DACL へのポインターです。このパラメーターは、SecurityInfo パラメーターの値に DACL_SECURITY_INFORMATION フラグが含まれていない限り無視されます。SecurityInfo パラメーターの値に DACL_SECURITY_INFORMATION フラグが含まれ、かつこのパラメーターの値が NULL に設定されている場合、すべてのユーザーにオブジェクトへのフルアクセスが付与されます。null DACL については、Creating a DACL を参照してください。
pSaclACL*inoptionalオブジェクトの新しい SACL へのポインターです。SecurityInfo パラメーターには、SACL_SECURITY_INFORMATIONLABEL_SECURITY_INFORMATIONATTRIBUTE_SECURITY_INFORMATIONSCOPE_SECURITY_INFORMATIONBACKUP_SECURITY_INFORMATION のいずれかのフラグを含める必要があります。SACL_SECURITY_INFORMATION または SCOPE_SECURITY_INFORMATION を設定する場合、呼び出し元は SE_SECURITY_NAME 特権を有効にしておく必要があります。SACL を設定しない場合、このパラメーターは NULL にできます。

戻り値の型: WIN32_ERROR

公式ドキュメント

指定したオブジェクトのセキュリティ記述子に、指定したセキュリティ情報を設定します。呼び出し元はハンドルによってオブジェクトを識別します。

戻り値

関数が成功した場合、ERROR_SUCCESS を返します。

関数が失敗した場合は、WinError.h で定義されている 0 以外のエラーコードを返します。

解説(Remarks)

オブジェクトの 任意アクセス制御リスト (DACL) または システムアクセス制御リスト (SACL) の任意の要素を設定すると、システムは ACE 継承規則 に従って、継承可能な アクセス制御エントリ (ACE) を既存の子オブジェクトへ自動的に伝播します。

SetSecurityInfo 関数は、次の種類のオブジェクトに対して使用できます。

SetSecurityInfo 関数は、アクセス許可またはアクセス拒否の ACE を推奨される順序に基づいて並べ替えることはありません。継承可能な ACE を既存の子オブジェクトへ伝播する際、SetSecurityInfo は、子オブジェクトの DACL 内のすべての非継承 ACE の後ろに、継承された ACE を配置します。

Note オブジェクトの子に対する共有アクセスが利用できない場合、この関数は保護されていない ACE を子に伝播しません。たとえば、ディレクトリが排他アクセスで開かれている場合、そのディレクトリのセキュリティが変更されても、オペレーティングシステムはそのサブディレクトリやファイルに対して保護されていない ACE を伝播しません。
Warning 指定された handleMAXIMUM_ALLOWEDACCESS_MASK 値で開かれていた場合、SetSecurityInfo 関数は ACE を子に伝播しません。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// ADVAPI32.dll
#include <windows.h>

WIN32_ERROR SetSecurityInfo(
    HANDLE handle,
    SE_OBJECT_TYPE ObjectType,
    OBJECT_SECURITY_INFORMATION SecurityInfo,
    PSID psidOwner,   // optional
    PSID psidGroup,   // optional
    ACL* pDacl,   // optional
    ACL* pSacl   // optional
);
[DllImport("ADVAPI32.dll", ExactSpelling = true)]
static extern uint SetSecurityInfo(
    IntPtr handle,   // HANDLE
    int ObjectType,   // SE_OBJECT_TYPE
    uint SecurityInfo,   // OBJECT_SECURITY_INFORMATION
    IntPtr psidOwner,   // PSID optional
    IntPtr psidGroup,   // PSID optional
    IntPtr pDacl,   // ACL* optional
    IntPtr pSacl   // ACL* optional
);
<DllImport("ADVAPI32.dll", ExactSpelling:=True)>
Public Shared Function SetSecurityInfo(
    handle As IntPtr,   ' HANDLE
    ObjectType As Integer,   ' SE_OBJECT_TYPE
    SecurityInfo As UInteger,   ' OBJECT_SECURITY_INFORMATION
    psidOwner As IntPtr,   ' PSID optional
    psidGroup As IntPtr,   ' PSID optional
    pDacl As IntPtr,   ' ACL* optional
    pSacl As IntPtr   ' ACL* optional
) As UInteger
End Function
' handle : HANDLE
' ObjectType : SE_OBJECT_TYPE
' SecurityInfo : OBJECT_SECURITY_INFORMATION
' psidOwner : PSID optional
' psidGroup : PSID optional
' pDacl : ACL* optional
' pSacl : ACL* optional
Declare PtrSafe Function SetSecurityInfo Lib "advapi32" ( _
    ByVal handle As LongPtr, _
    ByVal ObjectType As Long, _
    ByVal SecurityInfo As Long, _
    ByVal psidOwner As LongPtr, _
    ByVal psidGroup As LongPtr, _
    ByVal pDacl As LongPtr, _
    ByVal pSacl As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

SetSecurityInfo = ctypes.windll.advapi32.SetSecurityInfo
SetSecurityInfo.restype = wintypes.DWORD
SetSecurityInfo.argtypes = [
    wintypes.HANDLE,  # handle : HANDLE
    ctypes.c_int,  # ObjectType : SE_OBJECT_TYPE
    wintypes.DWORD,  # SecurityInfo : OBJECT_SECURITY_INFORMATION
    wintypes.HANDLE,  # psidOwner : PSID optional
    wintypes.HANDLE,  # psidGroup : PSID optional
    ctypes.c_void_p,  # pDacl : ACL* optional
    ctypes.c_void_p,  # pSacl : ACL* optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
SetSecurityInfo = Fiddle::Function.new(
  lib['SetSecurityInfo'],
  [
    Fiddle::TYPE_VOIDP,  # handle : HANDLE
    Fiddle::TYPE_INT,  # ObjectType : SE_OBJECT_TYPE
    -Fiddle::TYPE_INT,  # SecurityInfo : OBJECT_SECURITY_INFORMATION
    Fiddle::TYPE_VOIDP,  # psidOwner : PSID optional
    Fiddle::TYPE_VOIDP,  # psidGroup : PSID optional
    Fiddle::TYPE_VOIDP,  # pDacl : ACL* optional
    Fiddle::TYPE_VOIDP,  # pSacl : ACL* optional
  ],
  -Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn SetSecurityInfo(
        handle: *mut core::ffi::c_void,  // HANDLE
        ObjectType: i32,  // SE_OBJECT_TYPE
        SecurityInfo: u32,  // OBJECT_SECURITY_INFORMATION
        psidOwner: *mut core::ffi::c_void,  // PSID optional
        psidGroup: *mut core::ffi::c_void,  // PSID optional
        pDacl: *mut ACL,  // ACL* optional
        pSacl: *mut ACL  // ACL* optional
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("ADVAPI32.dll")]
public static extern uint SetSecurityInfo(IntPtr handle, int ObjectType, uint SecurityInfo, IntPtr psidOwner, IntPtr psidGroup, IntPtr pDacl, IntPtr pSacl);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_SetSecurityInfo' -Namespace Win32 -PassThru
# $api::SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
#uselib "ADVAPI32.dll"
#func global SetSecurityInfo "SetSecurityInfo" sptr, sptr, sptr, sptr, sptr, sptr, sptr
; SetSecurityInfo handle, ObjectType, SecurityInfo, psidOwner, psidGroup, varptr(pDacl), varptr(pSacl)   ; 戻り値は stat
; handle : HANDLE -> "sptr"
; ObjectType : SE_OBJECT_TYPE -> "sptr"
; SecurityInfo : OBJECT_SECURITY_INFORMATION -> "sptr"
; psidOwner : PSID optional -> "sptr"
; psidGroup : PSID optional -> "sptr"
; pDacl : ACL* optional -> "sptr"
; pSacl : ACL* optional -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global SetSecurityInfo "SetSecurityInfo" sptr, int, int, sptr, sptr, var, var
; res = SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
; handle : HANDLE -> "sptr"
; ObjectType : SE_OBJECT_TYPE -> "int"
; SecurityInfo : OBJECT_SECURITY_INFORMATION -> "int"
; psidOwner : PSID optional -> "sptr"
; psidGroup : PSID optional -> "sptr"
; pDacl : ACL* optional -> "var"
; pSacl : ACL* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; WIN32_ERROR SetSecurityInfo(HANDLE handle, SE_OBJECT_TYPE ObjectType, OBJECT_SECURITY_INFORMATION SecurityInfo, PSID psidOwner, PSID psidGroup, ACL* pDacl, ACL* pSacl)
#uselib "ADVAPI32.dll"
#cfunc global SetSecurityInfo "SetSecurityInfo" intptr, int, int, intptr, intptr, var, var
; res = SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
; handle : HANDLE -> "intptr"
; ObjectType : SE_OBJECT_TYPE -> "int"
; SecurityInfo : OBJECT_SECURITY_INFORMATION -> "int"
; psidOwner : PSID optional -> "intptr"
; psidGroup : PSID optional -> "intptr"
; pDacl : ACL* optional -> "var"
; pSacl : ACL* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procSetSecurityInfo = advapi32.NewProc("SetSecurityInfo")
)

// handle (HANDLE), ObjectType (SE_OBJECT_TYPE), SecurityInfo (OBJECT_SECURITY_INFORMATION), psidOwner (PSID optional), psidGroup (PSID optional), pDacl (ACL* optional), pSacl (ACL* optional)
r1, _, err := procSetSecurityInfo.Call(
	uintptr(handle),
	uintptr(ObjectType),
	uintptr(SecurityInfo),
	uintptr(psidOwner),
	uintptr(psidGroup),
	uintptr(pDacl),
	uintptr(pSacl),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // WIN32_ERROR
function SetSecurityInfo(
  handle: THandle;   // HANDLE
  ObjectType: Integer;   // SE_OBJECT_TYPE
  SecurityInfo: DWORD;   // OBJECT_SECURITY_INFORMATION
  psidOwner: THandle;   // PSID optional
  psidGroup: THandle;   // PSID optional
  pDacl: Pointer;   // ACL* optional
  pSacl: Pointer   // ACL* optional
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'SetSecurityInfo';
result := DllCall("ADVAPI32\SetSecurityInfo"
    , "Ptr", handle   ; HANDLE
    , "Int", ObjectType   ; SE_OBJECT_TYPE
    , "UInt", SecurityInfo   ; OBJECT_SECURITY_INFORMATION
    , "Ptr", psidOwner   ; PSID optional
    , "Ptr", psidGroup   ; PSID optional
    , "Ptr", pDacl   ; ACL* optional
    , "Ptr", pSacl   ; ACL* optional
    , "UInt")   ; return: WIN32_ERROR
●SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl) = DLL("ADVAPI32.dll", "dword SetSecurityInfo(void*, int, dword, void*, void*, void*, void*)")
# 呼び出し: SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
# handle : HANDLE -> "void*"
# ObjectType : SE_OBJECT_TYPE -> "int"
# SecurityInfo : OBJECT_SECURITY_INFORMATION -> "dword"
# psidOwner : PSID optional -> "void*"
# psidGroup : PSID optional -> "void*"
# pDacl : ACL* optional -> "void*"
# pSacl : ACL* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "advapi32" fn SetSecurityInfo(
    handle: ?*anyopaque, // HANDLE
    ObjectType: i32, // SE_OBJECT_TYPE
    SecurityInfo: u32, // OBJECT_SECURITY_INFORMATION
    psidOwner: ?*anyopaque, // PSID optional
    psidGroup: ?*anyopaque, // PSID optional
    pDacl: [*c]ACL, // ACL* optional
    pSacl: [*c]ACL // ACL* optional
) callconv(std.os.windows.WINAPI) u32;
proc SetSecurityInfo(
    handle: pointer,  # HANDLE
    ObjectType: int32,  # SE_OBJECT_TYPE
    SecurityInfo: uint32,  # OBJECT_SECURITY_INFORMATION
    psidOwner: pointer,  # PSID optional
    psidGroup: pointer,  # PSID optional
    pDacl: ptr ACL,  # ACL* optional
    pSacl: ptr ACL  # ACL* optional
): uint32 {.importc: "SetSecurityInfo", stdcall, dynlib: "ADVAPI32.dll".}
pragma(lib, "advapi32");
extern(Windows)
uint SetSecurityInfo(
    void* handle,   // HANDLE
    int ObjectType,   // SE_OBJECT_TYPE
    uint SecurityInfo,   // OBJECT_SECURITY_INFORMATION
    void* psidOwner,   // PSID optional
    void* psidGroup,   // PSID optional
    ACL* pDacl,   // ACL* optional
    ACL* pSacl   // ACL* optional
);
ccall((:SetSecurityInfo, "ADVAPI32.dll"), stdcall, UInt32,
      (Ptr{Cvoid}, Int32, UInt32, Ptr{Cvoid}, Ptr{Cvoid}, Ptr{ACL}, Ptr{ACL}),
      handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
# handle : HANDLE -> Ptr{Cvoid}
# ObjectType : SE_OBJECT_TYPE -> Int32
# SecurityInfo : OBJECT_SECURITY_INFORMATION -> UInt32
# psidOwner : PSID optional -> Ptr{Cvoid}
# psidGroup : PSID optional -> Ptr{Cvoid}
# pDacl : ACL* optional -> Ptr{ACL}
# pSacl : ACL* optional -> Ptr{ACL}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t SetSecurityInfo(
    void* handle,
    int32_t ObjectType,
    uint32_t SecurityInfo,
    void* psidOwner,
    void* psidGroup,
    void* pDacl,
    void* pSacl);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
-- handle : HANDLE
-- ObjectType : SE_OBJECT_TYPE
-- SecurityInfo : OBJECT_SECURITY_INFORMATION
-- psidOwner : PSID optional
-- psidGroup : PSID optional
-- pDacl : ACL* optional
-- pSacl : ACL* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const SetSecurityInfo = lib.func('__stdcall', 'SetSecurityInfo', 'uint32_t', ['void *', 'int32_t', 'uint32_t', 'void *', 'void *', 'void *', 'void *']);
// SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
// handle : HANDLE -> 'void *'
// ObjectType : SE_OBJECT_TYPE -> 'int32_t'
// SecurityInfo : OBJECT_SECURITY_INFORMATION -> 'uint32_t'
// psidOwner : PSID optional -> 'void *'
// psidGroup : PSID optional -> 'void *'
// pDacl : ACL* optional -> 'void *'
// pSacl : ACL* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ADVAPI32.dll", {
  SetSecurityInfo: { parameters: ["pointer", "i32", "u32", "pointer", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl)
// handle : HANDLE -> "pointer"
// ObjectType : SE_OBJECT_TYPE -> "i32"
// SecurityInfo : OBJECT_SECURITY_INFORMATION -> "u32"
// psidOwner : PSID optional -> "pointer"
// psidGroup : PSID optional -> "pointer"
// pDacl : ACL* optional -> "pointer"
// pSacl : ACL* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t SetSecurityInfo(
    void* handle,
    int32_t ObjectType,
    uint32_t SecurityInfo,
    void* psidOwner,
    void* psidGroup,
    void* pDacl,
    void* pSacl);
C, "ADVAPI32.dll");
// $ffi->SetSecurityInfo(handle, ObjectType, SecurityInfo, psidOwner, psidGroup, pDacl, pSacl);
// handle : HANDLE
// ObjectType : SE_OBJECT_TYPE
// SecurityInfo : OBJECT_SECURITY_INFORMATION
// psidOwner : PSID optional
// psidGroup : PSID optional
// pDacl : ACL* optional
// pSacl : ACL* 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 Advapi32 extends StdCallLibrary {
    Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class);
    int SetSecurityInfo(
        Pointer handle,   // HANDLE
        int ObjectType,   // SE_OBJECT_TYPE
        int SecurityInfo,   // OBJECT_SECURITY_INFORMATION
        Pointer psidOwner,   // PSID optional
        Pointer psidGroup,   // PSID optional
        Pointer pDacl,   // ACL* optional
        Pointer pSacl   // ACL* optional
    );
}
@[Link("advapi32")]
lib LibADVAPI32
  fun SetSecurityInfo = SetSecurityInfo(
    handle : Void*,   # HANDLE
    ObjectType : Int32,   # SE_OBJECT_TYPE
    SecurityInfo : UInt32,   # OBJECT_SECURITY_INFORMATION
    psidOwner : Void*,   # PSID optional
    psidGroup : Void*,   # PSID optional
    pDacl : ACL*,   # ACL* optional
    pSacl : ACL*   # ACL* optional
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef SetSecurityInfoNative = Uint32 Function(Pointer<Void>, Int32, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef SetSecurityInfoDart = int Function(Pointer<Void>, int, int, Pointer<Void>, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final SetSecurityInfo = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<SetSecurityInfoNative, SetSecurityInfoDart>('SetSecurityInfo');
// handle : HANDLE -> Pointer<Void>
// ObjectType : SE_OBJECT_TYPE -> Int32
// SecurityInfo : OBJECT_SECURITY_INFORMATION -> Uint32
// psidOwner : PSID optional -> Pointer<Void>
// psidGroup : PSID optional -> Pointer<Void>
// pDacl : ACL* optional -> Pointer<Void>
// pSacl : ACL* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function SetSecurityInfo(
  handle: THandle;   // HANDLE
  ObjectType: Integer;   // SE_OBJECT_TYPE
  SecurityInfo: DWORD;   // OBJECT_SECURITY_INFORMATION
  psidOwner: THandle;   // PSID optional
  psidGroup: THandle;   // PSID optional
  pDacl: Pointer;   // ACL* optional
  pSacl: Pointer   // ACL* optional
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'SetSecurityInfo';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "SetSecurityInfo"
  c_SetSecurityInfo :: Ptr () -> Int32 -> Word32 -> Ptr () -> Ptr () -> Ptr () -> Ptr () -> IO Word32
-- handle : HANDLE -> Ptr ()
-- ObjectType : SE_OBJECT_TYPE -> Int32
-- SecurityInfo : OBJECT_SECURITY_INFORMATION -> Word32
-- psidOwner : PSID optional -> Ptr ()
-- psidGroup : PSID optional -> Ptr ()
-- pDacl : ACL* optional -> Ptr ()
-- pSacl : ACL* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let setsecurityinfo =
  foreign "SetSecurityInfo"
    ((ptr void) @-> int32_t @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* handle : HANDLE -> (ptr void) *)
(* ObjectType : SE_OBJECT_TYPE -> int32_t *)
(* SecurityInfo : OBJECT_SECURITY_INFORMATION -> uint32_t *)
(* psidOwner : PSID optional -> (ptr void) *)
(* psidGroup : PSID optional -> (ptr void) *)
(* pDacl : ACL* optional -> (ptr void) *)
(* pSacl : ACL* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)

(cffi:defcfun ("SetSecurityInfo" set-security-info :convention :stdcall) :uint32
  (handle :pointer)   ; HANDLE
  (object-type :int32)   ; SE_OBJECT_TYPE
  (security-info :uint32)   ; OBJECT_SECURITY_INFORMATION
  (psid-owner :pointer)   ; PSID optional
  (psid-group :pointer)   ; PSID optional
  (p-dacl :pointer)   ; ACL* optional
  (p-sacl :pointer))   ; ACL* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $SetSecurityInfo = Win32::API::More->new('ADVAPI32',
    'DWORD SetSecurityInfo(HANDLE handle, int ObjectType, DWORD SecurityInfo, HANDLE psidOwner, HANDLE psidGroup, LPVOID pDacl, LPVOID pSacl)');
# my $ret = $SetSecurityInfo->Call($handle, $ObjectType, $SecurityInfo, $psidOwner, $psidGroup, $pDacl, $pSacl);
# handle : HANDLE -> HANDLE
# ObjectType : SE_OBJECT_TYPE -> int
# SecurityInfo : OBJECT_SECURITY_INFORMATION -> DWORD
# psidOwner : PSID optional -> HANDLE
# psidGroup : PSID optional -> HANDLE
# pDacl : ACL* optional -> LPVOID
# pSacl : ACL* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

公式の関連項目
使用する型