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

AccessCheckByTypeAndAuditAlarmA

関数
オブジェクト種別単位でアクセス権を検査し監査する(ANSI版)。
DLLADVAPI32.dll文字セットANSI (-A)呼出規約winapiSetLastErrorあり対応OSWindows XP 以降

シグネチャ

// ADVAPI32.dll  (ANSI / -A)
#include <windows.h>

BOOL AccessCheckByTypeAndAuditAlarmA(
    LPCSTR SubsystemName,
    void* HandleId,
    LPCSTR ObjectTypeName,
    LPCSTR ObjectName,   // optional
    PSECURITY_DESCRIPTOR SecurityDescriptor,
    PSID PrincipalSelfSid,   // optional
    DWORD DesiredAccess,
    AUDIT_EVENT_TYPE AuditType,
    DWORD Flags,
    OBJECT_TYPE_LIST* ObjectTypeList,   // optional
    DWORD ObjectTypeListLength,
    GENERIC_MAPPING* GenericMapping,
    BOOL ObjectCreation,
    DWORD* GrantedAccess,
    BOOL* AccessStatus,
    BOOL* pfGenerateOnClose
);

パラメーター

名前方向説明
SubsystemNameLPCSTRinこの関数を呼び出すサブシステムの名前を指定する、null で終わる文字列へのポインターです。この文字列は、関数が生成する監査メッセージに表示されます。
HandleIdvoid*inオブジェクトへのクライアントのハンドルを表す一意の値へのポインターです。アクセスが拒否された場合、システムはこの値を無視します。
ObjectTypeNameLPCSTRin作成またはアクセスされるオブジェクトの種類を指定する、null で終わる文字列へのポインターです。この文字列は、関数が生成する監査メッセージに表示されます。
ObjectNameLPCSTRinoptional作成またはアクセスされるオブジェクトの名前を指定する、null で終わる文字列へのポインターです。この文字列は、関数が生成する監査メッセージに表示されます。
SecurityDescriptorPSECURITY_DESCRIPTORinアクセスを照合する対象となる SECURITY_DESCRIPTOR 構造体へのポインターです。
PrincipalSelfSidPSIDinoptional

セキュリティ識別子 (SID) へのポインターです。セキュリティ記述子がプリンシパルを表すオブジェクト (たとえばユーザー オブジェクト) に関連付けられている場合、PrincipalSelfSid パラメーターにはそのオブジェクトの SID を指定する必要があります。アクセスの評価時には、この SID は、よく知られた PRINCIPAL_SELF SID (S-1-5-10) を含む任意の ACE 内の SID を論理的に置き換えます。よく知られた SID については、Well-known SIDs を参照してください。

保護対象のオブジェクトがプリンシパルを表さない場合は、このパラメーターを NULL に設定します。

DesiredAccessDWORDin

チェックするアクセス権を指定する アクセス マスク です。このマスクは、 MapGenericMask 関数によってマッピングされ、汎用アクセス権を含まないようにしておく必要があります。

このパラメーターが MAXIMUM_ALLOWED の場合、関数は、セキュリティ記述子がクライアントに許可する最大のアクセス権を示すように GrantedAccess アクセス マスクを設定します。

AuditTypeAUDIT_EVENT_TYPEin生成する監査の種類です。これは、 AUDIT_EVENT_TYPE 列挙型の値のいずれかを指定できます。
FlagsDWORDin呼び出し元のプロセスSE_AUDIT_NAME 特権が有効になっていない場合の、この関数の動作を制御するフラグです。AUDIT_ALLOW_NO_PRIVILEGE フラグが設定されている場合、特権が有効でなくても、関数は監査メッセージを生成せずにアクセス チェックを実行します。このパラメーターが 0 の場合、特権が有効でなければ関数は失敗します。
ObjectTypeListOBJECT_TYPE_LIST*inoutoptional

アクセスをチェックするオブジェクト型の階層を識別する OBJECT_TYPE_LIST 構造体の配列へのポインターです。配列の各要素は、オブジェクト型を識別する GUID と、オブジェクト型の階層におけるそのオブジェクト型のレベルを示す値を指定します。配列に同じ GUID を持つ要素を 2 つ含めることはできません。

配列には少なくとも 1 つの要素が必要です。配列の最初の要素はレベル 0 であり、オブジェクト自体を識別する必要があります。配列にレベル 0 の要素を 1 つだけ含めることができます。2 番目の要素は、レベル 1 のプロパティ セットなどのサブオブジェクトです。各レベル 1 のエントリの後には、レベル 2 から 4 のサブオブジェクトに対する下位のエントリが続きます。したがって、配列の要素のレベルは {0, 1, 2, 2, 1, 2, 3} のようになります。オブジェクト型リストの順序が正しくない場合、AccessCheckByTypeAndAuditAlarm は失敗し、 GetLastErrorERROR_INVALID_PARAMETER を返します。

ObjectTypeListLengthDWORDinObjectTypeList 配列の要素数です。
GenericMappingGENERIC_MAPPING*inアクセスをチェックする対象のオブジェクトに関連付けられた GENERIC_MAPPING 構造体へのポインターです。
ObjectCreationBOOLinアクセスが許可されたときに、呼び出し元のアプリケーションが新しいオブジェクトを作成するかどうかを決定するフラグです。値が TRUE の場合、アプリケーションは新しいオブジェクトを作成します。値が FALSE の場合、アプリケーションは既存のオブジェクトを開きます。
GrantedAccessDWORD*out許可されたアクセス権を受け取るアクセス マスクへのポインターです。AccessStatusFALSE に設定されている場合、関数はアクセス マスクを 0 に設定します。関数が失敗した場合、アクセス マスクは設定されません。
AccessStatusBOOL*outアクセス チェックの結果を受け取る変数へのポインターです。セキュリティ記述子がクライアントに要求されたアクセス権を許可する場合、AccessStatusTRUE に設定されます。それ以外の場合、AccessStatusFALSE に設定され、 GetLastError を呼び出して詳細なエラー情報を取得できます。
pfGenerateOnCloseBOOL*out関数が戻るときに監査生成ルーチンによって設定されるフラグへのポインターです。オブジェクト ハンドルを閉じるときに、このフラグを ObjectCloseAuditAlarm 関数に渡します。

