ObpAssignSecurity
NTSTATUS __stdcall ObpAssignSecurity(
_SECURITY_SUBJECT_CONTEXT *AccessState,
VOID *ParentDescriptor,
VOID *Object,
POBJECT_TYPE ObjectType,
UINT64 AdditionalAutoInheritFlags,
UINT8 UseTokenDefaultDaclForBaseDescriptor){
void *ClientToken;
NTSTATUS result;
int v13;
VOID *v14;
int v15;
UINT64 v16;
int GenericMapping;
POOL_TYPE v18;
PVOID P;
_SECURITY_OBJECT_AI_PARAMS AutoInheritParams;
VOID *NewDescriptor[2];
UINT64 AutoInheritFlags;
AutoInheritParams = 0i64;
LODWORD(AutoInheritFlags) = 0;
NewDescriptor[0] = 0i64;
P = 0i64;
ClientToken = AccessState[2].ClientToken;
AutoInheritParams.Size = 8;
result = SeComputeAutoInheritByObjectTypeEx(
ObjectType,
ClientToken,
ParentDescriptor,
&AutoInheritFlags,
&AutoInheritParams);
if( result >= 0 )
{
v13 = AdditionalAutoInheritFlags | AutoInheritFlags;
if( !UseTokenDefaultDaclForBaseDescriptor
|| (LODWORD(v16) = 0,
result = SeAssignSecurityEx2(
0i64,
AccessState[2].ClientToken,
&P,
0i64,
ObjectType == DmaAdapter,
v16,
0i64,
AccessState + 1,
&ObjectType->TypeInfo.GenericMapping,
v18),
result >= 0) )
{
v14 = P;
if( !P )
v14 = AccessState[2].ClientToken;
LODWORD(v16) = v13;
v15 = SeAssignSecurityEx2(
ParentDescriptor,
v14,
NewDescriptor,
0i64,
ObjectType == DmaAdapter,
v16,
&AutoInheritParams,
AccessState + 1,
&ObjectType->TypeInfo.GenericMapping,
v18);
if( v15 < 0 )
{
if( P )
ExFreePoolWithTag(P, 0);
}
else
{
if( P )
ExFreePoolWithTag(P, 0);
LOBYTE(GenericMapping) = KeGetCurrentThread()->PreviousMode;
v15 = ObjectType->TypeInfo.SecurityProcedure(
Object,
AssignSecurityDescriptor,
0i64,
NewDescriptor[0],
0i64,
0i64,
PagedPool,
&ObjectType->TypeInfo.GenericMapping,
GenericMapping);
if( v15 < 0 )
SeDeassignSecurity(NewDescriptor);
}
return v15;
}
}
return result;
}Referenced by:
ObAssignSecurity
ObpInsertOrLocateNamedObject