SepSetTokenCapabilities
INT64 __fastcall SepSetTokenCapabilities(
_TOKEN *Token,
VOID *PackageSid,
_SID_AND_ATTRIBUTES *InputCapabilityArray,
UINT64 CapabilityArrayCount){
unsigned int v4;
INT64 result;
unsigned int v8;
_SID_AND_ATTRIBUTES *PoolWithTag;
SID_AND_ATTRIBUTES *v10;
int v11;
unsigned int v12;
void *Package;
UINT64 CaptureBufferLength;
_POOL_TYPE v15;
UINT8 v16;
_SID_AND_ATTRIBUTES *CapturedArray;
SIZE_T NumberOfBytes;
LODWORD(NumberOfBytes) = 0;
v4 = CapabilityArrayCount;
CapturedArray = 0i64;
if( Token->Capabilities )
{
if( !PackageSid )
return 3221225506i64;
Package = Token->Package;
if( Package )
{
if( !RtlIsParentOfChildAppContainer(Package, PackageSid) )
return 3221225506i64;
}
}
if( v4 )
{
if( v4 > 0x1000 )
return 3221225485i64;
if( SepTokenCapabilitySidSharingEnabled )
{
v8 = 32 * v4;
}
else
{
result = SepLengthSidAndAttributesArray(InputCapabilityArray, v4, &NumberOfBytes);
if( (int)result < 0 )
return result;
v8 = NumberOfBytes;
}
PoolWithTag = (_SID_AND_ATTRIBUTES *)ExAllocatePoolWithTag(PagedPool, v8, 0x73536553ui64);
v10 = PoolWithTag;
if( PoolWithTag )
{
if( SepTokenCapabilitySidSharingEnabled )
{
v11 = SepInsertOrReferenceSharedSidEntries(InputCapabilityArray, PoolWithTag, v4);
}
else
{
LODWORD(CaptureBufferLength) = v8;
v11 = SeCaptureSidAndAttributesArray(
InputCapabilityArray,
v4,
0,
PoolWithTag,
CaptureBufferLength,
v15,
v16,
&CapturedArray,
&NumberOfBytes);
}
v12 = v11;
if( v11 < 0 )
{
ExFreePoolWithTag(v10, 0);
}
else
{
if( Token->Capabilities )
SepFreeTokenCapabilities(Token);
Token->Capabilities = v10;
Token->CapabilityCount = v4;
RtlSidHashInitialize(v10, v4, &Token->CapabilitiesHash);
}
return v12;
}
else
{
return 3221225626i64;
}
}
else
{
if( Token->Capabilities )
SepFreeTokenCapabilities(Token);
Token->Capabilities = 0i64;
Token->CapabilityCount = 0;
return 0i64;
}
}Referenced by:
NtCreateLowBoxToken
SepDuplicateToken
SepFilterToken
SepGetAnonymousToken