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

AccessCheckByTypeAndAuditAlarmW

関数
タイプ別アクセス権検査を行い監査アラームを生成する。
DLLADVAPI32.dll文字セットUnicode (-W)呼出規約winapi

シグネチャ

// ADVAPI32.dll  (Unicode / -W)
#include <windows.h>

BOOL AccessCheckByTypeAndAuditAlarmW(
    LPCWSTR SubsystemName,
    void* HandleId,
    LPCWSTR ObjectTypeName,
    LPCWSTR 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
);

パラメーター

名前方向説明
SubsystemNameLPCWSTRin関数を呼び出すサブシステムの名前を指定する、null 終端文字列へのポインター。この文字列は、関数が生成するすべての監査メッセージに表示されます。
HandleIdvoid*inオブジェクトに対するクライアントのハンドルを表す一意の値へのポインター。アクセスが拒否された場合、システムはこの値を無視します。
ObjectTypeNameLPCWSTRin作成またはアクセスされるオブジェクトの種類を指定する、null 終端文字列へのポインター。この文字列は、関数が生成するすべての監査メッセージに表示されます。
ObjectNameLPCWSTRinoptional作成またはアクセスされるオブジェクトの名前を指定する、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 フラグが設定されている場合、特権が有効でないときは、関数は監査メッセージを生成せずにアクセスチェックを実行します。このパラメーターがゼロの場合、特権が有効でなければ関数は失敗します。
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 に設定されている場合、関数はアクセスマスクをゼロに設定します。関数が失敗した場合、アクセスマスクは設定されません。
AccessStatusBOOL*outアクセスチェックの結果を受け取る変数へのポインター。セキュリティ記述子が要求されたアクセス権をクライアントに許可する場合、AccessStatusTRUE に設定されます。それ以外の場合、AccessStatusFALSE に設定され、GetLastError を呼び出して拡張エラー情報を取得できます。
pfGenerateOnCloseBOOL*out関数が戻るときに監査生成ルーチンによって設定されるフラグへのポインター。オブジェクトハンドルが閉じられるときに、このフラグを ObjectCloseAuditAlarm 関数に渡します。

戻り値の型: BOOL

公式ドキュメント

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

戻り値

関数が成功すると、ゼロ以外の値を返します。

関数が失敗すると、ゼロを返します。拡張エラー情報を取得するには、GetLastError を呼び出します。

解説(Remarks)

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

PrincipalSelfSid パラメーターと ObjectTypeList パラメーターが NULL であり、AuditType パラメーターが AuditEventObjectAccess で、Flags パラメーターがゼロの場合、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 が含まれていない場合、AccessCheckByTypeAndAuditAlarmERROR_INVALID_SECURITY_DESCR で失敗します。

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

各言語での呼び出し定義

// ADVAPI32.dll  (Unicode / -W)
#include <windows.h>

BOOL AccessCheckByTypeAndAuditAlarmW(
    LPCWSTR SubsystemName,
    void* HandleId,
    LPCWSTR ObjectTypeName,
    LPCWSTR 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.Unicode, ExactSpelling = true)]
