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

MakeAbsoluteSD

関数
自己相対形式のセキュリティ記述子を絶対形式に変換する。
DLLADVAPI32.dll呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

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

BOOL MakeAbsoluteSD(
    PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
    PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,   // optional
    DWORD* lpdwAbsoluteSecurityDescriptorSize,
    ACL* pDacl,   // optional
    DWORD* lpdwDaclSize,
    ACL* pSacl,   // optional
    DWORD* lpdwSaclSize,
    PSID pOwner,   // optional
    DWORD* lpdwOwnerSize,
    PSID pPrimaryGroup,   // optional
    DWORD* lpdwPrimaryGroupSize
);

パラメーター

名前方向説明
pSelfRelativeSecurityDescriptorPSECURITY_DESCRIPTORin自己相対形式の SECURITY_DESCRIPTOR 構造体へのポインターです。この関数は、元のセキュリティ記述子を変更することなく、このセキュリティ記述子の絶対形式バージョンを作成します。
pAbsoluteSecurityDescriptorPSECURITY_DESCRIPTORoutoptional絶対形式セキュリティ記述子の本体で関数が埋めるバッファーへのポインターです。この情報は SECURITY_DESCRIPTOR 構造体として書式化されます。
lpdwAbsoluteSecurityDescriptorSizeDWORD*inoutpAbsoluteSD パラメーターが指すバッファーのサイズを指定する変数へのポインターです。バッファーがセキュリティ記述子に対して十分な大きさでない場合、関数は失敗し、この変数に必要な最小サイズを設定します。
pDaclACL*outoptional絶対形式セキュリティ記述子の 随意アクセス制御リスト (DACL) で関数が埋めるバッファーへのポインターです。絶対形式セキュリティ記述子の本体は、このポインターを参照します。
lpdwDaclSizeDWORD*inoutpDacl パラメーターが指すバッファーのサイズを指定する変数へのポインターです。バッファーが アクセス制御リスト (ACL) に対して十分な大きさでない場合、関数は失敗し、この変数に必要な最小サイズを設定します。
pSaclACL*outoptional絶対形式セキュリティ記述子の システムアクセス制御リスト (SACL) で関数が埋めるバッファーへのポインターです。絶対形式セキュリティ記述子の本体は、このポインターを参照します。
lpdwSaclSizeDWORD*inoutpSacl パラメーターが指すバッファーのサイズを指定する変数へのポインターです。バッファーが ACL に対して十分な大きさでない場合、関数は失敗し、この変数に必要な最小サイズを設定します。
pOwnerPSIDoutoptional絶対形式セキュリティ記述子の所有者の セキュリティ識別子 (SID) で関数が埋めるバッファーへのポインターです。絶対形式セキュリティ記述子の本体は、このポインターを参照します。
lpdwOwnerSizeDWORD*inoutpOwner パラメーターが指すバッファーのサイズを指定する変数へのポインターです。バッファーが SID に対して十分な大きさでない場合、関数は失敗し、この変数に必要な最小サイズを設定します。
pPrimaryGroupPSIDoutoptional絶対形式セキュリティ記述子のプライマリグループの SID で関数が埋めるバッファーへのポインターです。絶対形式セキュリティ記述子の本体は、このポインターを参照します。
lpdwPrimaryGroupSizeDWORD*inoutpPrimaryGroup パラメーターが指すバッファーのサイズを指定する変数へのポインターです。バッファーが SID に対して十分な大きさでない場合、関数は失敗し、この変数に必要な最小サイズを設定します。

戻り値の型: BOOL

公式ドキュメント

自己相対形式のセキュリティ記述子をテンプレートとして使用し、絶対形式のセキュリティ記述子を作成します。

戻り値

関数が成功した場合は、0 以外の値を返します。

関数が失敗した場合は、0 を返します。拡張エラー情報を取得するには、 GetLastError を呼び出します。返される可能性のあるコードには、以下のものが含まれますが、これらに限定されません。

戻り値/値 説明
ERROR_INSUFFICIENT_BUFFER
0x7A
1 つ以上のバッファーが小さすぎます。

解説(Remarks)

