ObpAuditObjectAccess
UINT8 __stdcall ObpAuditObjectAccess(
_HANDLE_TABLE *HandleTable,
VOID *Handle,
_HANDLE_TABLE_ENTRY *HandleTableEntry,
_OBJECT_HEADER *ObjectHeader,
UINT64 DesiredAccess){
_HANDLE_TABLE_ENTRY_INFO *HandleExtraInfo;
_ETHREAD *CurrentThread;
UINT8 v11;
unsigned int v12;
int v13;
VOID *v14;
_UNICODE_STRING *v15;
unsigned __int64 v16;
int v18[8];
UINT64 AuditMask;
VOID *v20;
VOID *SecurityDescriptor;
if( !HandleTable->ExtraInfoPages )
return 1;
HandleExtraInfo = ExpGetHandleExtraInfo(HandleTable, Handle);
if( !HandleExtraInfo )
return 1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
if( ExLockHandleTableEntry(HandleTable, HandleTableEntry) )
{
_m_prefetchw(HandleExtraInfo);
v12 = HandleExtraInfo->AuditMask;
if( ObjectHeader == (_OBJECT_HEADER *)((HandleTableEntry->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64) )
{
v13 = DesiredAccess & v12;
if( ((unsigned int)DesiredAccess & v12) != 0 )
{
v14 = 0i64;
HandleExtraInfo->AuditMask = v12 & ~(_DWORD)DesiredAccess;
if( (ObjectHeader->InfoMask & 0x20) != 0 )
v15 = (_UNICODE_STRING *)((char *)ObjectHeader
- *((unsigned __int8 *)&dword_140C25D60 + (ObjectHeader->InfoMask & 0x3F)));
else
v15 = 0i64;
if( v15 )
v14 = *(VOID **)&v15->Length;
SecurityDescriptor = v14;
v16 = ObjectHeader->TypeIndex ^ (unsigned __int64)BYTE1(ObjectHeader);
LODWORD(AuditMask) = v13;
SeOperationAuditAlarm(
v15,
&ObjectHeader->Body,
Handle,
(_UNICODE_STRING *)(ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v16] + 16),
AuditMask,
v20,
v14);
}
v11 = 1;
}
else
{
v11 = 0;
}
_InterlockedExchangeAdd64(&HandleTableEntry->VolatileLowValue, 1ui64);
_InterlockedOr(v18, 0);
if( HandleTable->HandleContentionEvent._bf_0 )
ExfUnblockPushLock(&HandleTable->HandleContentionEvent._bf_0, 0i64);
}
else
{
v11 = 0;
}
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
return v11;
}Referenced by:
ObReferenceFileObjectForWrite
ObpReferenceObjectByHandleWithTag