ObpAuditObjectAccess
CHAR __fastcall ObpAuditObjectAccess(INT64 a1, VOID *a2, volatile INT64 *a3, UINT8 *a4, INT64 a5){
_HANDLE_TABLE_ENTRY_INFO *HandleExtraInfo;
_ETHREAD *CurrentThread;
CHAR v11;
unsigned int AuditMask;
int v13;
__int64 v14;
UINT8 *v15;
unsigned __int64 v16;
signed __int32 v18[8];
VOID *SecurityDescriptor;
__int64 v20;
if( !*(_DWORD *)(a1 + 4) )
return 1;
HandleExtraInfo = ExpGetHandleExtraInfo((_HANDLE_TABLE *)a1, a2);
if( !HandleExtraInfo )
return 1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
if( ExLockHandleTableEntry(a1, (signed __int64 *)a3) )
{
_m_prefetchw(HandleExtraInfo);
AuditMask = HandleExtraInfo->AuditMask;
if( a4 == (UINT8 *)((*(__int64 *)a3 >> 16) & 0xFFFFFFFFFFFFFFF0ui64) )
{
v13 = a5 & AuditMask;
if( ((unsigned int)a5 & AuditMask) != 0 )
{
v14 = 0i64;
HandleExtraInfo->AuditMask = AuditMask & ~(_DWORD)a5;
if( (a4[26] & 0x20) != 0 )
v15 = &a4[-*((unsigned __int8 *)ObpInfoMaskToOffset + (a4[26] & 0x3F))];
else
v15 = 0i64;
if( v15 )
v14 = *(_QWORD *)v15;
v20 = v14;
v16 = a4[24] ^ (unsigned __int64)BYTE1(a4);
LODWORD(SecurityDescriptor) = v13;
SeOperationAuditAlarm(
v15,
a4 + 48,
(UNICODE_STRING *)a2,
ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v16] + 16,
SecurityDescriptor);
}
v11 = 1;
}
else
{
v11 = 0;
}
_InterlockedExchangeAdd64(a3, 1ui64);
_InterlockedOr(v18, 0);
if( *(_QWORD *)(a1 + 48) )
ExfUnblockPushLock((_EX_PUSH_LOCK *)(a1 + 48), 0i64);
}
else
{
v11 = 0;
}
KeLeaveCriticalRegionThread((__int64)CurrentThread);
return v11;
}Referenced by:
ObReferenceFileObjectForWrite
ObpReferenceObjectByHandleWithTag