絶対形式のセキュリティ記述子は、含まれる情報そのものではなく、その情報へのポインターを保持します。自己相対形式のセキュリティ記述子は、連続したメモリブロック内に情報を保持します。自己相対形式のセキュリティ記述子では、 SECURITY_DESCRIPTOR 構造体が常に情報の先頭に位置しますが、セキュリティ記述子のその他の構成要素はこの構造体の後に任意の順序で続けることができます。自己相対形式セキュリティ記述子の構成要素は、メモリアドレスではなく、セキュリティ記述子の先頭からのオフセットで識別されます。この形式は、セキュリティ記述子をフロッピーディスクに保存したり、通信プロトコルによって転送したりする必要がある場合に役立ちます。

さまざまなメディアに保護対象オブジェクトをコピーするサーバーは、MakeAbsoluteSD 関数を使用して自己相対セキュリティ記述子から絶対セキュリティ記述子を作成し、 MakeSelfRelativeSD 関数を使用して絶対セキュリティ記述子から自己相対セキュリティ記述子を作成できます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

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

BOOL MakeAbsoluteSD(
    PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
    PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,   // optional
    DWORD* lpdwAbsoluteSecurityDescriptorSize,
    ACL* pDacl,   // optional
    DWORD* lpdwDaclSize,
    ACL* pSacl,   // optional
    DWORD* lpdwSaclSize,
    PSID pOwner,   // optional
    DWORD* lpdwOwnerSize,
    PSID pPrimaryGroup,   // optional
    DWORD* lpdwPrimaryGroupSize
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool MakeAbsoluteSD(
    IntPtr pSelfRelativeSecurityDescriptor,   // PSECURITY_DESCRIPTOR
    IntPtr pAbsoluteSecurityDescriptor,   // PSECURITY_DESCRIPTOR optional, out
    ref uint lpdwAbsoluteSecurityDescriptorSize,   // DWORD* in/out
    IntPtr pDacl,   // ACL* optional, out
    ref uint lpdwDaclSize,   // DWORD* in/out
    IntPtr pSacl,   // ACL* optional, out
    ref uint lpdwSaclSize,   // DWORD* in/out
    IntPtr pOwner,   // PSID optional, out
    ref uint lpdwOwnerSize,   // DWORD* in/out
    IntPtr pPrimaryGroup,   // PSID optional, out
    ref uint lpdwPrimaryGroupSize   // DWORD* in/out
);
<DllImport("ADVAPI32.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function MakeAbsoluteSD(
    pSelfRelativeSecurityDescriptor As IntPtr,   ' PSECURITY_DESCRIPTOR
    pAbsoluteSecurityDescriptor As IntPtr,   ' PSECURITY_DESCRIPTOR optional, out
    ByRef lpdwAbsoluteSecurityDescriptorSize As UInteger,   ' DWORD* in/out
    pDacl As IntPtr,   ' ACL* optional, out
    ByRef lpdwDaclSize As UInteger,   ' DWORD* in/out
    pSacl As IntPtr,   ' ACL* optional, out
    ByRef lpdwSaclSize As UInteger,   ' DWORD* in/out
    pOwner As IntPtr,   ' PSID optional, out
    ByRef lpdwOwnerSize As UInteger,   ' DWORD* in/out
    pPrimaryGroup As IntPtr,   ' PSID optional, out
    ByRef lpdwPrimaryGroupSize As UInteger   ' DWORD* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
' pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
' lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
' pDacl : ACL* optional, out
' lpdwDaclSize : DWORD* in/out
' pSacl : ACL* optional, out
' lpdwSaclSize : DWORD* in/out
' pOwner : PSID optional, out
' lpdwOwnerSize : DWORD* in/out
' pPrimaryGroup : PSID optional, out
' lpdwPrimaryGroupSize : DWORD* in/out
Declare PtrSafe Function MakeAbsoluteSD Lib "advapi32" ( _
    ByVal pSelfRelativeSecurityDescriptor As LongPtr, _
    ByVal pAbsoluteSecurityDescriptor As LongPtr, _
    ByRef lpdwAbsoluteSecurityDescriptorSize As Long, _
    ByVal pDacl As LongPtr, _
    ByRef lpdwDaclSize As Long, _
    ByVal pSacl As LongPtr, _
    ByRef lpdwSaclSize As Long, _
    ByVal pOwner As LongPtr, _
    ByRef lpdwOwnerSize As Long, _
    ByVal pPrimaryGroup As LongPtr, _
    ByRef lpdwPrimaryGroupSize As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

MakeAbsoluteSD = ctypes.windll.advapi32.MakeAbsoluteSD
MakeAbsoluteSD.restype = wintypes.BOOL
MakeAbsoluteSD.argtypes = [
    wintypes.HANDLE,  # pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
    wintypes.HANDLE,  # pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
    ctypes.c_void_p,  # pDacl : ACL* optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwDaclSize : DWORD* in/out
    ctypes.c_void_p,  # pSacl : ACL* optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwSaclSize : DWORD* in/out
    wintypes.HANDLE,  # pOwner : PSID optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwOwnerSize : DWORD* in/out
    wintypes.HANDLE,  # pPrimaryGroup : PSID optional, out
    ctypes.POINTER(wintypes.DWORD),  # lpdwPrimaryGroupSize : DWORD* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
MakeAbsoluteSD = Fiddle::Function.new(
  lib['MakeAbsoluteSD'],
  [
    Fiddle::TYPE_VOIDP,  # pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
    Fiddle::TYPE_VOIDP,  # pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
    Fiddle::TYPE_VOIDP,  # lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pDacl : ACL* optional, out
    Fiddle::TYPE_VOIDP,  # lpdwDaclSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pSacl : ACL* optional, out
    Fiddle::TYPE_VOIDP,  # lpdwSaclSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pOwner : PSID optional, out
    Fiddle::TYPE_VOIDP,  # lpdwOwnerSize : DWORD* in/out
    Fiddle::TYPE_VOIDP,  # pPrimaryGroup : PSID optional, out
    Fiddle::TYPE_VOIDP,  # lpdwPrimaryGroupSize : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn MakeAbsoluteSD(
        pSelfRelativeSecurityDescriptor: *mut core::ffi::c_void,  // PSECURITY_DESCRIPTOR
        pAbsoluteSecurityDescriptor: *mut core::ffi::c_void,  // PSECURITY_DESCRIPTOR optional, out
        lpdwAbsoluteSecurityDescriptorSize: *mut u32,  // DWORD* in/out
        pDacl: *mut ACL,  // ACL* optional, out
        lpdwDaclSize: *mut u32,  // DWORD* in/out
        pSacl: *mut ACL,  // ACL* optional, out
        lpdwSaclSize: *mut u32,  // DWORD* in/out
        pOwner: *mut core::ffi::c_void,  // PSID optional, out
        lpdwOwnerSize: *mut u32,  // DWORD* in/out
        pPrimaryGroup: *mut core::ffi::c_void,  // PSID optional, out
        lpdwPrimaryGroupSize: *mut u32  // DWORD* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", SetLastError = true)]
public static extern bool MakeAbsoluteSD(IntPtr pSelfRelativeSecurityDescriptor, IntPtr pAbsoluteSecurityDescriptor, ref uint lpdwAbsoluteSecurityDescriptorSize, IntPtr pDacl, ref uint lpdwDaclSize, IntPtr pSacl, ref uint lpdwSaclSize, IntPtr pOwner, ref uint lpdwOwnerSize, IntPtr pPrimaryGroup, ref uint lpdwPrimaryGroupSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_MakeAbsoluteSD' -Namespace Win32 -PassThru
# $api::MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
#uselib "ADVAPI32.dll"
#func global MakeAbsoluteSD "MakeAbsoluteSD" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; MakeAbsoluteSD pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, varptr(lpdwAbsoluteSecurityDescriptorSize), varptr(pDacl), varptr(lpdwDaclSize), varptr(pSacl), varptr(lpdwSaclSize), pOwner, varptr(lpdwOwnerSize), pPrimaryGroup, varptr(lpdwPrimaryGroupSize)   ; 戻り値は stat
; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "sptr"
; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "sptr"
; pDacl : ACL* optional, out -> "sptr"
; lpdwDaclSize : DWORD* in/out -> "sptr"
; pSacl : ACL* optional, out -> "sptr"
; lpdwSaclSize : DWORD* in/out -> "sptr"
; pOwner : PSID optional, out -> "sptr"
; lpdwOwnerSize : DWORD* in/out -> "sptr"
; pPrimaryGroup : PSID optional, out -> "sptr"
; lpdwPrimaryGroupSize : DWORD* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global MakeAbsoluteSD "MakeAbsoluteSD" sptr, sptr, var, var, var, var, var, sptr, var, sptr, var
; res = MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "sptr"
; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "var"
; pDacl : ACL* optional, out -> "var"
; lpdwDaclSize : DWORD* in/out -> "var"
; pSacl : ACL* optional, out -> "var"
; lpdwSaclSize : DWORD* in/out -> "var"
; pOwner : PSID optional, out -> "sptr"
; lpdwOwnerSize : DWORD* in/out -> "var"
; pPrimaryGroup : PSID optional, out -> "sptr"
; lpdwPrimaryGroupSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL MakeAbsoluteSD(PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, DWORD* lpdwAbsoluteSecurityDescriptorSize, ACL* pDacl, DWORD* lpdwDaclSize, ACL* pSacl, DWORD* lpdwSaclSize, PSID pOwner, DWORD* lpdwOwnerSize, PSID pPrimaryGroup, DWORD* lpdwPrimaryGroupSize)
#uselib "ADVAPI32.dll"
#cfunc global MakeAbsoluteSD "MakeAbsoluteSD" intptr, intptr, var, var, var, var, var, intptr, var, intptr, var
; res = MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
; pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "intptr"
; pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "intptr"
; lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "var"
; pDacl : ACL* optional, out -> "var"
; lpdwDaclSize : DWORD* in/out -> "var"
; pSacl : ACL* optional, out -> "var"
; lpdwSaclSize : DWORD* in/out -> "var"
; pOwner : PSID optional, out -> "intptr"
; lpdwOwnerSize : DWORD* in/out -> "var"
; pPrimaryGroup : PSID optional, out -> "intptr"
; lpdwPrimaryGroupSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procMakeAbsoluteSD = advapi32.NewProc("MakeAbsoluteSD")
)

// pSelfRelativeSecurityDescriptor (PSECURITY_DESCRIPTOR), pAbsoluteSecurityDescriptor (PSECURITY_DESCRIPTOR optional, out), lpdwAbsoluteSecurityDescriptorSize (DWORD* in/out), pDacl (ACL* optional, out), lpdwDaclSize (DWORD* in/out), pSacl (ACL* optional, out), lpdwSaclSize (DWORD* in/out), pOwner (PSID optional, out), lpdwOwnerSize (DWORD* in/out), pPrimaryGroup (PSID optional, out), lpdwPrimaryGroupSize (DWORD* in/out)
r1, _, err := procMakeAbsoluteSD.Call(
	uintptr(pSelfRelativeSecurityDescriptor),
	uintptr(pAbsoluteSecurityDescriptor),
	uintptr(lpdwAbsoluteSecurityDescriptorSize),
	uintptr(pDacl),
	uintptr(lpdwDaclSize),
	uintptr(pSacl),
	uintptr(lpdwSaclSize),
	uintptr(pOwner),
	uintptr(lpdwOwnerSize),
	uintptr(pPrimaryGroup),
	uintptr(lpdwPrimaryGroupSize),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function MakeAbsoluteSD(
  pSelfRelativeSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  pAbsoluteSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR optional, out
  lpdwAbsoluteSecurityDescriptorSize: Pointer;   // DWORD* in/out
  pDacl: Pointer;   // ACL* optional, out
  lpdwDaclSize: Pointer;   // DWORD* in/out
  pSacl: Pointer;   // ACL* optional, out
  lpdwSaclSize: Pointer;   // DWORD* in/out
  pOwner: THandle;   // PSID optional, out
  lpdwOwnerSize: Pointer;   // DWORD* in/out
  pPrimaryGroup: THandle;   // PSID optional, out
  lpdwPrimaryGroupSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'MakeAbsoluteSD';
result := DllCall("ADVAPI32\MakeAbsoluteSD"
    , "Ptr", pSelfRelativeSecurityDescriptor   ; PSECURITY_DESCRIPTOR
    , "Ptr", pAbsoluteSecurityDescriptor   ; PSECURITY_DESCRIPTOR optional, out
    , "Ptr", lpdwAbsoluteSecurityDescriptorSize   ; DWORD* in/out
    , "Ptr", pDacl   ; ACL* optional, out
    , "Ptr", lpdwDaclSize   ; DWORD* in/out
    , "Ptr", pSacl   ; ACL* optional, out
    , "Ptr", lpdwSaclSize   ; DWORD* in/out
    , "Ptr", pOwner   ; PSID optional, out
    , "Ptr", lpdwOwnerSize   ; DWORD* in/out
    , "Ptr", pPrimaryGroup   ; PSID optional, out
    , "Ptr", lpdwPrimaryGroupSize   ; DWORD* in/out
    , "Int")   ; return: BOOL
●MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize) = DLL("ADVAPI32.dll", "bool MakeAbsoluteSD(void*, void*, void*, void*, void*, void*, void*, void*, void*, void*, void*)")
# 呼び出し: MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
# pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "void*"
# pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "void*"
# lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "void*"
# pDacl : ACL* optional, out -> "void*"
# lpdwDaclSize : DWORD* in/out -> "void*"
# pSacl : ACL* optional, out -> "void*"
# lpdwSaclSize : DWORD* in/out -> "void*"
# pOwner : PSID optional, out -> "void*"
# lpdwOwnerSize : DWORD* in/out -> "void*"
# pPrimaryGroup : PSID optional, out -> "void*"
# lpdwPrimaryGroupSize : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "advapi32" fn MakeAbsoluteSD(
    pSelfRelativeSecurityDescriptor: ?*anyopaque, // PSECURITY_DESCRIPTOR
    pAbsoluteSecurityDescriptor: ?*anyopaque, // PSECURITY_DESCRIPTOR optional, out
    lpdwAbsoluteSecurityDescriptorSize: [*c]u32, // DWORD* in/out
    pDacl: [*c]ACL, // ACL* optional, out
    lpdwDaclSize: [*c]u32, // DWORD* in/out
    pSacl: [*c]ACL, // ACL* optional, out
    lpdwSaclSize: [*c]u32, // DWORD* in/out
    pOwner: ?*anyopaque, // PSID optional, out
    lpdwOwnerSize: [*c]u32, // DWORD* in/out
    pPrimaryGroup: ?*anyopaque, // PSID optional, out
    lpdwPrimaryGroupSize: [*c]u32 // DWORD* in/out
) callconv(std.os.windows.WINAPI) i32;
proc MakeAbsoluteSD(
    pSelfRelativeSecurityDescriptor: pointer,  # PSECURITY_DESCRIPTOR
    pAbsoluteSecurityDescriptor: pointer,  # PSECURITY_DESCRIPTOR optional, out
    lpdwAbsoluteSecurityDescriptorSize: ptr uint32,  # DWORD* in/out
    pDacl: ptr ACL,  # ACL* optional, out
    lpdwDaclSize: ptr uint32,  # DWORD* in/out
    pSacl: ptr ACL,  # ACL* optional, out
    lpdwSaclSize: ptr uint32,  # DWORD* in/out
    pOwner: pointer,  # PSID optional, out
    lpdwOwnerSize: ptr uint32,  # DWORD* in/out
    pPrimaryGroup: pointer,  # PSID optional, out
    lpdwPrimaryGroupSize: ptr uint32  # DWORD* in/out
): int32 {.importc: "MakeAbsoluteSD", stdcall, dynlib: "ADVAPI32.dll".}
pragma(lib, "advapi32");
extern(Windows)
int MakeAbsoluteSD(
    void* pSelfRelativeSecurityDescriptor,   // PSECURITY_DESCRIPTOR
    void* pAbsoluteSecurityDescriptor,   // PSECURITY_DESCRIPTOR optional, out
    uint* lpdwAbsoluteSecurityDescriptorSize,   // DWORD* in/out
    ACL* pDacl,   // ACL* optional, out
    uint* lpdwDaclSize,   // DWORD* in/out
    ACL* pSacl,   // ACL* optional, out
    uint* lpdwSaclSize,   // DWORD* in/out
    void* pOwner,   // PSID optional, out
    uint* lpdwOwnerSize,   // DWORD* in/out
    void* pPrimaryGroup,   // PSID optional, out
    uint* lpdwPrimaryGroupSize   // DWORD* in/out
);
ccall((:MakeAbsoluteSD, "ADVAPI32.dll"), stdcall, Int32,
      (Ptr{Cvoid}, Ptr{Cvoid}, Ptr{UInt32}, Ptr{ACL}, Ptr{UInt32}, Ptr{ACL}, Ptr{UInt32}, Ptr{Cvoid}, Ptr{UInt32}, Ptr{Cvoid}, Ptr{UInt32}),
      pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
# pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> Ptr{Cvoid}
# pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> Ptr{Cvoid}
# lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> Ptr{UInt32}
# pDacl : ACL* optional, out -> Ptr{ACL}
# lpdwDaclSize : DWORD* in/out -> Ptr{UInt32}
# pSacl : ACL* optional, out -> Ptr{ACL}
# lpdwSaclSize : DWORD* in/out -> Ptr{UInt32}
# pOwner : PSID optional, out -> Ptr{Cvoid}
# lpdwOwnerSize : DWORD* in/out -> Ptr{UInt32}
# pPrimaryGroup : PSID optional, out -> Ptr{Cvoid}
# lpdwPrimaryGroupSize : DWORD* in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t MakeAbsoluteSD(
    void* pSelfRelativeSecurityDescriptor,
    void* pAbsoluteSecurityDescriptor,
    uint32_t* lpdwAbsoluteSecurityDescriptorSize,
    void* pDacl,
    uint32_t* lpdwDaclSize,
    void* pSacl,
    uint32_t* lpdwSaclSize,
    void* pOwner,
    uint32_t* lpdwOwnerSize,
    void* pPrimaryGroup,
    uint32_t* lpdwPrimaryGroupSize);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
-- pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
-- pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
-- lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
-- pDacl : ACL* optional, out
-- lpdwDaclSize : DWORD* in/out
-- pSacl : ACL* optional, out
-- lpdwSaclSize : DWORD* in/out
-- pOwner : PSID optional, out
-- lpdwOwnerSize : DWORD* in/out
-- pPrimaryGroup : PSID optional, out
-- lpdwPrimaryGroupSize : DWORD* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const MakeAbsoluteSD = lib.func('__stdcall', 'MakeAbsoluteSD', 'int32_t', ['void *', 'void *', 'uint32_t *', 'void *', 'uint32_t *', 'void *', 'uint32_t *', 'void *', 'uint32_t *', 'void *', 'uint32_t *']);
// MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
// pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> 'void *'
// pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> 'void *'
// lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> 'uint32_t *'
// pDacl : ACL* optional, out -> 'void *'
// lpdwDaclSize : DWORD* in/out -> 'uint32_t *'
// pSacl : ACL* optional, out -> 'void *'
// lpdwSaclSize : DWORD* in/out -> 'uint32_t *'
// pOwner : PSID optional, out -> 'void *'
// lpdwOwnerSize : DWORD* in/out -> 'uint32_t *'
// pPrimaryGroup : PSID optional, out -> 'void *'
// lpdwPrimaryGroupSize : DWORD* in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ADVAPI32.dll", {
  MakeAbsoluteSD: { parameters: ["pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize)
// pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> "pointer"
// pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> "pointer"
// lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> "pointer"
// pDacl : ACL* optional, out -> "pointer"
// lpdwDaclSize : DWORD* in/out -> "pointer"
// pSacl : ACL* optional, out -> "pointer"
// lpdwSaclSize : DWORD* in/out -> "pointer"
// pOwner : PSID optional, out -> "pointer"
// lpdwOwnerSize : DWORD* in/out -> "pointer"
// pPrimaryGroup : PSID optional, out -> "pointer"
// lpdwPrimaryGroupSize : DWORD* in/out -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t MakeAbsoluteSD(
    void* pSelfRelativeSecurityDescriptor,
    void* pAbsoluteSecurityDescriptor,
    uint32_t* lpdwAbsoluteSecurityDescriptorSize,
    void* pDacl,
    uint32_t* lpdwDaclSize,
    void* pSacl,
    uint32_t* lpdwSaclSize,
    void* pOwner,
    uint32_t* lpdwOwnerSize,
    void* pPrimaryGroup,
    uint32_t* lpdwPrimaryGroupSize);
C, "ADVAPI32.dll");
// $ffi->MakeAbsoluteSD(pSelfRelativeSecurityDescriptor, pAbsoluteSecurityDescriptor, lpdwAbsoluteSecurityDescriptorSize, pDacl, lpdwDaclSize, pSacl, lpdwSaclSize, pOwner, lpdwOwnerSize, pPrimaryGroup, lpdwPrimaryGroupSize);
// pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR
// pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out
// lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out
// pDacl : ACL* optional, out
// lpdwDaclSize : DWORD* in/out
// pSacl : ACL* optional, out
// lpdwSaclSize : DWORD* in/out
// pOwner : PSID optional, out
// lpdwOwnerSize : DWORD* in/out
// pPrimaryGroup : PSID optional, out
// lpdwPrimaryGroupSize : DWORD* 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 Advapi32 extends StdCallLibrary {
    Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class);
    boolean MakeAbsoluteSD(
        Pointer pSelfRelativeSecurityDescriptor,   // PSECURITY_DESCRIPTOR
        Pointer pAbsoluteSecurityDescriptor,   // PSECURITY_DESCRIPTOR optional, out
        IntByReference lpdwAbsoluteSecurityDescriptorSize,   // DWORD* in/out
        Pointer pDacl,   // ACL* optional, out
        IntByReference lpdwDaclSize,   // DWORD* in/out
        Pointer pSacl,   // ACL* optional, out
        IntByReference lpdwSaclSize,   // DWORD* in/out
        Pointer pOwner,   // PSID optional, out
        IntByReference lpdwOwnerSize,   // DWORD* in/out
        Pointer pPrimaryGroup,   // PSID optional, out
        IntByReference lpdwPrimaryGroupSize   // DWORD* in/out
    );
}
@[Link("advapi32")]
lib LibADVAPI32
  fun MakeAbsoluteSD = MakeAbsoluteSD(
    pSelfRelativeSecurityDescriptor : Void*,   # PSECURITY_DESCRIPTOR
    pAbsoluteSecurityDescriptor : Void*,   # PSECURITY_DESCRIPTOR optional, out
    lpdwAbsoluteSecurityDescriptorSize : UInt32*,   # DWORD* in/out
    pDacl : ACL*,   # ACL* optional, out
    lpdwDaclSize : UInt32*,   # DWORD* in/out
    pSacl : ACL*,   # ACL* optional, out
    lpdwSaclSize : UInt32*,   # DWORD* in/out
    pOwner : Void*,   # PSID optional, out
    lpdwOwnerSize : UInt32*,   # DWORD* in/out
    pPrimaryGroup : Void*,   # PSID optional, out
    lpdwPrimaryGroupSize : UInt32*   # DWORD* 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 MakeAbsoluteSDNative = Int32 Function(Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>);
typedef MakeAbsoluteSDDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>, Pointer<Void>, Pointer<Uint32>);
final MakeAbsoluteSD = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<MakeAbsoluteSDNative, MakeAbsoluteSDDart>('MakeAbsoluteSD');
// pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> Pointer<Void>
// pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> Pointer<Void>
// lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> Pointer<Uint32>
// pDacl : ACL* optional, out -> Pointer<Void>
// lpdwDaclSize : DWORD* in/out -> Pointer<Uint32>
// pSacl : ACL* optional, out -> Pointer<Void>
// lpdwSaclSize : DWORD* in/out -> Pointer<Uint32>
// pOwner : PSID optional, out -> Pointer<Void>
// lpdwOwnerSize : DWORD* in/out -> Pointer<Uint32>
// pPrimaryGroup : PSID optional, out -> Pointer<Void>
// lpdwPrimaryGroupSize : DWORD* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function MakeAbsoluteSD(
  pSelfRelativeSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  pAbsoluteSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR optional, out
  lpdwAbsoluteSecurityDescriptorSize: Pointer;   // DWORD* in/out
  pDacl: Pointer;   // ACL* optional, out
  lpdwDaclSize: Pointer;   // DWORD* in/out
  pSacl: Pointer;   // ACL* optional, out
  lpdwSaclSize: Pointer;   // DWORD* in/out
  pOwner: THandle;   // PSID optional, out
  lpdwOwnerSize: Pointer;   // DWORD* in/out
  pPrimaryGroup: THandle;   // PSID optional, out
  lpdwPrimaryGroupSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'MakeAbsoluteSD';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "MakeAbsoluteSD"
  c_MakeAbsoluteSD :: Ptr () -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr Word32 -> Ptr () -> Ptr Word32 -> IO CInt
-- pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> Ptr ()
-- pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> Ptr ()
-- lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> Ptr Word32
-- pDacl : ACL* optional, out -> Ptr ()
-- lpdwDaclSize : DWORD* in/out -> Ptr Word32
-- pSacl : ACL* optional, out -> Ptr ()
-- lpdwSaclSize : DWORD* in/out -> Ptr Word32
-- pOwner : PSID optional, out -> Ptr ()
-- lpdwOwnerSize : DWORD* in/out -> Ptr Word32
-- pPrimaryGroup : PSID optional, out -> Ptr ()
-- lpdwPrimaryGroupSize : DWORD* in/out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let makeabsolutesd =
  foreign "MakeAbsoluteSD"
    ((ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr void) @-> (ptr uint32_t) @-> returning int32_t)
(* pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> (ptr void) *)
(* pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> (ptr void) *)
(* lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> (ptr uint32_t) *)
(* pDacl : ACL* optional, out -> (ptr void) *)
(* lpdwDaclSize : DWORD* in/out -> (ptr uint32_t) *)
(* pSacl : ACL* optional, out -> (ptr void) *)
(* lpdwSaclSize : DWORD* in/out -> (ptr uint32_t) *)
(* pOwner : PSID optional, out -> (ptr void) *)
(* lpdwOwnerSize : DWORD* in/out -> (ptr uint32_t) *)
(* pPrimaryGroup : PSID optional, out -> (ptr void) *)
(* lpdwPrimaryGroupSize : DWORD* in/out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)

(cffi:defcfun ("MakeAbsoluteSD" make-absolute-sd :convention :stdcall) :int32
  (p-self-relative-security-descriptor :pointer)   ; PSECURITY_DESCRIPTOR
  (p-absolute-security-descriptor :pointer)   ; PSECURITY_DESCRIPTOR optional, out
  (lpdw-absolute-security-descriptor-size :pointer)   ; DWORD* in/out
  (p-dacl :pointer)   ; ACL* optional, out
  (lpdw-dacl-size :pointer)   ; DWORD* in/out
  (p-sacl :pointer)   ; ACL* optional, out
  (lpdw-sacl-size :pointer)   ; DWORD* in/out
  (p-owner :pointer)   ; PSID optional, out
  (lpdw-owner-size :pointer)   ; DWORD* in/out
  (p-primary-group :pointer)   ; PSID optional, out
  (lpdw-primary-group-size :pointer))   ; DWORD* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $MakeAbsoluteSD = Win32::API::More->new('ADVAPI32',
    'BOOL MakeAbsoluteSD(HANDLE pSelfRelativeSecurityDescriptor, HANDLE pAbsoluteSecurityDescriptor, LPVOID lpdwAbsoluteSecurityDescriptorSize, LPVOID pDacl, LPVOID lpdwDaclSize, LPVOID pSacl, LPVOID lpdwSaclSize, HANDLE pOwner, LPVOID lpdwOwnerSize, HANDLE pPrimaryGroup, LPVOID lpdwPrimaryGroupSize)');
# my $ret = $MakeAbsoluteSD->Call($pSelfRelativeSecurityDescriptor, $pAbsoluteSecurityDescriptor, $lpdwAbsoluteSecurityDescriptorSize, $pDacl, $lpdwDaclSize, $pSacl, $lpdwSaclSize, $pOwner, $lpdwOwnerSize, $pPrimaryGroup, $lpdwPrimaryGroupSize);
# pSelfRelativeSecurityDescriptor : PSECURITY_DESCRIPTOR -> HANDLE
# pAbsoluteSecurityDescriptor : PSECURITY_DESCRIPTOR optional, out -> HANDLE
# lpdwAbsoluteSecurityDescriptorSize : DWORD* in/out -> LPVOID
# pDacl : ACL* optional, out -> LPVOID
# lpdwDaclSize : DWORD* in/out -> LPVOID
# pSacl : ACL* optional, out -> LPVOID
# lpdwSaclSize : DWORD* in/out -> LPVOID
# pOwner : PSID optional, out -> HANDLE
# lpdwOwnerSize : DWORD* in/out -> LPVOID
# pPrimaryGroup : PSID optional, out -> HANDLE
# lpdwPrimaryGroupSize : DWORD* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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