ObpCheckObjectReference
UINT8 __stdcall ObpCheckObjectReference(
PVOID Object,
_ACCESS_STATE *AccessState,
UINT8 TypeMutexLocked,
CHAR AccessMode,
INT64 *AccessStatus){
unsigned __int64 v7;
__int64 v9;
NTSTATUS ObjectSecurity;
GENERIC_MAPPING *GenericMapping;
VOID *v12;
_LUID *v13;
UINT8 v14;
int v15;
UINT64 PreviouslyGrantedAccess;
UINT64 PreviouslyGrantedAccessa;
_PRIVILEGE_SET *Privileges;
PSECURITY_DESCRIPTOR SecurityDescriptor;
PPRIVILEGE_SET v21;
UINT64 GrantedAccess;
BOOLEAN MemoryAllocated;
MemoryAllocated = TypeMutexLocked;
LODWORD(GrantedAccess) = 0;
v21 = 0i64;
SecurityDescriptor = 0i64;
v7 = (unsigned __int8)*((char *)Object - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)Object - 48) >> 8);
MemoryAllocated = 0;
v9 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ v7];
ObjectSecurity = ObpGetObjectSecurity(Object, &SecurityDescriptor, &MemoryAllocated, AccessMode);
if( ObjectSecurity < 0 )
{
*(_DWORD *)AccessStatus = ObjectSecurity;
return 0;
}
else
{
SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
GenericMapping = (GENERIC_MAPPING *)(v9 + 76);
v12 = SecurityDescriptor;
LODWORD(PreviouslyGrantedAccess) = *((_DWORD *)AccessState + 5);
v14 = SeAccessCheck(
SecurityDescriptor,
(SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
1u,
*((unsigned int *)AccessState + 4),
PreviouslyGrantedAccess,
&v21,
GenericMapping,
AccessMode,
&GrantedAccess,
AccessStatus);
if( v14 )
{
v15 = GrantedAccess;
*((_DWORD *)AccessState + 5) |= GrantedAccess;
v13 = (_LUID *)(unsigned int)~v15;
*((_DWORD *)AccessState + 4) &= (unsigned int)v13;
}
if( v12 )
{
LODWORD(PreviouslyGrantedAccessa) = *((_DWORD *)AccessState + 4) | *((_DWORD *)AccessState + 5);
SeObjectReferenceAuditAlarm(
v13,
Object,
v12,
(_SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
PreviouslyGrantedAccessa,
Privileges,
v14,
AccessMode);
}
SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)AccessState + 1);
ObReleaseObjectSecurity(v12, MemoryAllocated);
return v14;
}
}Referenced by:
ObReferenceObjectByName
ObReferenceObjectByNameEx