static extern bool AccessCheckByTypeAndAuditAlarmW(
    [MarshalAs(UnmanagedType.LPWStr)] string SubsystemName,   // LPCWSTR
    IntPtr HandleId,   // void*
    [MarshalAs(UnmanagedType.LPWStr)] string ObjectTypeName,   // LPCWSTR
    [MarshalAs(UnmanagedType.LPWStr)] string ObjectName,   // LPCWSTR 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.Unicode, ExactSpelling:=True)>
Public Shared Function AccessCheckByTypeAndAuditAlarmW(
    <MarshalAs(UnmanagedType.LPWStr)> SubsystemName As String,   ' LPCWSTR
    HandleId As IntPtr,   ' void*
    <MarshalAs(UnmanagedType.LPWStr)> ObjectTypeName As String,   ' LPCWSTR
    <MarshalAs(UnmanagedType.LPWStr)> ObjectName As String,   ' LPCWSTR 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 : LPCWSTR
' HandleId : void*
' ObjectTypeName : LPCWSTR
' ObjectName : LPCWSTR 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 AccessCheckByTypeAndAuditAlarmW Lib "advapi32" ( _
    ByVal SubsystemName As LongPtr, _
    ByVal HandleId As LongPtr, _
    ByVal ObjectTypeName As LongPtr, _
    ByVal ObjectName As LongPtr, _
    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
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

AccessCheckByTypeAndAuditAlarmW = ctypes.windll.advapi32.AccessCheckByTypeAndAuditAlarmW
AccessCheckByTypeAndAuditAlarmW.restype = wintypes.BOOL
AccessCheckByTypeAndAuditAlarmW.argtypes = [
    wintypes.LPCWSTR,  # SubsystemName : LPCWSTR
    ctypes.POINTER(None),  # HandleId : void*
    wintypes.LPCWSTR,  # ObjectTypeName : LPCWSTR
    wintypes.LPCWSTR,  # ObjectName : LPCWSTR 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
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
AccessCheckByTypeAndAuditAlarmW = Fiddle::Function.new(
  lib['AccessCheckByTypeAndAuditAlarmW'],
  [
    Fiddle::TYPE_VOIDP,  # SubsystemName : LPCWSTR
    Fiddle::TYPE_VOIDP,  # HandleId : void*
    Fiddle::TYPE_VOIDP,  # ObjectTypeName : LPCWSTR
    Fiddle::TYPE_VOIDP,  # ObjectName : LPCWSTR 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)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "advapi32")]
extern "system" {
    fn AccessCheckByTypeAndAuditAlarmW(
        SubsystemName: *const u16,  // LPCWSTR
        HandleId: *mut (),  // void*
        ObjectTypeName: *const u16,  // LPCWSTR
        ObjectName: *const u16,  // LPCWSTR 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.Unicode)]
public static extern bool AccessCheckByTypeAndAuditAlarmW([MarshalAs(UnmanagedType.LPWStr)] string SubsystemName, IntPtr HandleId, [MarshalAs(UnmanagedType.LPWStr)] string ObjectTypeName, [MarshalAs(UnmanagedType.LPWStr)] 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_AccessCheckByTypeAndAuditAlarmW' -Namespace Win32 -PassThru
# $api::AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
#uselib "ADVAPI32.dll"
#func global AccessCheckByTypeAndAuditAlarmW "AccessCheckByTypeAndAuditAlarmW" wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr, wptr
; AccessCheckByTypeAndAuditAlarmW SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, varptr(ObjectTypeList), ObjectTypeListLength, varptr(GenericMapping), ObjectCreation, varptr(GrantedAccess), varptr(AccessStatus), varptr(pfGenerateOnClose)   ; 戻り値は stat
; SubsystemName : LPCWSTR -> "wptr"
; HandleId : void* -> "wptr"
; ObjectTypeName : LPCWSTR -> "wptr"
; ObjectName : LPCWSTR optional -> "wptr"
; SecurityDescriptor : PSECURITY_DESCRIPTOR -> "wptr"
; PrincipalSelfSid : PSID optional -> "wptr"
; DesiredAccess : DWORD -> "wptr"
; AuditType : AUDIT_EVENT_TYPE -> "wptr"
; Flags : DWORD -> "wptr"
; ObjectTypeList : OBJECT_TYPE_LIST* optional, in/out -> "wptr"
; ObjectTypeListLength : DWORD -> "wptr"
; GenericMapping : GENERIC_MAPPING* -> "wptr"
; ObjectCreation : BOOL -> "wptr"
; GrantedAccess : DWORD* out -> "wptr"
; AccessStatus : BOOL* out -> "wptr"
; pfGenerateOnClose : BOOL* out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global AccessCheckByTypeAndAuditAlarmW "AccessCheckByTypeAndAuditAlarmW" wstr, sptr, wstr, wstr, sptr, sptr, int, int, int, var, int, var, int, var, var, var
; res = AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
; SubsystemName : LPCWSTR -> "wstr"
; HandleId : void* -> "sptr"
; ObjectTypeName : LPCWSTR -> "wstr"
; ObjectName : LPCWSTR optional -> "wstr"
; 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 AccessCheckByTypeAndAuditAlarmW(LPCWSTR SubsystemName, void* HandleId, LPCWSTR ObjectTypeName, LPCWSTR 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 AccessCheckByTypeAndAuditAlarmW "AccessCheckByTypeAndAuditAlarmW" wstr, intptr, wstr, wstr, intptr, intptr, int, int, int, var, int, var, int, var, var, var
; res = AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
; SubsystemName : LPCWSTR -> "wstr"
; HandleId : void* -> "intptr"
; ObjectTypeName : LPCWSTR -> "wstr"
; ObjectName : LPCWSTR optional -> "wstr"
; 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")
	procAccessCheckByTypeAndAuditAlarmW = advapi32.NewProc("AccessCheckByTypeAndAuditAlarmW")
)

// SubsystemName (LPCWSTR), HandleId (void*), ObjectTypeName (LPCWSTR), ObjectName (LPCWSTR 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 := procAccessCheckByTypeAndAuditAlarmW.Call(
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(SubsystemName))),
	uintptr(HandleId),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(ObjectTypeName))),
	uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(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 AccessCheckByTypeAndAuditAlarmW(
  SubsystemName: PWideChar;   // LPCWSTR
  HandleId: Pointer;   // void*
  ObjectTypeName: PWideChar;   // LPCWSTR
  ObjectName: PWideChar;   // LPCWSTR 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 'AccessCheckByTypeAndAuditAlarmW';
result := DllCall("ADVAPI32\AccessCheckByTypeAndAuditAlarmW"
    , "WStr", SubsystemName   ; LPCWSTR
    , "Ptr", HandleId   ; void*
    , "WStr", ObjectTypeName   ; LPCWSTR
    , "WStr", ObjectName   ; LPCWSTR 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
●AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose) = DLL("ADVAPI32.dll", "bool AccessCheckByTypeAndAuditAlarmW(char*, void*, char*, char*, void*, void*, dword, int, dword, void*, dword, void*, bool, void*, void*, void*)")
# 呼び出し: AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
# SubsystemName : LPCWSTR -> "char*"
# HandleId : void* -> "void*"
# ObjectTypeName : LPCWSTR -> "char*"
# ObjectName : LPCWSTR 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)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "advapi32" fn AccessCheckByTypeAndAuditAlarmW(
    SubsystemName: [*c]const u16, // LPCWSTR
    HandleId: ?*anyopaque, // void*
    ObjectTypeName: [*c]const u16, // LPCWSTR
    ObjectName: [*c]const u16, // LPCWSTR 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;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc AccessCheckByTypeAndAuditAlarmW(
    SubsystemName: WideCString,  # LPCWSTR
    HandleId: pointer,  # void*
    ObjectTypeName: WideCString,  # LPCWSTR
    ObjectName: WideCString,  # LPCWSTR 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: "AccessCheckByTypeAndAuditAlarmW", stdcall, dynlib: "ADVAPI32.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "advapi32");
extern(Windows)
int AccessCheckByTypeAndAuditAlarmW(
    const(wchar)* SubsystemName,   // LPCWSTR
    void* HandleId,   // void*
    const(wchar)* ObjectTypeName,   // LPCWSTR
    const(wchar)* ObjectName,   // LPCWSTR 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((:AccessCheckByTypeAndAuditAlarmW, "ADVAPI32.dll"), stdcall, Int32,
      (Cwstring, Ptr{Cvoid}, Cwstring, Cwstring, 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 : LPCWSTR -> Cwstring
# HandleId : void* -> Ptr{Cvoid}
# ObjectTypeName : LPCWSTR -> Cwstring
# ObjectName : LPCWSTR optional -> Cwstring
# 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 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t AccessCheckByTypeAndAuditAlarmW(
    const uint16_t* SubsystemName,
    void* HandleId,
    const uint16_t* ObjectTypeName,
    const uint16_t* 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.AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
-- SubsystemName : LPCWSTR
-- HandleId : void*
-- ObjectTypeName : LPCWSTR
-- ObjectName : LPCWSTR 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 に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const AccessCheckByTypeAndAuditAlarmW = lib.func('__stdcall', 'AccessCheckByTypeAndAuditAlarmW', 'int32_t', ['str16', 'void *', 'str16', 'str16', 'void *', 'void *', 'uint32_t', 'int32_t', 'uint32_t', 'void *', 'uint32_t', 'void *', 'int32_t', 'uint32_t *', 'int32_t *', 'int32_t *']);
// AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
// SubsystemName : LPCWSTR -> 'str16'
// HandleId : void* -> 'void *'
// ObjectTypeName : LPCWSTR -> 'str16'
// ObjectName : LPCWSTR optional -> 'str16'
// 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", {
  AccessCheckByTypeAndAuditAlarmW: { parameters: ["buffer", "pointer", "buffer", "buffer", "pointer", "pointer", "u32", "i32", "u32", "pointer", "u32", "pointer", "i32", "pointer", "pointer", "pointer"], result: "i32" },
});
// lib.symbols.AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose)
// SubsystemName : LPCWSTR -> "buffer"
// HandleId : void* -> "pointer"
// ObjectTypeName : LPCWSTR -> "buffer"
// ObjectName : LPCWSTR 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"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t AccessCheckByTypeAndAuditAlarmW(
    const uint16_t* SubsystemName,
    void* HandleId,
    const uint16_t* ObjectTypeName,
    const uint16_t* 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->AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, ObjectTypeList, ObjectTypeListLength, GenericMapping, ObjectCreation, GrantedAccess, AccessStatus, pfGenerateOnClose);
// SubsystemName : LPCWSTR
// HandleId : void*
// ObjectTypeName : LPCWSTR
// ObjectName : LPCWSTR 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.UNICODE_OPTIONS);
    boolean AccessCheckByTypeAndAuditAlarmW(
        WString SubsystemName,   // LPCWSTR
        Pointer HandleId,   // void*
        WString ObjectTypeName,   // LPCWSTR
        WString ObjectName,   // LPCWSTR 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
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("advapi32")]
lib LibADVAPI32
  fun AccessCheckByTypeAndAuditAlarmW = AccessCheckByTypeAndAuditAlarmW(
    SubsystemName : UInt16*,   # LPCWSTR
    HandleId : Void*,   # void*
    ObjectTypeName : UInt16*,   # LPCWSTR
    ObjectName : UInt16*,   # LPCWSTR 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 AccessCheckByTypeAndAuditAlarmWNative = Int32 Function(Pointer<Utf16>, Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>, Uint32, Int32, Uint32, Pointer<Void>, Uint32, Pointer<Void>, Int32, Pointer<Uint32>, Pointer<Int32>, Pointer<Int32>);
typedef AccessCheckByTypeAndAuditAlarmWDart = int Function(Pointer<Utf16>, Pointer<Void>, Pointer<Utf16>, Pointer<Utf16>, Pointer<Void>, Pointer<Void>, int, int, int, Pointer<Void>, int, Pointer<Void>, int, Pointer<Uint32>, Pointer<Int32>, Pointer<Int32>);
final AccessCheckByTypeAndAuditAlarmW = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<AccessCheckByTypeAndAuditAlarmWNative, AccessCheckByTypeAndAuditAlarmWDart>('AccessCheckByTypeAndAuditAlarmW');
// SubsystemName : LPCWSTR -> Pointer<Utf16>
// HandleId : void* -> Pointer<Void>
// ObjectTypeName : LPCWSTR -> Pointer<Utf16>
// ObjectName : LPCWSTR optional -> Pointer<Utf16>
// 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 AccessCheckByTypeAndAuditAlarmW(
  SubsystemName: PWideChar;   // LPCWSTR
  HandleId: Pointer;   // void*
  ObjectTypeName: PWideChar;   // LPCWSTR
  ObjectName: PWideChar;   // LPCWSTR 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 'AccessCheckByTypeAndAuditAlarmW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "AccessCheckByTypeAndAuditAlarmW"
  c_AccessCheckByTypeAndAuditAlarmW :: CWString -> Ptr () -> CWString -> CWString -> Ptr () -> Ptr () -> Word32 -> Int32 -> Word32 -> Ptr () -> Word32 -> Ptr () -> CInt -> Ptr Word32 -> Ptr CInt -> Ptr CInt -> IO CInt
-- SubsystemName : LPCWSTR -> CWString
-- HandleId : void* -> Ptr ()
-- ObjectTypeName : LPCWSTR -> CWString
-- ObjectName : LPCWSTR optional -> CWString
-- 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 accesscheckbytypeandauditalarmw =
  foreign "AccessCheckByTypeAndAuditAlarmW"
    ((ptr uint16_t) @-> (ptr void) @-> (ptr uint16_t) @-> (ptr uint16_t) @-> (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 : LPCWSTR -> (ptr uint16_t) *)
(* HandleId : void* -> (ptr void) *)
(* ObjectTypeName : LPCWSTR -> (ptr uint16_t) *)
(* ObjectName : LPCWSTR optional -> (ptr uint16_t) *)
(* 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 ("AccessCheckByTypeAndAuditAlarmW" access-check-by-type-and-audit-alarm-w :convention :stdcall) :int32
  (subsystem-name (:string :encoding :utf-16le))   ; LPCWSTR
  (handle-id :pointer)   ; void*
  (object-type-name (:string :encoding :utf-16le))   ; LPCWSTR
  (object-name (:string :encoding :utf-16le))   ; LPCWSTR 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 $AccessCheckByTypeAndAuditAlarmW = Win32::API::More->new('ADVAPI32',
    'BOOL AccessCheckByTypeAndAuditAlarmW(LPCWSTR SubsystemName, LPVOID HandleId, LPCWSTR ObjectTypeName, LPCWSTR 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 = $AccessCheckByTypeAndAuditAlarmW->Call($SubsystemName, $HandleId, $ObjectTypeName, $ObjectName, $SecurityDescriptor, $PrincipalSelfSid, $DesiredAccess, $AuditType, $Flags, $ObjectTypeList, $ObjectTypeListLength, $GenericMapping, $ObjectCreation, $GrantedAccess, $AccessStatus, $pfGenerateOnClose);
# SubsystemName : LPCWSTR -> LPCWSTR
# HandleId : void* -> LPVOID
# ObjectTypeName : LPCWSTR -> LPCWSTR
# ObjectName : LPCWSTR optional -> LPCWSTR
# 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 を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

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