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

RsopAccessCheckByType

関数
RSOPトークンで種類別のアクセス許可を判定する。
DLLUSERENV.dll呼出規約winapiSetLastErrorあり対応OSWindows Vista 以降

シグネチャ

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

HRESULT RsopAccessCheckByType(
    PSECURITY_DESCRIPTOR pSecurityDescriptor,
    PSID pPrincipalSelfSid,   // optional
    void* pRsopToken,
    DWORD dwDesiredAccessMask,
    OBJECT_TYPE_LIST* pObjectTypeList,   // optional
    DWORD ObjectTypeListLength,
    GENERIC_MAPPING* pGenericMapping,
    PRIVILEGE_SET* pPrivilegeSet,   // optional
    DWORD* pdwPrivilegeSetLength,   // optional
    DWORD* pdwGrantedAccessMask,
    BOOL* pbAccessStatus
);

パラメーター

名前方向説明
pSecurityDescriptorPSECURITY_DESCRIPTORinアクセス判定に用いる対象オブジェクトのセキュリティ記述子。
pPrincipalSelfSidPSIDinoptionalACE内のPrincipal Self SIDに置き換えるプリンシパルのSID。NULL可。
pRsopTokenvoid*in判定に使うRSoPトークンへのポインタ。シミュレーション対象のユーザー権限を表す。
dwDesiredAccessMaskDWORDin要求するアクセス権を示すマスク。
pObjectTypeListOBJECT_TYPE_LIST*inoptional階層的アクセス判定に用いるOBJECT_TYPE_LIST配列。NULL可。
ObjectTypeListLengthDWORDinpObjectTypeList配列の要素数を指定する。
pGenericMappingGENERIC_MAPPING*in汎用アクセス権を具体的権利へ対応付けるGENERIC_MAPPING構造体。
pPrivilegeSetPRIVILEGE_SET*inoptional判定で使用された特権を受け取るPRIVILEGE_SET構造体。
pdwPrivilegeSetLengthDWORD*inoptionalpPrivilegeSetバッファのサイズを入出力するバイト数ポインタ。
pdwGrantedAccessMaskDWORD*out実際に許可されたアクセス権マスクを受け取る出力ポインタ。
pbAccessStatusBOOL*outアクセスが許可されたか否か(TRUE/FALSE)を受け取る出力ポインタ。

戻り値の型: HRESULT

各言語での呼び出し定義

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

