ObpAssignSecurity
NTSTATUS __stdcall ObpAssignSecurity(
_ACCESS_STATE *AccessState,
PVOID ParentDescriptor,
PVOID Object,
_OBJECT_TYPE *ObjectType,
UINT64 AdditionalAutoInheritFlags,
UINT8 UseTokenDefaultDaclForBaseDescriptor){
void *v10;
NTSTATUS result;
int v13;
PVOID v14;
int v15;
BOOL IsDirectoryObject;
UINT64 v17;
int GenericMapping;
PVOID P;
_SECURITY_OBJECT_AI_PARAMS AutoInheritParams;
PSECURITY_DESCRIPTOR SecurityDescriptor[2];
UINT64 AutoInheritFlags;
AutoInheritParams = 0i64;
LODWORD(AutoInheritFlags) = 0;
SecurityDescriptor[0] = 0i64;
P = 0i64;
v10 = (void *)*((_QWORD *)AccessState + 8);
AutoInheritParams.Size = 8;
result = SeComputeAutoInheritByObjectTypeEx(ObjectType, v10, ParentDescriptor, &AutoInheritFlags, &AutoInheritParams);
if( result >= 0 )
{
v13 = AdditionalAutoInheritFlags | AutoInheritFlags;
if( !UseTokenDefaultDaclForBaseDescriptor
|| (LODWORD(v17) = 0,
LOBYTE(IsDirectoryObject) = ObjectType == ObpDirectoryObjectType,
result = SeAssignSecurityEx2(
0i64,
*((PVOID *)AccessState + 8),
&P,
0i64,
IsDirectoryObject,
v17,
0i64,
(SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
&ObjectType->TypeInfo.GenericMapping),
result >= 0) )
{
v14 = P;
if( !P )
v14 = (PVOID)*((_QWORD *)AccessState + 8);
LODWORD(v17) = v13;
LOBYTE(IsDirectoryObject) = ObjectType == ObpDirectoryObjectType;
v15 = SeAssignSecurityEx2(
ParentDescriptor,
v14,
SecurityDescriptor,
0i64,
IsDirectoryObject,
v17,
&AutoInheritParams,
(SECURITY_SUBJECT_CONTEXT *)AccessState + 1,
&ObjectType->TypeInfo.GenericMapping);
if( v15 < 0 )
{
if( P )
ExFreePoolWithTag(P, 0);
}
else
{
if( P )
ExFreePoolWithTag(P, 0);
LOBYTE(GenericMapping) = *((_BYTE *)KeGetCurrentThread() + 562);
v15 = ObjectType->TypeInfo.SecurityProcedure(
Object,
AssignSecurityDescriptor,
0i64,
SecurityDescriptor[0],
0i64,
0i64,
PagedPool,
&ObjectType->TypeInfo.GenericMapping,
GenericMapping);
if( v15 < 0 )
SeDeassignSecurity(SecurityDescriptor);
}
return v15;
}
}
return result;
}Referenced by:
ObAssignSecurity
ObpInsertOrLocateNamedObject