戻り値の型: BOOL

公式ドキュメント

セキュリティ記述子が、呼び出し元スレッドが偽装しているクライアントに対して、指定された一連のアクセス権を許可するかどうかを判定します。(AccessCheckByTypeAndAuditAlarmA)

戻り値

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

関数が失敗した場合は 0 を返します。詳細なエラー情報を取得するには、 GetLastError を呼び出します。

解説(Remarks)

詳細については、How AccessCheck Works の概要を参照してください。

PrincipalSelfSid パラメーターと ObjectTypeList パラメーターが NULL で、AuditType パラメーターが AuditEventObjectAccess で、Flags パラメーターが 0 の場合、AccessCheckByTypeAndAuditAlarmAccessCheckAndAuditAlarm 関数と同じように動作します。

ObjectTypeList 配列は、必ずしも定義済みオブジェクト全体を表すわけではありません。むしろ、アクセスをチェックする対象となるオブジェクトのサブセットを表します。たとえば、プロパティ セット内の 2 つのプロパティへのアクセスをチェックするには、4 つの要素を持つオブジェクト型リストを指定します。すなわち、レベル 0 のオブジェクト自体、レベル 1 のプロパティ セット、レベル 2 の 2 つのプロパティです。

AccessCheckByTypeAndAuditAlarm 関数は、オブジェクト自体に適用される ACE と、ObjectTypeList 配列に列挙されたオブジェクト型に対するオブジェクト固有の ACE を評価します。この関数は、ObjectTypeList 配列に列挙されていないオブジェクト型に対するオブジェクト固有の ACE を無視します。したがって、AccessStatus パラメーターで返される結果は、オブジェクト全体ではなく、ObjectTypeList パラメーターによって定義されたオブジェクトのサブセットに対して許可されるアクセスを示します。

ACE の階層がオブジェクトとそのサブオブジェクトへのアクセスをどのように制御するかの詳細については、 ACEs to Control Access to an Object's Properties を参照してください。

セキュリティ イベント ログに監査メッセージを生成するには、呼び出し元のプロセスに SE_AUDIT_NAME 特権が有効になっている必要があります。システムは、スレッドの偽装トークンではなく、呼び出し元プロセスのプライマリ トークンでこの特権を確認します。Flags パラメーターに AUDIT_ALLOW_NO_PRIVILEGE フラグが含まれている場合、特権が有効でなくても、関数は監査メッセージを生成せずにアクセス チェックを実行します。

AccessCheckByTypeAndAuditAlarm 関数は、呼び出し元スレッドがクライアントを偽装していない場合は失敗します。

セキュリティ記述子に所有者 SID とグループ SID が含まれていない場合、AccessCheckByTypeAndAuditAlarmERROR_INVALID_SECURITY_DESCR で失敗します。

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

各言語での呼び出し定義

// ADVAPI32.dll  (ANSI / -A)
#include <windows.h>

