ObpCheckObjectReference
UINT8 __stdcall ObpCheckObjectReference(VOID *Object, _ACCESS_STATE *AccessState, CHAR AccessMode, INT64 *AccessStatus){
CHAR v5;
unsigned __int64 v6;
__int64 v8;
int ObjectSecurity;
_GENERIC_MAPPING *GenericMapping;
VOID *v11;
_LUID *v12;
UINT8 v13;
unsigned int v14;
UINT64 PreviouslyGrantedAccess;
_PRIVILEGE_SET *Privileges;
_KPROCESSOR_MODE AccessModea;
PSECURITY_DESCRIPTOR SecurityDescriptor;
PPRIVILEGE_SET v20;
unsigned int GrantedAccess;
UINT8 MemoryAllocated;
PNTSTATUS v23;
MemoryAllocated = AccessMode;
GrantedAccess = 0;
v20 = 0i64;
SecurityDescriptor = 0i64;
v5 = (char)AccessStatus;
v6 = (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8);
MemoryAllocated = 0;
v8 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v6];
ObjectSecurity = ObpGetObjectSecurity(Object, &SecurityDescriptor, &MemoryAllocated, (INT8)AccessStatus);
if( ObjectSecurity < 0 )
{
*v23 = ObjectSecurity;
return 0;
}
else
{
SeLockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
GenericMapping = (_GENERIC_MAPPING *)(v8 + 76);
v11 = SecurityDescriptor;
LOBYTE(AccessModea) = v5;
v13 = (unsigned __int8)SeAccessCheck(
SecurityDescriptor,
(PSECURITY_SUBJECT_CONTEXT)AccessState + 1,
1u,
*((_DWORD *)AccessState + 4),
*((_DWORD *)AccessState + 5),
&v20,
GenericMapping,
AccessModea,
&GrantedAccess,
v23);
if( v13 )
{
v14 = GrantedAccess;
*((_DWORD *)AccessState + 5) |= GrantedAccess;
v12 = (_LUID *)~v14;
*((_DWORD *)AccessState + 4) &= (unsigned int)v12;
}
if( v11 )
{
LODWORD(PreviouslyGrantedAccess) = *((_DWORD *)AccessState + 4) | *((_DWORD *)AccessState + 5);
SeObjectReferenceAuditAlarm(
v12,
Object,
v11,
(_SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
PreviouslyGrantedAccess,
Privileges,
v13,
v5);
}
SeUnlockSubjectContext((PSECURITY_SUBJECT_CONTEXT)AccessState + 1);
ObReleaseObjectSecurity(v11, MemoryAllocated);
return v13;
}
}Referenced by:
ObReferenceObjectByName
ObReferenceObjectByNameEx