AccessCheckByTypeAndAuditAlarmA
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| SubsystemName | LPCSTR | in | この関数を呼び出すサブシステムの名前を指定する、null で終わる文字列へのポインターです。この文字列は、関数が生成する監査メッセージに表示されます。 |
| HandleId | void* | in | オブジェクトへのクライアントのハンドルを表す一意の値へのポインターです。アクセスが拒否された場合、システムはこの値を無視します。 |
| ObjectTypeName | LPCSTR | in | 作成またはアクセスされるオブジェクトの種類を指定する、null で終わる文字列へのポインターです。この文字列は、関数が生成する監査メッセージに表示されます。 |
| ObjectName | LPCSTR | inoptional | 作成またはアクセスされるオブジェクトの名前を指定する、null で終わる文字列へのポインターです。この文字列は、関数が生成する監査メッセージに表示されます。 |
| SecurityDescriptor | PSECURITY_DESCRIPTOR | in | アクセスを照合する対象となる SECURITY_DESCRIPTOR 構造体へのポインターです。 |
| PrincipalSelfSid | PSID | inoptional | セキュリティ識別子 (SID) へのポインターです。セキュリティ記述子がプリンシパルを表すオブジェクト (たとえばユーザー オブジェクト) に関連付けられている場合、PrincipalSelfSid パラメーターにはそのオブジェクトの SID を指定する必要があります。アクセスの評価時には、この SID は、よく知られた PRINCIPAL_SELF SID (S-1-5-10) を含む任意の ACE 内の SID を論理的に置き換えます。よく知られた SID については、Well-known SIDs を参照してください。 保護対象のオブジェクトがプリンシパルを表さない場合は、このパラメーターを NULL に設定します。 |
| DesiredAccess | DWORD | in | チェックするアクセス権を指定する アクセス マスク です。このマスクは、 MapGenericMask 関数によってマッピングされ、汎用アクセス権を含まないようにしておく必要があります。 このパラメーターが MAXIMUM_ALLOWED の場合、関数は、セキュリティ記述子がクライアントに許可する最大のアクセス権を示すように GrantedAccess アクセス マスクを設定します。 |
| AuditType | AUDIT_EVENT_TYPE | in | 生成する監査の種類です。これは、 AUDIT_EVENT_TYPE 列挙型の値のいずれかを指定できます。 |
| Flags | DWORD | in | 呼び出し元のプロセスに SE_AUDIT_NAME 特権が有効になっていない場合の、この関数の動作を制御するフラグです。AUDIT_ALLOW_NO_PRIVILEGE フラグが設定されている場合、特権が有効でなくても、関数は監査メッセージを生成せずにアクセス チェックを実行します。このパラメーターが 0 の場合、特権が有効でなければ関数は失敗します。 |
| ObjectTypeList | OBJECT_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 は失敗し、 GetLastError は ERROR_INVALID_PARAMETER を返します。 |
| ObjectTypeListLength | DWORD | in | ObjectTypeList 配列の要素数です。 |
| GenericMapping | GENERIC_MAPPING* | in | アクセスをチェックする対象のオブジェクトに関連付けられた GENERIC_MAPPING 構造体へのポインターです。 |
| ObjectCreation | BOOL | in | アクセスが許可されたときに、呼び出し元のアプリケーションが新しいオブジェクトを作成するかどうかを決定するフラグです。値が TRUE の場合、アプリケーションは新しいオブジェクトを作成します。値が FALSE の場合、アプリケーションは既存のオブジェクトを開きます。 |
| GrantedAccess | DWORD* | out | 許可されたアクセス権を受け取るアクセス マスクへのポインターです。AccessStatus が FALSE に設定されている場合、関数はアクセス マスクを 0 に設定します。関数が失敗した場合、アクセス マスクは設定されません。 |
| AccessStatus | BOOL* | out | アクセス チェックの結果を受け取る変数へのポインターです。セキュリティ記述子がクライアントに要求されたアクセス権を許可する場合、AccessStatus は TRUE に設定されます。それ以外の場合、AccessStatus は FALSE に設定され、 GetLastError を呼び出して詳細なエラー情報を取得できます。 |
| pfGenerateOnClose | BOOL* | out | 関数が戻るときに監査生成ルーチンによって設定されるフラグへのポインターです。オブジェクト ハンドルを閉じるときに、このフラグを ObjectCloseAuditAlarm 関数に渡します。 |
戻り値の型: BOOL
公式ドキュメント
セキュリティ記述子が、呼び出し元スレッドが偽装しているクライアントに対して、指定された一連のアクセス権を許可するかどうかを判定します。(AccessCheckByTypeAndAuditAlarmA)
戻り値
関数が成功した場合、関数は 0 以外の値を返します。
関数が失敗した場合は 0 を返します。詳細なエラー情報を取得するには、 GetLastError を呼び出します。
解説(Remarks)
詳細については、How AccessCheck Works の概要を参照してください。
PrincipalSelfSid パラメーターと ObjectTypeList パラメーターが NULL で、AuditType パラメーターが AuditEventObjectAccess で、Flags パラメーターが 0 の場合、AccessCheckByTypeAndAuditAlarm は AccessCheckAndAuditAlarm 関数と同じように動作します。
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 が含まれていない場合、AccessCheckByTypeAndAuditAlarm は ERROR_INVALID_SECURITY_DESCR で失敗します。
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 方式にも切替可。#uselib "ADVAPI32.dll" #cfunc global AccessCheckByTypeAndAuditAlarmA "AccessCheckByTypeAndAuditAlarmA" str, sptr, str, str, sptr, sptr, int, int, int, sptr, int, sptr, int, sptr, sptr, sptr ; res = AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, varptr(ObjectTypeList), ObjectTypeListLength, varptr(GenericMapping), ObjectCreation, varptr(GrantedAccess), varptr(AccessStatus), varptr(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 -> "sptr" ; ObjectTypeListLength : DWORD -> "int" ; GenericMapping : GENERIC_MAPPING* -> "sptr" ; ObjectCreation : BOOL -> "int" ; GrantedAccess : DWORD* out -> "sptr" ; AccessStatus : BOOL* out -> "sptr" ; pfGenerateOnClose : BOOL* out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; 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, intptr, int, intptr, int, intptr, intptr, intptr ; res = AccessCheckByTypeAndAuditAlarmA(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, varptr(ObjectTypeList), ObjectTypeListLength, varptr(GenericMapping), ObjectCreation, varptr(GrantedAccess), varptr(AccessStatus), varptr(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 -> "intptr" ; ObjectTypeListLength : DWORD -> "int" ; GenericMapping : GENERIC_MAPPING* -> "intptr" ; ObjectCreation : BOOL -> "int" ; GrantedAccess : DWORD* out -> "intptr" ; AccessStatus : BOOL* out -> "intptr" ; pfGenerateOnClose : BOOL* out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // BOOLfunction 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 を使用。関連項目
- f AccessCheckByTypeAndAuditAlarmW (Unicode版) — タイプ別アクセス権検査を行い監査アラームを生成する。
- f AccessCheck — セキュリティ記述子に対しトークンのアクセス権を検査する。
- f AccessCheckAndAuditAlarmA — アクセス権を検査し監査アラームを生成する(ANSI版)。
- f AccessCheckByType — オブジェクトタイプ別にトークンのアクセス権を検査する。
- f AccessCheckByTypeResultList — オブジェクトタイプ一覧ごとにアクセス権を検査し結果リストを返す。
- f AccessCheckByTypeResultListAndAuditAlarmA — 種別ごとの結果一覧でアクセス検査と監査を行う(ANSI版)。
- f MakeAbsoluteSD — 自己相対形式のセキュリティ記述子を絶対形式に変換する。
- f MapGenericMask — 汎用アクセスマスクを特定アクセス権にマッピングする。
- f ObjectCloseAuditAlarmA — オブジェクトを閉じる際に監査アラームを生成する(ANSI版)。
- s PRIVILEGE_SET
- s SECURITY_DESCRIPTOR