BOOL AccessCheckByTypeAndAuditAlarmA(
    LPCSTR SubsystemName,
    void* HandleId,
    LPCSTR ObjectTypeName,
    LPCSTR ObjectName,   // optional
    PSECURITY_DESCRIPTOR SecurityDescriptor,
    PSID PrincipalSelfSid,   // optional
    DWORD DesiredAccess,
    AUDIT_EVENT_TYPE AuditType,
    DWORD Flags,
    OBJECT_TYPE_LIST* ObjectTypeList,   // optional
    DWORD ObjectTypeListLength,
    GENERIC_MAPPING* GenericMapping,
    BOOL ObjectCreation,
    DWORD* GrantedAccess,
    BOOL* AccessStatus,
    BOOL* pfGenerateOnClose
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern bool AccessCheckByTypeAndAuditAlarmA(
    [MarshalAs(UnmanagedType.LPStr)] string SubsystemName,   // LPCSTR
    IntPtr HandleId,   // void*
    [MarshalAs(UnmanagedType.LPStr)] string ObjectTypeName,   // LPCSTR
    [MarshalAs(UnmanagedType.LPStr)] string ObjectName,   // LPCSTR optional
    IntPtr SecurityDescriptor,   // PSECURITY_DESCRIPTOR
    IntPtr PrincipalSelfSid,   // PSID optional
    uint DesiredAccess,   // DWORD
    int AuditType,   // AUDIT_EVENT_TYPE
    uint Flags,   // DWORD
    IntPtr ObjectTypeList,   // OBJECT_TYPE_LIST* optional, in/out
    uint ObjectTypeListLength,   // DWORD
    IntPtr GenericMapping,   // GENERIC_MAPPING*
    bool ObjectCreation,   // BOOL
    out uint GrantedAccess,   // DWORD* out
    out bool AccessStatus,   // BOOL* out
    out bool pfGenerateOnClose   // BOOL* out
);
<DllImport("ADVAPI32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function AccessCheckByTypeAndAuditAlarmA(
    <MarshalAs(UnmanagedType.LPStr)> SubsystemName As String,   ' LPCSTR
    HandleId As IntPtr,   ' void*
    <MarshalAs(UnmanagedType.LPStr)> ObjectTypeName As String,   ' LPCSTR
    <MarshalAs(UnmanagedType.LPStr)> ObjectName As String,   ' LPCSTR optional
    SecurityDescriptor As IntPtr,   ' PSECURITY_DESCRIPTOR
    PrincipalSelfSid As IntPtr,   ' PSID optional
    DesiredAccess As UInteger,   ' DWORD
    AuditType As Integer,   ' AUDIT_EVENT_TYPE
    Flags As UInteger,   ' DWORD
    ObjectTypeList As IntPtr,   ' OBJECT_TYPE_LIST* optional, in/out
    ObjectTypeListLength As UInteger,   ' DWORD
    GenericMapping As IntPtr,   ' GENERIC_MAPPING*
    ObjectCreation As Boolean,   ' BOOL
    <Out> ByRef GrantedAccess As UInteger,   ' DWORD* out
    <Out> ByRef AccessStatus As Boolean,   ' BOOL* out
    <Out> ByRef pfGenerateOnClose As Boolean   ' BOOL* out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' SubsystemName : LPCSTR
' HandleId : void*
' ObjectTypeName : LPCSTR
' ObjectName : LPCSTR optional
' SecurityDescriptor : PSECURITY_DESCRIPTOR
' PrincipalSelfSid : PSID optional
' DesiredAccess : DWORD
' AuditType : AUDIT_EVENT_TYPE
' Flags : DWORD
' ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out
' ObjectTypeListLength : DWORD
' GenericMapping : GENERIC_MAPPING*
' ObjectCreation : BOOL
' GrantedAccess : DWORD* out
' AccessStatus : BOOL* out
' pfGenerateOnClose : BOOL* out
Declare PtrSafe Function AccessCheckByTypeAndAuditAlarmA Lib "advapi32" ( _
    ByVal SubsystemName As String, _
    ByVal HandleId As LongPtr, _
    ByVal ObjectTypeName As String, _
    ByVal ObjectName As String, _
    ByVal SecurityDescriptor As LongPtr, _
    ByVal PrincipalSelfSid As LongPtr, _
    ByVal DesiredAccess As Long, _
    ByVal AuditType As Long, _
    ByVal Flags As Long, _
    ByVal ObjectTypeList As LongPtr, _
    ByVal ObjectTypeListLength As Long, _
    ByVal GenericMapping As LongPtr, _
    ByVal ObjectCreation As Long, _
    ByRef GrantedAccess As Long, _
    ByRef AccessStatus As Long, _
    ByRef pfGenerateOnClose As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

AccessCheckByTypeAndAuditAlarmA = ctypes.windll.advapi32.AccessCheckByTypeAndAuditAlarmA
AccessCheckByTypeAndAuditAlarmA.restype = wintypes.BOOL
AccessCheckByTypeAndAuditAlarmA.argtypes = [
    wintypes.LPCSTR,  # SubsystemName : LPCSTR
    ctypes.POINTER(None),  # HandleId : void*
    wintypes.LPCSTR,  # ObjectTypeName : LPCSTR
    wintypes.LPCSTR,  # ObjectName : LPCSTR optional
    wintypes.HANDLE,  # SecurityDescriptor : PSECURITY_DESCRIPTOR
    wintypes.HANDLE,  # PrincipalSelfSid : PSID optional
    wintypes.DWORD,  # DesiredAccess : DWORD
    ctypes.c_int,  # AuditType : AUDIT_EVENT_TYPE
    wintypes.DWORD,  # Flags : DWORD
    ctypes.c_void_p,  # ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out
    wintypes.DWORD,  # ObjectTypeListLength : DWORD
    ctypes.c_void_p,  # GenericMapping : GENERIC_MAPPING*
    wintypes.BOOL,  # ObjectCreation : BOOL
    ctypes.POINTER(wintypes.DWORD),  # GrantedAccess : DWORD* out
    ctypes.c_void_p,  # AccessStatus : BOOL* out
    ctypes.c_void_p,  # pfGenerateOnClose : BOOL* out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
AccessCheckByTypeAndAuditAlarmA = Fiddle::Function.new(
  lib['AccessCheckByTypeAndAuditAlarmA'],
  [
    Fiddle::TYPE_VOIDP,  # SubsystemName : LPCSTR
    Fiddle::TYPE_VOIDP,  # HandleId : void*
    Fiddle::TYPE_VOIDP,  # ObjectTypeName : LPCSTR
    Fiddle::TYPE_VOIDP,  # ObjectName : LPCSTR optional
    Fiddle::TYPE_VOIDP,  # SecurityDescriptor : PSECURITY_DESCRIPTOR
    Fiddle::TYPE_VOIDP,  # PrincipalSelfSid : PSID optional
    -Fiddle::TYPE_INT,  # DesiredAccess : DWORD
    Fiddle::TYPE_INT,  # AuditType : AUDIT_EVENT_TYPE
    -Fiddle::TYPE_INT,  # Flags : DWORD
    Fiddle::TYPE_VOIDP,  # ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out
    -Fiddle::TYPE_INT,  # ObjectTypeListLength : DWORD
    Fiddle::TYPE_VOIDP,  # GenericMapping : GENERIC_MAPPING*
    Fiddle::TYPE_INT,  # ObjectCreation : BOOL
    Fiddle::TYPE_VOIDP,  # GrantedAccess : DWORD* out
    Fiddle::TYPE_VOIDP,  # AccessStatus : BOOL* out
    Fiddle::TYPE_VOIDP,  # pfGenerateOnClose : BOOL* out
  ],
  Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn AccessCheckByTypeAndAuditAlarmA(
        SubsystemName: *const u8,  // LPCSTR
        HandleId: *mut (),  // void*
        ObjectTypeName: *const u8,  // LPCSTR
        ObjectName: *const u8,  // LPCSTR optional
        SecurityDescriptor: *mut core::ffi::c_void,  // PSECURITY_DESCRIPTOR
        PrincipalSelfSid: *mut core::ffi::c_void,  // PSID optional
        DesiredAccess: u32,  // DWORD
        AuditType: i32,  // AUDIT_EVENT_TYPE
        Flags: u32,  // DWORD
        ObjectTypeList: *mut OBJECT_TYPE_LIST,  // OBJECT_TYPE_LIST* optional, in/out
        ObjectTypeListLength: u32,  // DWORD
        GenericMapping: *mut GENERIC_MAPPING,  // GENERIC_MAPPING*
        ObjectCreation: i32,  // BOOL
        GrantedAccess: *mut u32,  // DWORD* out
        AccessStatus: *mut i32,  // BOOL* out
        pfGenerateOnClose: *mut i32  // BOOL* out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("ADVAPI32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool AccessCheckByTypeAndAuditAlarmA([MarshalAs(UnmanagedType.LPStr)] string SubsystemName, IntPtr HandleId, [MarshalAs(UnmanagedType.LPStr)] string ObjectTypeName, [MarshalAs(UnmanagedType.LPStr)] string ObjectName, IntPtr SecurityDescriptor, IntPtr PrincipalSelfSid, uint DesiredAccess, int AuditType, uint Flags, IntPtr ObjectTypeList, uint ObjectTypeListLength, IntPtr GenericMapping, bool ObjectCreation, out uint GrantedAccess, out bool AccessStatus, out bool pfGenerateOnClose);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_AccessCheckByTypeAndAuditAlarmA' -Namespace Win32 -PassThru
# $api::AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
#uselib "ADVAPI32.dll"
#func global AccessCheckByTypeAndAuditAlarmA "AccessCheckByTypeAndAuditAlarmA" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; AccessCheckByTypeAndAuditAlarmA SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, varptr(ObjectTypeList), ObjectTypeListLength, varptr(GenericMapping), ObjectCreation, varptr(GrantedAccess), varptr(AccessStatus), varptr(pfGenerateOnClose)   ; 戻り値は stat
; SubsystemName : LPCSTR -> "sptr"
; HandleId : void* -> "sptr"
; ObjectTypeName : LPCSTR -> "sptr"
; ObjectName : LPCSTR optional -> "sptr"
; SecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; PrincipalSelfSid : PSID optional -> "sptr"
; DesiredAccess : DWORD -> "sptr"
; AuditType : AUDIT_EVENT_TYPE -> "sptr"
; Flags : DWORD -> "sptr"
; ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> "sptr"
; ObjectTypeListLength : DWORD -> "sptr"
; GenericMapping : GENERIC_MAPPING* -> "sptr"
; ObjectCreation : BOOL -> "sptr"
; GrantedAccess : DWORD* out -> "sptr"
; AccessStatus : BOOL* out -> "sptr"
; pfGenerateOnClose : BOOL* out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global AccessCheckByTypeAndAuditAlarmA "AccessCheckByTypeAndAuditAlarmA" str, sptr, str, str, sptr, sptr, int, int, int, var, int, var, int, var, var, var
; res = AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
; SubsystemName : LPCSTR -> "str"
; HandleId : void* -> "sptr"
; ObjectTypeName : LPCSTR -> "str"
; ObjectName : LPCSTR optional -> "str"
; SecurityDescriptor : PSECURITY_DESCRIPTOR -> "sptr"
; PrincipalSelfSid : PSID optional -> "sptr"
; DesiredAccess : DWORD -> "int"
; AuditType : AUDIT_EVENT_TYPE -> "int"
; Flags : DWORD -> "int"
; ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> "var"
; ObjectTypeListLength : DWORD -> "int"
; GenericMapping : GENERIC_MAPPING* -> "var"
; ObjectCreation : BOOL -> "int"
; GrantedAccess : DWORD* out -> "var"
; AccessStatus : BOOL* out -> "var"
; pfGenerateOnClose : BOOL* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL AccessCheckByTypeAndAuditAlarmA(LPCSTR SubsystemName, void* HandleId, LPCSTR ObjectTypeName, LPCSTR ObjectName, PSECURITY_DESCRIPTOR SecurityDescriptor, PSID PrincipalSelfSid, DWORD DesiredAccess, AUDIT_EVENT_TYPE AuditType, DWORD Flags, OBJECT_TYPE_LIST* ObjectTypeList, DWORD ObjectTypeListLength, GENERIC_MAPPING* GenericMapping, BOOL ObjectCreation, DWORD* GrantedAccess, BOOL* AccessStatus, BOOL* pfGenerateOnClose)
#uselib "ADVAPI32.dll"
#cfunc global AccessCheckByTypeAndAuditAlarmA "AccessCheckByTypeAndAuditAlarmA" str, intptr, str, str, intptr, intptr, int, int, int, var, int, var, int, var, var, var
; res = AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
; SubsystemName : LPCSTR -> "str"
; HandleId : void* -> "intptr"
; ObjectTypeName : LPCSTR -> "str"
; ObjectName : LPCSTR optional -> "str"
; SecurityDescriptor : PSECURITY_DESCRIPTOR -> "intptr"
; PrincipalSelfSid : PSID optional -> "intptr"
; DesiredAccess : DWORD -> "int"
; AuditType : AUDIT_EVENT_TYPE -> "int"
; Flags : DWORD -> "int"
; ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> "var"
; ObjectTypeListLength : DWORD -> "int"
; GenericMapping : GENERIC_MAPPING* -> "var"
; ObjectCreation : BOOL -> "int"
; GrantedAccess : DWORD* out -> "var"
; AccessStatus : BOOL* out -> "var"
; pfGenerateOnClose : BOOL* out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procAccessCheckByTypeAndAuditAlarmA = advapi32.NewProc("AccessCheckByTypeAndAuditAlarmA")
)

// SubsystemName (LPCSTR), HandleId (void*), ObjectTypeName (LPCSTR), ObjectName (LPCSTR optional), SecurityDescriptor (PSECURITY_DESCRIPTOR), PrincipalSelfSid (PSID optional), DesiredAccess (DWORD), AuditType (AUDIT_EVENT_TYPE), Flags (DWORD), ObjectTypeList (OBJECT_TYPE_LIST* optional, in/out), ObjectTypeListLength (DWORD), GenericMapping (GENERIC_MAPPING*), ObjectCreation (BOOL), GrantedAccess (DWORD* out), AccessStatus (BOOL* out), pfGenerateOnClose (BOOL* out)
r1, _, err := procAccessCheckByTypeAndAuditAlarmA.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(SubsystemName))),
	uintptr(HandleId),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(ObjectTypeName))),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(ObjectName))),
	uintptr(SecurityDescriptor),
	uintptr(PrincipalSelfSid),
	uintptr(DesiredAccess),
	uintptr(AuditType),
	uintptr(Flags),
	uintptr(ObjectTypeList),
	uintptr(ObjectTypeListLength),
	uintptr(GenericMapping),
	uintptr(ObjectCreation),
	uintptr(GrantedAccess),
	uintptr(AccessStatus),
	uintptr(pfGenerateOnClose),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function AccessCheckByTypeAndAuditAlarmA(
  SubsystemName: PAnsiChar;   // LPCSTR
  HandleId: Pointer;   // void*
  ObjectTypeName: PAnsiChar;   // LPCSTR
  ObjectName: PAnsiChar;   // LPCSTR optional
  SecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  PrincipalSelfSid: THandle;   // PSID optional
  DesiredAccess: DWORD;   // DWORD
  AuditType: Integer;   // AUDIT_EVENT_TYPE
  Flags: DWORD;   // DWORD
  ObjectTypeList: Pointer;   // OBJECT_TYPE_LIST* optional, in/out
  ObjectTypeListLength: DWORD;   // DWORD
  GenericMapping: Pointer;   // GENERIC_MAPPING*
  ObjectCreation: BOOL;   // BOOL
  GrantedAccess: Pointer;   // DWORD* out
  AccessStatus: Pointer;   // BOOL* out
  pfGenerateOnClose: Pointer   // BOOL* out
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'AccessCheckByTypeAndAuditAlarmA';
result := DllCall("ADVAPI32\AccessCheckByTypeAndAuditAlarmA"
    , "AStr", SubsystemName   ; LPCSTR
    , "Ptr", HandleId   ; void*
    , "AStr", ObjectTypeName   ; LPCSTR
    , "AStr", ObjectName   ; LPCSTR optional
    , "Ptr", SecurityDescriptor   ; PSECURITY_DESCRIPTOR
    , "Ptr", PrincipalSelfSid   ; PSID optional
    , "UInt", DesiredAccess   ; DWORD
    , "Int", AuditType   ; AUDIT_EVENT_TYPE
    , "UInt", Flags   ; DWORD
    , "Ptr", ObjectTypeList   ; OBJECT_TYPE_LIST* optional, in/out
    , "UInt", ObjectTypeListLength   ; DWORD
    , "Ptr", GenericMapping   ; GENERIC_MAPPING*
    , "Int", ObjectCreation   ; BOOL
    , "Ptr", GrantedAccess   ; DWORD* out
    , "Ptr", AccessStatus   ; BOOL* out
    , "Ptr", pfGenerateOnClose   ; BOOL* out
    , "Int")   ; return: BOOL
●AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose) = DLL("ADVAPI32.dll", "bool AccessCheckByTypeAndAuditAlarmA(char*, void*, char*, char*, void*, void*, dword, int, dword, void*, dword, void*, bool, void*, void*, void*)")
# 呼び出し: AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
# SubsystemName : LPCSTR -> "char*"
# HandleId : void* -> "void*"
# ObjectTypeName : LPCSTR -> "char*"
# ObjectName : LPCSTR optional -> "char*"
# SecurityDescriptor : PSECURITY_DESCRIPTOR -> "void*"
# PrincipalSelfSid : PSID optional -> "void*"
# DesiredAccess : DWORD -> "dword"
# AuditType : AUDIT_EVENT_TYPE -> "int"
# Flags : DWORD -> "dword"
# ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> "void*"
# ObjectTypeListLength : DWORD -> "dword"
# GenericMapping : GENERIC_MAPPING* -> "void*"
# ObjectCreation : BOOL -> "bool"
# GrantedAccess : DWORD* out -> "void*"
# AccessStatus : BOOL* out -> "void*"
# pfGenerateOnClose : BOOL* out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "advapi32" fn AccessCheckByTypeAndAuditAlarmA(
    SubsystemName: [*c]const u8, // LPCSTR
    HandleId: ?*anyopaque, // void*
    ObjectTypeName: [*c]const u8, // LPCSTR
    ObjectName: [*c]const u8, // LPCSTR optional
    SecurityDescriptor: ?*anyopaque, // PSECURITY_DESCRIPTOR
    PrincipalSelfSid: ?*anyopaque, // PSID optional
    DesiredAccess: u32, // DWORD
    AuditType: i32, // AUDIT_EVENT_TYPE
    Flags: u32, // DWORD
    ObjectTypeList: [*c]OBJECT_TYPE_LIST, // OBJECT_TYPE_LIST* optional, in/out
    ObjectTypeListLength: u32, // DWORD
    GenericMapping: [*c]GENERIC_MAPPING, // GENERIC_MAPPING*
    ObjectCreation: i32, // BOOL
    GrantedAccess: [*c]u32, // DWORD* out
    AccessStatus: [*c]i32, // BOOL* out
    pfGenerateOnClose: [*c]i32 // BOOL* out
) callconv(std.os.windows.WINAPI) i32;
proc AccessCheckByTypeAndAuditAlarmA(
    SubsystemName: cstring,  # LPCSTR
    HandleId: pointer,  # void*
    ObjectTypeName: cstring,  # LPCSTR
    ObjectName: cstring,  # LPCSTR optional
    SecurityDescriptor: pointer,  # PSECURITY_DESCRIPTOR
    PrincipalSelfSid: pointer,  # PSID optional
    DesiredAccess: uint32,  # DWORD
    AuditType: int32,  # AUDIT_EVENT_TYPE
    Flags: uint32,  # DWORD
    ObjectTypeList: ptr OBJECT_TYPE_LIST,  # OBJECT_TYPE_LIST* optional, in/out
    ObjectTypeListLength: uint32,  # DWORD
    GenericMapping: ptr GENERIC_MAPPING,  # GENERIC_MAPPING*
    ObjectCreation: int32,  # BOOL
    GrantedAccess: ptr uint32,  # DWORD* out
    AccessStatus: ptr int32,  # BOOL* out
    pfGenerateOnClose: ptr int32  # BOOL* out
): int32 {.importc: "AccessCheckByTypeAndAuditAlarmA", stdcall, dynlib: "ADVAPI32.dll".}
pragma(lib, "advapi32");
extern(Windows)
int AccessCheckByTypeAndAuditAlarmA(
    const(char)* SubsystemName,   // LPCSTR
    void* HandleId,   // void*
    const(char)* ObjectTypeName,   // LPCSTR
    const(char)* ObjectName,   // LPCSTR optional
    void* SecurityDescriptor,   // PSECURITY_DESCRIPTOR
    void* PrincipalSelfSid,   // PSID optional
    uint DesiredAccess,   // DWORD
    int AuditType,   // AUDIT_EVENT_TYPE
    uint Flags,   // DWORD
    OBJECT_TYPE_LIST* ObjectTypeList,   // OBJECT_TYPE_LIST* optional, in/out
    uint ObjectTypeListLength,   // DWORD
    GENERIC_MAPPING* GenericMapping,   // GENERIC_MAPPING*
    int ObjectCreation,   // BOOL
    uint* GrantedAccess,   // DWORD* out
    int* AccessStatus,   // BOOL* out
    int* pfGenerateOnClose   // BOOL* out
);
ccall((:AccessCheckByTypeAndAuditAlarmA, "ADVAPI32.dll"), stdcall, Int32,
      (Cstring, Ptr{Cvoid}, Cstring, Cstring, Ptr{Cvoid}, Ptr{Cvoid}, UInt32, Int32, UInt32, Ptr{OBJECT_TYPE_LIST}, UInt32, Ptr{GENERIC_MAPPING}, Int32, Ptr{UInt32}, Ptr{Int32}, Ptr{Int32}),
      SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
# SubsystemName : LPCSTR -> Cstring
# HandleId : void* -> Ptr{Cvoid}
# ObjectTypeName : LPCSTR -> Cstring
# ObjectName : LPCSTR optional -> Cstring
# SecurityDescriptor : PSECURITY_DESCRIPTOR -> Ptr{Cvoid}
# PrincipalSelfSid : PSID optional -> Ptr{Cvoid}
# DesiredAccess : DWORD -> UInt32
# AuditType : AUDIT_EVENT_TYPE -> Int32
# Flags : DWORD -> UInt32
# ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> Ptr{OBJECT_TYPE_LIST}
# ObjectTypeListLength : DWORD -> UInt32
# GenericMapping : GENERIC_MAPPING* -> Ptr{GENERIC_MAPPING}
# ObjectCreation : BOOL -> Int32
# GrantedAccess : DWORD* out -> Ptr{UInt32}
# AccessStatus : BOOL* out -> Ptr{Int32}
# pfGenerateOnClose : BOOL* out -> Ptr{Int32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t AccessCheckByTypeAndAuditAlarmA(
    const char* SubsystemName,
    void* HandleId,
    const char* ObjectTypeName,
    const char* ObjectName,
    void* SecurityDescriptor,
    void* PrincipalSelfSid,
    uint32_t DesiredAccess,
    int32_t AuditType,
    uint32_t Flags,
    void* ObjectTypeList,
    uint32_t ObjectTypeListLength,
    void* GenericMapping,
    int32_t ObjectCreation,
    uint32_t* GrantedAccess,
    int32_t* AccessStatus,
    int32_t* pfGenerateOnClose);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
