AccessCheckByTypeAndAuditAlarmW
関数シグネチャ
// 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
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| SubsystemName | LPCWSTR | in | 関数を呼び出すサブシステムの名前を指定する、null 終端文字列へのポインター。この文字列は、関数が生成するすべての監査メッセージに表示されます。 |
| HandleId | void* | in | オブジェクトに対するクライアントのハンドルを表す一意の値へのポインター。アクセスが拒否された場合、システムはこの値を無視します。 |
| ObjectTypeName | LPCWSTR | in | 作成またはアクセスされるオブジェクトの種類を指定する、null 終端文字列へのポインター。この文字列は、関数が生成するすべての監査メッセージに表示されます。 |
| ObjectName | LPCWSTR | 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 フラグが設定されている場合、特権が有効でないときは、関数は監査メッセージを生成せずにアクセスチェックを実行します。このパラメーターがゼロの場合、特権が有効でなければ関数は失敗します。 |
| 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 に設定されている場合、関数はアクセスマスクをゼロに設定します。関数が失敗した場合、アクセスマスクは設定されません。 |
| AccessStatus | BOOL* | out | アクセスチェックの結果を受け取る変数へのポインター。セキュリティ記述子が要求されたアクセス権をクライアントに許可する場合、AccessStatus は TRUE に設定されます。それ以外の場合、AccessStatus は FALSE に設定され、GetLastError を呼び出して拡張エラー情報を取得できます。 |
| pfGenerateOnClose | BOOL* | out | 関数が戻るときに監査生成ルーチンによって設定されるフラグへのポインター。オブジェクトハンドルが閉じられるときに、このフラグを ObjectCloseAuditAlarm 関数に渡します。 |
戻り値の型: BOOL
公式ドキュメント
セキュリティ記述子が、呼び出し元スレッドが偽装しているクライアントに対して、指定された一連のアクセス権を付与するかどうかを判定します。(AccessCheckByTypeAndAuditAlarmW)
戻り値
関数が成功すると、ゼロ以外の値を返します。
関数が失敗すると、ゼロを返します。拡張エラー情報を取得するには、GetLastError を呼び出します。
解説(Remarks)
詳細については、How AccessCheck Works の概要を参照してください。
PrincipalSelfSid パラメーターと ObjectTypeList パラメーターが NULL であり、AuditType パラメーターが AuditEventObjectAccess で、Flags パラメーターがゼロの場合、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 が含まれていない場合、AccessCheckByTypeAndAuditAlarm は ERROR_INVALID_SECURITY_DESCR で失敗します。
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 方式にも切替可。#uselib "ADVAPI32.dll" #cfunc global AccessCheckByTypeAndAuditAlarmW "AccessCheckByTypeAndAuditAlarmW" wstr, sptr, wstr, wstr, sptr, sptr, int, int, int, sptr, int, sptr, int, sptr, sptr, sptr ; res = AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, varptr(ObjectTypeList), ObjectTypeListLength, varptr(GenericMapping), ObjectCreation, varptr(GrantedAccess), varptr(AccessStatus), varptr(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 -> "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 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 方式にも切替可。; 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, intptr, int, intptr, int, intptr, intptr, intptr ; res = AccessCheckByTypeAndAuditAlarmW(SubsystemName, HandleId, ObjectTypeName, ObjectName, SecurityDescriptor, PrincipalSelfSid, DesiredAccess, AuditType, Flags, varptr(ObjectTypeList), ObjectTypeListLength, varptr(GenericMapping), ObjectCreation, varptr(GrantedAccess), varptr(AccessStatus), varptr(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 -> "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")
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 // BOOLfunction 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 変換を行う。関連項目
- f AccessCheckByTypeAndAuditAlarmA (ANSI版) — オブジェクト種別単位でアクセス権を検査し監査する(ANSI版)。
- f AccessCheck — セキュリティ記述子に対しトークンのアクセス権を検査する。
- f AccessCheckAndAuditAlarmW — アクセス権を検査し必要に応じて監査アラームを生成する。
- f AccessCheckByType — オブジェクトタイプ別にトークンのアクセス権を検査する。
- f AccessCheckByTypeResultList — オブジェクトタイプ一覧ごとにアクセス権を検査し結果リストを返す。
- f AccessCheckByTypeResultListAndAuditAlarmW — タイプ別アクセス権を検査し結果リストと監査アラームを生成する。
- f MakeAbsoluteSD — 自己相対形式のセキュリティ記述子を絶対形式に変換する。
- f MapGenericMask — 汎用アクセスマスクを特定アクセス権にマッピングする。
- f ObjectCloseAuditAlarmW — オブジェクトハンドルクローズ時の監査アラームを生成する。
- s PRIVILEGE_SET
- s SECURITY_DESCRIPTOR