HRESULT RsopAccessCheckByType(
    PSECURITY_DESCRIPTOR pSecurityDescriptor,
    PSID pPrincipalSelfSid,   // optional
    void* pRsopToken,
    DWORD dwDesiredAccessMask,
    OBJECT_TYPE_LIST* pObjectTypeList,   // optional
    DWORD ObjectTypeListLength,
    GENERIC_MAPPING* pGenericMapping,
    PRIVILEGE_SET* pPrivilegeSet,   // optional
    DWORD* pdwPrivilegeSetLength,   // optional
    DWORD* pdwGrantedAccessMask,
    BOOL* pbAccessStatus
);
[DllImport("USERENV.dll", SetLastError = true, ExactSpelling = true)]
static extern int RsopAccessCheckByType(
    IntPtr pSecurityDescriptor,   // PSECURITY_DESCRIPTOR
    IntPtr pPrincipalSelfSid,   // PSID optional
    IntPtr pRsopToken,   // void*
    uint dwDesiredAccessMask,   // DWORD
    IntPtr pObjectTypeList,   // OBJECT_TYPE_LIST* optional
    uint ObjectTypeListLength,   // DWORD
    IntPtr pGenericMapping,   // GENERIC_MAPPING*
    IntPtr pPrivilegeSet,   // PRIVILEGE_SET* optional
    IntPtr pdwPrivilegeSetLength,   // DWORD* optional
    out uint pdwGrantedAccessMask,   // DWORD* out
    out bool pbAccessStatus   // BOOL* out
);
<DllImport("USERENV.dll", SetLastError:=True, ExactSpelling:=True)>
Public Shared Function RsopAccessCheckByType(
    pSecurityDescriptor As IntPtr,   ' PSECURITY_DESCRIPTOR
    pPrincipalSelfSid As IntPtr,   ' PSID optional
    pRsopToken As IntPtr,   ' void*
    dwDesiredAccessMask As UInteger,   ' DWORD
    pObjectTypeList As IntPtr,   ' OBJECT_TYPE_LIST* optional
    ObjectTypeListLength As UInteger,   ' DWORD
    pGenericMapping As IntPtr,   ' GENERIC_MAPPING*
    pPrivilegeSet As IntPtr,   ' PRIVILEGE_SET* optional
    pdwPrivilegeSetLength As IntPtr,   ' DWORD* optional
    <Out> ByRef pdwGrantedAccessMask As UInteger,   ' DWORD* out
    <Out> ByRef pbAccessStatus As Boolean   ' BOOL* out
) As Integer
End Function
' pSecurityDescriptor : PSECURITY_DESCRIPTOR
' pPrincipalSelfSid : PSID optional
' pRsopToken : void*
' dwDesiredAccessMask : DWORD
' pObjectTypeList : OBJECT_TYPE_LIST* optional
' ObjectTypeListLength : DWORD
' pGenericMapping : GENERIC_MAPPING*
' pPrivilegeSet : PRIVILEGE_SET* optional
' pdwPrivilegeSetLength : DWORD* optional
' pdwGrantedAccessMask : DWORD* out
' pbAccessStatus : BOOL* out
Declare PtrSafe Function RsopAccessCheckByType Lib "userenv" ( _
    ByVal pSecurityDescriptor As LongPtr, _
    ByVal pPrincipalSelfSid As LongPtr, _
    ByVal pRsopToken As LongPtr, _
    ByVal dwDesiredAccessMask As Long, _
    ByVal pObjectTypeList As LongPtr, _
    ByVal ObjectTypeListLength As Long, _
    ByVal pGenericMapping As LongPtr, _
    ByVal pPrivilegeSet As LongPtr, _
    ByVal pdwPrivilegeSetLength As LongPtr, _
    ByRef pdwGrantedAccessMask As Long, _
    ByRef pbAccessStatus As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RsopAccessCheckByType = ctypes.windll.userenv.RsopAccessCheckByType
RsopAccessCheckByType.restype = ctypes.c_int
RsopAccessCheckByType.argtypes = [
    wintypes.HANDLE,  # pSecurityDescriptor : PSECURITY_DESCRIPTOR
    wintypes.HANDLE,  # pPrincipalSelfSid : PSID optional
    ctypes.POINTER(None),  # pRsopToken : void*
    wintypes.DWORD,  # dwDesiredAccessMask : DWORD
    ctypes.c_void_p,  # pObjectTypeList : OBJECT_TYPE_LIST* optional
    wintypes.DWORD,  # ObjectTypeListLength : DWORD
    ctypes.c_void_p,  # pGenericMapping : GENERIC_MAPPING*
    ctypes.c_void_p,  # pPrivilegeSet : PRIVILEGE_SET* optional
    ctypes.POINTER(wintypes.DWORD),  # pdwPrivilegeSetLength : DWORD* optional
    ctypes.POINTER(wintypes.DWORD),  # pdwGrantedAccessMask : DWORD* out
    ctypes.c_void_p,  # pbAccessStatus : BOOL* out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('USERENV.dll')
RsopAccessCheckByType = Fiddle::Function.new(
  lib['RsopAccessCheckByType'],
  [
    Fiddle::TYPE_VOIDP,  # pSecurityDescriptor : PSECURITY_DESCRIPTOR
    Fiddle::TYPE_VOIDP,  # pPrincipalSelfSid : PSID optional
    Fiddle::TYPE_VOIDP,  # pRsopToken : void*
    -Fiddle::TYPE_INT,  # dwDesiredAccessMask : DWORD
    Fiddle::TYPE_VOIDP,  # pObjectTypeList : OBJECT_TYPE_LIST* optional
    -Fiddle::TYPE_INT,  # ObjectTypeListLength : DWORD
    Fiddle::TYPE_VOIDP,  # pGenericMapping : GENERIC_MAPPING*
    Fiddle::TYPE_VOIDP,  # pPrivilegeSet : PRIVILEGE_SET* optional
    Fiddle::TYPE_VOIDP,  # pdwPrivilegeSetLength : DWORD* optional
    Fiddle::TYPE_VOIDP,  # pdwGrantedAccessMask : DWORD* out
    Fiddle::TYPE_VOIDP,  # pbAccessStatus : BOOL* out
  ],
  Fiddle::TYPE_INT)
#[link(name = "userenv")]
extern "system" {
    fn RsopAccessCheckByType(
        pSecurityDescriptor: *mut core::ffi::c_void,  // PSECURITY_DESCRIPTOR
        pPrincipalSelfSid: *mut core::ffi::c_void,  // PSID optional
        pRsopToken: *mut (),  // void*
        dwDesiredAccessMask: u32,  // DWORD
        pObjectTypeList: *mut OBJECT_TYPE_LIST,  // OBJECT_TYPE_LIST* optional
        ObjectTypeListLength: u32,  // DWORD
        pGenericMapping: *mut GENERIC_MAPPING,  // GENERIC_MAPPING*
        pPrivilegeSet: *mut PRIVILEGE_SET,  // PRIVILEGE_SET* optional
        pdwPrivilegeSetLength: *mut u32,  // DWORD* optional
        pdwGrantedAccessMask: *mut u32,  // DWORD* out
        pbAccessStatus: *mut i32  // BOOL* out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("USERENV.dll", SetLastError = true)]
public static extern int RsopAccessCheckByType(IntPtr pSecurityDescriptor, IntPtr pPrincipalSelfSid, IntPtr pRsopToken, uint dwDesiredAccessMask, IntPtr pObjectTypeList, uint ObjectTypeListLength, IntPtr pGenericMapping, IntPtr pPrivilegeSet, IntPtr pdwPrivilegeSetLength, out uint pdwGrantedAccessMask, out bool pbAccessStatus);
"@
$api = Add-Type -MemberDefinition $sig -Name 'USERENV_RsopAccessCheckByType' -Namespace Win32 -PassThru
# $api::RsopAccessCheckByType(pSecurityDescriptor, pPrincipalSelfSid, pRsopToken, dwDesiredAccessMask, pObjectTypeList, ObjectTypeListLength, pGenericMapping, pPrivilegeSet, pdwPrivilegeSetLength, pdwGrantedAccessMask, pbAccessStatus)
#uselib "USERENV.dll"
#func global RsopAccessCheckByType "RsopAccessCheckByType" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; RsopAccessCheckByType pSecurityDescriptor, pPrincipalSelfSid, pRsopToken, dwDesiredAccessMask, varptr(pObjectTypeList), ObjectTypeListLength, varptr(pGenericMapping), varptr(pPrivilegeSet), varptr(pdwPrivilegeSetLength), varptr(pdwGrantedAccessMask), varptr(pbAccessStatus)   ; 戻り値は stat
; pSecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; pPrincipalSelfSid : PSID optional -> "sptr"
; pRsopToken : void* -> "sptr"
; dwDesiredAccessMask : DWORD -> "sptr"
; pObjectTypeList : OBJECT_TYPE_LIST* optional -> "sptr"
; ObjectTypeListLength : DWORD -> "sptr"
; pGenericMapping : GENERIC_MAPPING* -> "sptr"
; pPrivilegeSet : PRIVILEGE_SET* optional -> "sptr"
; pdwPrivilegeSetLength : DWORD* optional -> "sptr"
; pdwGrantedAccessMask : DWORD* out -> "sptr"
; pbAccessStatus : BOOL* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "USERENV.dll"
#cfunc global RsopAccessCheckByType "RsopAccessCheckByType" sptr, sptr, sptr, int, var, int, var, var, var, var, var
; res = RsopAccessCheckByType(pSecurityDescriptor, pPrincipalSelfSid, pRsopToken, dwDesiredAccessMask, pObjectTypeList, ObjectTypeListLength, pGenericMapping, pPrivilegeSet, pdwPrivilegeSetLength, pdwGrantedAccessMask, pbAccessStatus)
; pSecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; pPrincipalSelfSid : PSID optional -> "sptr"
; pRsopToken : void* -> "sptr"
; dwDesiredAccessMask : DWORD -> "int"
; pObjectTypeList : OBJECT_TYPE_LIST* optional -> "var"
; ObjectTypeListLength : DWORD -> "int"
; pGenericMapping : GENERIC_MAPPING* -> "var"
; pPrivilegeSet : PRIVILEGE_SET* optional -> "var"
; pdwPrivilegeSetLength : DWORD* optional -> "var"
; pdwGrantedAccessMask : DWORD* out -> "var"
; pbAccessStatus : BOOL* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; HRESULT RsopAccessCheckByType(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID pPrincipalSelfSid, void* pRsopToken, DWORD dwDesiredAccessMask, OBJECT_TYPE_LIST* pObjectTypeList, DWORD ObjectTypeListLength, GENERIC_MAPPING* pGenericMapping, PRIVILEGE_SET* pPrivilegeSet, DWORD* pdwPrivilegeSetLength, DWORD* pdwGrantedAccessMask, BOOL* pbAccessStatus)
#uselib "USERENV.dll"
#cfunc global RsopAccessCheckByType "RsopAccessCheckByType" intptr, intptr, intptr, int, var, int, var, var, var, var, var
; res = RsopAccessCheckByType(pSecurityDescriptor, pPrincipalSelfSid, pRsopToken, dwDesiredAccessMask, pObjectTypeList, ObjectTypeListLength, pGenericMapping, pPrivilegeSet, pdwPrivilegeSetLength, pdwGrantedAccessMask, pbAccessStatus)
; pSecurityDescriptor : PSECURITY_DESCRIPTOR -> "intptr"
; pPrincipalSelfSid : PSID optional -> "intptr"
; pRsopToken : void* -> "intptr"
; dwDesiredAccessMask : DWORD -> "int"
; pObjectTypeList : OBJECT_TYPE_LIST* optional -> "var"
; ObjectTypeListLength : DWORD -> "int"
; pGenericMapping : GENERIC_MAPPING* -> "var"
; pPrivilegeSet : PRIVILEGE_SET* optional -> "var"
; pdwPrivilegeSetLength : DWORD* optional -> "var"
; pdwGrantedAccessMask : DWORD* out -> "var"
; pbAccessStatus : BOOL* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	userenv = windows.NewLazySystemDLL("USERENV.dll")
	procRsopAccessCheckByType = userenv.NewProc("RsopAccessCheckByType")
)

// pSecurityDescriptor (PSECURITY_DESCRIPTOR), pPrincipalSelfSid (PSID optional), pRsopToken (void*), dwDesiredAccessMask (DWORD), pObjectTypeList (OBJECT_TYPE_LIST* optional), ObjectTypeListLength (DWORD), pGenericMapping (GENERIC_MAPPING*), pPrivilegeSet (PRIVILEGE_SET* optional), pdwPrivilegeSetLength (DWORD* optional), pdwGrantedAccessMask (DWORD* out), pbAccessStatus (BOOL* out)
r1, _, err := procRsopAccessCheckByType.Call(
	uintptr(pSecurityDescriptor),
	uintptr(pPrincipalSelfSid),
	uintptr(pRsopToken),
	uintptr(dwDesiredAccessMask),
	uintptr(pObjectTypeList),
	uintptr(ObjectTypeListLength),
	uintptr(pGenericMapping),
	uintptr(pPrivilegeSet),
	uintptr(pdwPrivilegeSetLength),
	uintptr(pdwGrantedAccessMask),
	uintptr(pbAccessStatus),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // HRESULT
function RsopAccessCheckByType(
  pSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  pPrincipalSelfSid: THandle;   // PSID optional
  pRsopToken: Pointer;   // void*
  dwDesiredAccessMask: DWORD;   // DWORD
  pObjectTypeList: Pointer;   // OBJECT_TYPE_LIST* optional
  ObjectTypeListLength: DWORD;   // DWORD
  pGenericMapping: Pointer;   // GENERIC_MAPPING*
  pPrivilegeSet: Pointer;   // PRIVILEGE_SET* optional
  pdwPrivilegeSetLength: Pointer;   // DWORD* optional
  pdwGrantedAccessMask: Pointer;   // DWORD* out
  pbAccessStatus: Pointer   // BOOL* out
): Integer; stdcall;
  external 'USERENV.dll' name 'RsopAccessCheckByType';
result := DllCall("USERENV\RsopAccessCheckByType"
    , "Ptr", pSecurityDescriptor   ; PSECURITY_DESCRIPTOR
    , "Ptr", pPrincipalSelfSid   ; PSID optional
    , "Ptr", pRsopToken   ; void*
    , "UInt", dwDesiredAccessMask   ; DWORD
    , "Ptr", pObjectTypeList   ; OBJECT_TYPE_LIST* optional
    , "UInt", ObjectTypeListLength   ; DWORD
    , "Ptr", pGenericMapping   ; GENERIC_MAPPING*
    , "Ptr", pPrivilegeSet   ; PRIVILEGE_SET* optional
    , "Ptr", pdwPrivilegeSetLength   ; DWORD* optional
    , "Ptr", pdwGrantedAccessMask   ; DWORD* out
    , "Ptr", pbAccessStatus   ; BOOL* out
    , "Int")   ; return: HRESULT
●RsopAccessCheckByType(pSecurityDescriptor, pPrincipalSelfSid, pRsopToken, dwDesiredAccessMask, pObjectTypeList, ObjectTypeListLength, pGenericMapping, pPrivilegeSet, pdwPrivilegeSetLength, pdwGrantedAccessMask, pbAccessStatus) = DLL("USERENV.dll", "int RsopAccessCheckByType(void*, void*, void*, dword, void*, dword, void*, void*, void*, void*, void*)")
# 呼び出し: RsopAccessCheckByType(pSecurityDescriptor, pPrincipalSelfSid, pRsopToken, dwDesiredAccessMask, pObjectTypeList, ObjectTypeListLength, pGenericMapping, pPrivilegeSet, pdwPrivilegeSetLength, pdwGrantedAccessMask, pbAccessStatus)
# pSecurityDescriptor : PSECURITY_DESCRIPTOR -> "void*"
# pPrincipalSelfSid : PSID optional -> "void*"
# pRsopToken : void* -> "void*"
# dwDesiredAccessMask : DWORD -> "dword"
# pObjectTypeList : OBJECT_TYPE_LIST* optional -> "void*"
# ObjectTypeListLength : DWORD -> "dword"
# pGenericMapping : GENERIC_MAPPING* -> "void*"
# pPrivilegeSet : PRIVILEGE_SET* optional -> "void*"
# pdwPrivilegeSetLength : DWORD* optional -> "void*"
# pdwGrantedAccessMask : DWORD* out -> "void*"
# pbAccessStatus : BOOL* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

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

typedef RsopAccessCheckByTypeNative = Int32 Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Uint32, Pointer<Void>, Uint32, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Int32>);
typedef RsopAccessCheckByTypeDart = int Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, int, Pointer<Void>, int, Pointer<Void>, Pointer<Void>, Pointer<Uint32>, Pointer<Uint32>, Pointer<Int32>);
final RsopAccessCheckByType = DynamicLibrary.open('USERENV.dll')
    .lookupFunction<RsopAccessCheckByTypeNative, RsopAccessCheckByTypeDart>('RsopAccessCheckByType');
// pSecurityDescriptor : PSECURITY_DESCRIPTOR -> Pointer<Void>
// pPrincipalSelfSid : PSID optional -> Pointer<Void>
// pRsopToken : void* -> Pointer<Void>
// dwDesiredAccessMask : DWORD -> Uint32
// pObjectTypeList : OBJECT_TYPE_LIST* optional -> Pointer<Void>
// ObjectTypeListLength : DWORD -> Uint32
// pGenericMapping : GENERIC_MAPPING* -> Pointer<Void>
// pPrivilegeSet : PRIVILEGE_SET* optional -> Pointer<Void>
// pdwPrivilegeSetLength : DWORD* optional -> Pointer<Uint32>
// pdwGrantedAccessMask : DWORD* out -> Pointer<Uint32>
// pbAccessStatus : BOOL* out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function RsopAccessCheckByType(
  pSecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  pPrincipalSelfSid: THandle;   // PSID optional
  pRsopToken: Pointer;   // void*
  dwDesiredAccessMask: DWORD;   // DWORD
  pObjectTypeList: Pointer;   // OBJECT_TYPE_LIST* optional
  ObjectTypeListLength: DWORD;   // DWORD
  pGenericMapping: Pointer;   // GENERIC_MAPPING*
  pPrivilegeSet: Pointer;   // PRIVILEGE_SET* optional
  pdwPrivilegeSetLength: Pointer;   // DWORD* optional
  pdwGrantedAccessMask: Pointer;   // DWORD* out
  pbAccessStatus: Pointer   // BOOL* out
): Integer; stdcall;
  external 'USERENV.dll' name 'RsopAccessCheckByType';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "RsopAccessCheckByType"
  c_RsopAccessCheckByType :: Ptr () -> Ptr () -> Ptr () -> Word32 -> Ptr () -> Word32 -> Ptr () -> Ptr () -> Ptr Word32 -> Ptr Word32 -> Ptr CInt -> IO Int32
-- pSecurityDescriptor : PSECURITY_DESCRIPTOR -> Ptr ()
-- pPrincipalSelfSid : PSID optional -> Ptr ()
-- pRsopToken : void* -> Ptr ()
-- dwDesiredAccessMask : DWORD -> Word32
-- pObjectTypeList : OBJECT_TYPE_LIST* optional -> Ptr ()
-- ObjectTypeListLength : DWORD -> Word32
-- pGenericMapping : GENERIC_MAPPING* -> Ptr ()
-- pPrivilegeSet : PRIVILEGE_SET* optional -> Ptr ()
-- pdwPrivilegeSetLength : DWORD* optional -> Ptr Word32
-- pdwGrantedAccessMask : DWORD* out -> Ptr Word32
-- pbAccessStatus : BOOL* out -> Ptr CInt
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let rsopaccesscheckbytype =
  foreign "RsopAccessCheckByType"
    ((ptr void) @-> (ptr void) @-> (ptr void) @-> uint32_t @-> (ptr void) @-> uint32_t @-> (ptr void) @-> (ptr void) @-> (ptr uint32_t) @-> (ptr uint32_t) @-> (ptr int32_t) @-> returning int32_t)
(* pSecurityDescriptor : PSECURITY_DESCRIPTOR -> (ptr void) *)
(* pPrincipalSelfSid : PSID optional -> (ptr void) *)
(* pRsopToken : void* -> (ptr void) *)
(* dwDesiredAccessMask : DWORD -> uint32_t *)
(* pObjectTypeList : OBJECT_TYPE_LIST* optional -> (ptr void) *)
(* ObjectTypeListLength : DWORD -> uint32_t *)
(* pGenericMapping : GENERIC_MAPPING* -> (ptr void) *)
(* pPrivilegeSet : PRIVILEGE_SET* optional -> (ptr void) *)
(* pdwPrivilegeSetLength : DWORD* optional -> (ptr uint32_t) *)
(* pdwGrantedAccessMask : DWORD* out -> (ptr uint32_t) *)
(* pbAccessStatus : BOOL* out -> (ptr int32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library userenv (t "USERENV.dll"))
(cffi:use-foreign-library userenv)

(cffi:defcfun ("RsopAccessCheckByType" rsop-access-check-by-type :convention :stdcall) :int32
  (p-security-descriptor :pointer)   ; PSECURITY_DESCRIPTOR
  (p-principal-self-sid :pointer)   ; PSID optional
  (p-rsop-token :pointer)   ; void*
  (dw-desired-access-mask :uint32)   ; DWORD
  (p-object-type-list :pointer)   ; OBJECT_TYPE_LIST* optional
  (object-type-list-length :uint32)   ; DWORD
  (p-generic-mapping :pointer)   ; GENERIC_MAPPING*
  (p-privilege-set :pointer)   ; PRIVILEGE_SET* optional
  (pdw-privilege-set-length :pointer)   ; DWORD* optional
  (pdw-granted-access-mask :pointer)   ; DWORD* out
  (pb-access-status :pointer))   ; BOOL* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RsopAccessCheckByType = Win32::API::More->new('USERENV',
    'int RsopAccessCheckByType(HANDLE pSecurityDescriptor, HANDLE pPrincipalSelfSid, LPVOID pRsopToken, DWORD dwDesiredAccessMask, LPVOID pObjectTypeList, DWORD ObjectTypeListLength, LPVOID pGenericMapping, LPVOID pPrivilegeSet, LPVOID pdwPrivilegeSetLength, LPVOID pdwGrantedAccessMask, LPVOID pbAccessStatus)');
# my $ret = $RsopAccessCheckByType->Call($pSecurityDescriptor, $pPrincipalSelfSid, $pRsopToken, $dwDesiredAccessMask, $pObjectTypeList, $ObjectTypeListLength, $pGenericMapping, $pPrivilegeSet, $pdwPrivilegeSetLength, $pdwGrantedAccessMask, $pbAccessStatus);
# pSecurityDescriptor : PSECURITY_DESCRIPTOR -> HANDLE
# pPrincipalSelfSid : PSID optional -> HANDLE
# pRsopToken : void* -> LPVOID
# dwDesiredAccessMask : DWORD -> DWORD
# pObjectTypeList : OBJECT_TYPE_LIST* optional -> LPVOID
# ObjectTypeListLength : DWORD -> DWORD
# pGenericMapping : GENERIC_MAPPING* -> LPVOID
# pPrivilegeSet : PRIVILEGE_SET* optional -> LPVOID
# pdwPrivilegeSetLength : DWORD* optional -> LPVOID
# pdwGrantedAccessMask : DWORD* out -> LPVOID
# pbAccessStatus : BOOL* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

使用する型