-- SubsystemName : LPCSTR
-- HandleId : void*
-- ObjectTypeName : LPCSTR
-- ObjectName : LPCSTR optional
-- SecurityDescriptor : PSECURITY_DESCRIPTOR
-- PrincipalSelfSid : PSID optional
-- DesiredAccess : DWORD
-- AuditType : AUDIT_EVENT_TYPE
-- Flags : DWORD
-- ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out
-- ObjectTypeListLength : DWORD
-- GenericMapping : GENERIC_MAPPING*
-- ObjectCreation : BOOL
-- GrantedAccess : DWORD* out
-- AccessStatus : BOOL* out
-- pfGenerateOnClose : BOOL* out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const AccessCheckByTypeAndAuditAlarmA = lib.func('__stdcall', 'AccessCheckByTypeAndAuditAlarmA', 'int32_t', ['str', 'void *', 'str', 'str', 'void *', 'void *', 'uint32_t', 'int32_t', 'uint32_t', 'void *', 'uint32_t', 'void *', 'int32_t', 'uint32_t *', 'int32_t *', 'int32_t *']);
// AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
// SubsystemName : LPCSTR -> 'str'
// HandleId : void* -> 'void *'
// ObjectTypeName : LPCSTR -> 'str'
// ObjectName : LPCSTR optional -> 'str'
// SecurityDescriptor : PSECURITY_DESCRIPTOR -> 'void *'
// PrincipalSelfSid : PSID optional -> 'void *'
// DesiredAccess : DWORD -> 'uint32_t'
// AuditType : AUDIT_EVENT_TYPE -> 'int32_t'
// Flags : DWORD -> 'uint32_t'
// ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> 'void *'
// ObjectTypeListLength : DWORD -> 'uint32_t'
// GenericMapping : GENERIC_MAPPING* -> 'void *'
// ObjectCreation : BOOL -> 'int32_t'
// GrantedAccess : DWORD* out -> 'uint32_t *'
// AccessStatus : BOOL* out -> 'int32_t *'
// pfGenerateOnClose : BOOL* out -> 'int32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ADVAPI32.dll", {
  AccessCheckByTypeAndAuditAlarmA: { parameters: ["buffer", "pointer", "buffer", "buffer", "pointer", "pointer", "u32", "i32", "u32", "pointer", "u32", "pointer", "i32", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
// SubsystemName : LPCSTR -> "buffer"
// HandleId : void* -> "pointer"
// ObjectTypeName : LPCSTR -> "buffer"
// ObjectName : LPCSTR optional -> "buffer"
// SecurityDescriptor : PSECURITY_DESCRIPTOR -> "pointer"
// PrincipalSelfSid : PSID optional -> "pointer"
// DesiredAccess : DWORD -> "u32"
// AuditType : AUDIT_EVENT_TYPE -> "i32"
// Flags : DWORD -> "u32"
// ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> "pointer"
// ObjectTypeListLength : DWORD -> "u32"
// GenericMapping : GENERIC_MAPPING* -> "pointer"
// ObjectCreation : BOOL -> "i32"
// GrantedAccess : DWORD* out -> "pointer"
// AccessStatus : BOOL* out -> "pointer"
// pfGenerateOnClose : BOOL* out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t AccessCheckByTypeAndAuditAlarmA(
    const char* SubsystemName,
    void* HandleId,
    const char* ObjectTypeName,
    const char* ObjectName,
    void* SecurityDescriptor,
    void* PrincipalSelfSid,
    uint32_t DesiredAccess,
    int32_t AuditType,
    uint32_t Flags,
    void* ObjectTypeList,
    uint32_t ObjectTypeListLength,
    void* GenericMapping,
    int32_t ObjectCreation,
    uint32_t* GrantedAccess,
    int32_t* AccessStatus,
    int32_t* pfGenerateOnClose);
C, "ADVAPI32.dll");
// $ffi->AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose);
// SubsystemName : LPCSTR
// HandleId : void*
// ObjectTypeName : LPCSTR
// ObjectName : LPCSTR optional
// SecurityDescriptor : PSECURITY_DESCRIPTOR
// PrincipalSelfSid : PSID optional
// DesiredAccess : DWORD
// AuditType : AUDIT_EVENT_TYPE
// Flags : DWORD
// ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out
// ObjectTypeListLength : DWORD
// GenericMapping : GENERIC_MAPPING*
// ObjectCreation : BOOL
// GrantedAccess : DWORD* out
// AccessStatus : BOOL* out
// pfGenerateOnClose : 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 Advapi32 extends StdCallLibrary {
    Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class, W32APIOptions.ASCII_OPTIONS);
    boolean AccessCheckByTypeAndAuditAlarmA(
        String SubsystemName,   // LPCSTR
        Pointer HandleId,   // void*
        String ObjectTypeName,   // LPCSTR
        String ObjectName,   // LPCSTR optional
        Pointer SecurityDescriptor,   // PSECURITY_DESCRIPTOR
        Pointer PrincipalSelfSid,   // PSID optional
        int DesiredAccess,   // DWORD
        int AuditType,   // AUDIT_EVENT_TYPE
        int Flags,   // DWORD
        Pointer ObjectTypeList,   // OBJECT_TYPE_LIST* optional, in/out
        int ObjectTypeListLength,   // DWORD
        Pointer GenericMapping,   // GENERIC_MAPPING*
        boolean ObjectCreation,   // BOOL
        IntByReference GrantedAccess,   // DWORD* out
        IntByReference AccessStatus,   // BOOL* out
        IntByReference pfGenerateOnClose   // BOOL* out
    );
}
@[Link("advapi32")]
lib LibADVAPI32
  fun AccessCheckByTypeAndAuditAlarmA = AccessCheckByTypeAndAuditAlarmA(
    SubsystemName : UInt8*,   # LPCSTR
    HandleId : Void*,   # void*
    ObjectTypeName : UInt8*,   # LPCSTR
    ObjectName : UInt8*,   # LPCSTR optional
    SecurityDescriptor : Void*,   # PSECURITY_DESCRIPTOR
    PrincipalSelfSid : Void*,   # PSID optional
    DesiredAccess : UInt32,   # DWORD
    AuditType : Int32,   # AUDIT_EVENT_TYPE
    Flags : UInt32,   # DWORD
    ObjectTypeList : OBJECT_TYPE_LIST*,   # OBJECT_TYPE_LIST* optional, in/out
    ObjectTypeListLength : UInt32,   # DWORD
    GenericMapping : GENERIC_MAPPING*,   # GENERIC_MAPPING*
    ObjectCreation : Int32,   # BOOL
    GrantedAccess : UInt32*,   # DWORD* out
    AccessStatus : Int32*,   # BOOL* out
    pfGenerateOnClose : 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 AccessCheckByTypeAndAuditAlarmANative = Int32 Function(Pointer<Utf8>, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Void>, Pointer<Void>, Uint32, Int32, Uint32, Pointer<Void>, Uint32, Pointer<Void>, Int32, Pointer<Uint32>, Pointer<Int32>, Pointer<Int32>);
typedef AccessCheckByTypeAndAuditAlarmADart = int Function(Pointer<Utf8>, Pointer<Void>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Void>, int, Pointer<Void>, int, Pointer<Uint32>, Pointer<Int32>, Pointer<Int32>);
final AccessCheckByTypeAndAuditAlarmA = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<AccessCheckByTypeAndAuditAlarmANative, AccessCheckByTypeAndAuditAlarmADart>('AccessCheckByTypeAndAuditAlarmA');
// SubsystemName : LPCSTR -> Pointer<Utf8>
// HandleId : void* -> Pointer<Void>
// ObjectTypeName : LPCSTR -> Pointer<Utf8>
// ObjectName : LPCSTR optional -> Pointer<Utf8>
// SecurityDescriptor : PSECURITY_DESCRIPTOR -> Pointer<Void>
// PrincipalSelfSid : PSID optional -> Pointer<Void>
// DesiredAccess : DWORD -> Uint32
// AuditType : AUDIT_EVENT_TYPE -> Int32
// Flags : DWORD -> Uint32
// ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> Pointer<Void>
// ObjectTypeListLength : DWORD -> Uint32
// GenericMapping : GENERIC_MAPPING* -> Pointer<Void>
// ObjectCreation : BOOL -> Int32
// GrantedAccess : DWORD* out -> Pointer<Uint32>
// AccessStatus : BOOL* out -> Pointer<Int32>
// pfGenerateOnClose : BOOL* out -> Pointer<Int32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function AccessCheckByTypeAndAuditAlarmA(
  SubsystemName: PAnsiChar;   // LPCSTR
  HandleId: Pointer;   // void*
  ObjectTypeName: PAnsiChar;   // LPCSTR
  ObjectName: PAnsiChar;   // LPCSTR optional
  SecurityDescriptor: THandle;   // PSECURITY_DESCRIPTOR
  PrincipalSelfSid: THandle;   // PSID optional
  DesiredAccess: DWORD;   // DWORD
  AuditType: Integer;   // AUDIT_EVENT_TYPE
  Flags: DWORD;   // DWORD
  ObjectTypeList: Pointer;   // OBJECT_TYPE_LIST* optional, in/out
  ObjectTypeListLength: DWORD;   // DWORD
  GenericMapping: Pointer;   // GENERIC_MAPPING*
  ObjectCreation: BOOL;   // BOOL
  GrantedAccess: Pointer;   // DWORD* out
  AccessStatus: Pointer;   // BOOL* out
  pfGenerateOnClose: Pointer   // BOOL* out
): BOOL; stdcall;
  external 'ADVAPI32.dll' name 'AccessCheckByTypeAndAuditAlarmA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "AccessCheckByTypeAndAuditAlarmA"
  c_AccessCheckByTypeAndAuditAlarmA :: CString -> Ptr () -> CString -> CString -> Ptr () -> Ptr () -> Word32 -> Int32 -> Word32 -> Ptr () -> Word32 -> Ptr () -> CInt -> Ptr Word32 -> Ptr CInt -> Ptr CInt -> IO CInt
-- SubsystemName : LPCSTR -> CString
-- HandleId : void* -> Ptr ()
-- ObjectTypeName : LPCSTR -> CString
-- ObjectName : LPCSTR optional -> CString
-- SecurityDescriptor : PSECURITY_DESCRIPTOR -> Ptr ()
-- PrincipalSelfSid : PSID optional -> Ptr ()
-- DesiredAccess : DWORD -> Word32
-- AuditType : AUDIT_EVENT_TYPE -> Int32
-- Flags : DWORD -> Word32
-- ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> Ptr ()
-- ObjectTypeListLength : DWORD -> Word32
-- GenericMapping : GENERIC_MAPPING* -> Ptr ()
-- ObjectCreation : BOOL -> CInt
-- GrantedAccess : DWORD* out -> Ptr Word32
-- AccessStatus : BOOL* out -> Ptr CInt
-- pfGenerateOnClose : BOOL* out -> Ptr CInt
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let accesscheckbytypeandauditalarma =
  foreign "AccessCheckByTypeAndAuditAlarmA"
    (string @-> (ptr void) @-> string @-> string @-> (ptr void) @-> (ptr void) @-> uint32_t @-> int32_t @-> uint32_t @-> (ptr void) @-> uint32_t @-> (ptr void) @-> int32_t @-> (ptr uint32_t) @-> (ptr int32_t) @-> (ptr int32_t) @-> returning int32_t)
(* SubsystemName : LPCSTR -> string *)
(* HandleId : void* -> (ptr void) *)
(* ObjectTypeName : LPCSTR -> string *)
(* ObjectName : LPCSTR optional -> string *)
(* SecurityDescriptor : PSECURITY_DESCRIPTOR -> (ptr void) *)
(* PrincipalSelfSid : PSID optional -> (ptr void) *)
(* DesiredAccess : DWORD -> uint32_t *)
(* AuditType : AUDIT_EVENT_TYPE -> int32_t *)
(* Flags : DWORD -> uint32_t *)
(* ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> (ptr void) *)
(* ObjectTypeListLength : DWORD -> uint32_t *)
(* GenericMapping : GENERIC_MAPPING* -> (ptr void) *)
(* ObjectCreation : BOOL -> int32_t *)
(* GrantedAccess : DWORD* out -> (ptr uint32_t) *)
(* AccessStatus : BOOL* out -> (ptr int32_t) *)
(* pfGenerateOnClose : BOOL* out -> (ptr int32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)

(cffi:defcfun ("AccessCheckByTypeAndAuditAlarmA" access-check-by-type-and-audit-alarm-a :convention :stdcall) :int32
  (subsystem-name :string)   ; LPCSTR
  (handle-id :pointer)   ; void*
  (object-type-name :string)   ; LPCSTR
  (object-name :string)   ; LPCSTR optional
  (security-descriptor :pointer)   ; PSECURITY_DESCRIPTOR
  (principal-self-sid :pointer)   ; PSID optional
  (desired-access :uint32)   ; DWORD
  (audit-type :int32)   ; AUDIT_EVENT_TYPE
  (flags :uint32)   ; DWORD
  (object-type-list :pointer)   ; OBJECT_TYPE_LIST* optional, in/out
  (object-type-list-length :uint32)   ; DWORD
  (generic-mapping :pointer)   ; GENERIC_MAPPING*
  (object-creation :int32)   ; BOOL
  (granted-access :pointer)   ; DWORD* out
  (access-status :pointer)   ; BOOL* out
  (pf-generate-on-close :pointer))   ; BOOL* out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $AccessCheckByTypeAndAuditAlarmA = Win32::API::More->new('ADVAPI32',
    'BOOL AccessCheckByTypeAndAuditAlarmA(LPCSTR SubsystemName, LPVOID HandleId, LPCSTR ObjectTypeName, LPCSTR ObjectName, HANDLE SecurityDescriptor, HANDLE PrincipalSelfSid, DWORD DesiredAccess, int AuditType, DWORD Flags, LPVOID ObjectTypeList, DWORD ObjectTypeListLength, LPVOID GenericMapping, BOOL ObjectCreation, LPVOID GrantedAccess, LPVOID AccessStatus, LPVOID pfGenerateOnClose)');
# my $ret = $AccessCheckByTypeAndAuditAlarmA->Call($SubsystemName, $HandleId, $ObjectTypeName, $ObjectName, $SecurityDescriptor, $PrincipalSelfSid, $DesiredAccess, $AuditType, $Flags, $ObjectTypeList, $ObjectTypeListLength, $GenericMapping, $ObjectCreation, $GrantedAccess, $AccessStatus, $pfGenerateOnClose);
# SubsystemName : LPCSTR -> LPCSTR
# HandleId : void* -> LPVOID
# ObjectTypeName : LPCSTR -> LPCSTR
# ObjectName : LPCSTR optional -> LPCSTR
# SecurityDescriptor : PSECURITY_DESCRIPTOR -> HANDLE
# PrincipalSelfSid : PSID optional -> HANDLE
# DesiredAccess : DWORD -> DWORD
# AuditType : AUDIT_EVENT_TYPE -> int
# Flags : DWORD -> DWORD
# ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> LPVOID
# ObjectTypeListLength : DWORD -> DWORD
# GenericMapping : GENERIC_MAPPING* -> LPVOID
# ObjectCreation : BOOL -> BOOL
# GrantedAccess : DWORD* out -> LPVOID
# AccessStatus : BOOL* out -> LPVOID
# pfGenerateOnClose : BOOL* out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型