NtAdjustGroupsToken
INT64 __fastcall NtAdjustGroupsToken(
VOID *TokenHandle,
UINT8 ResetToDefault,
_TOKEN_GROUPS *NewState,
UINT64 BufferLength,
_TOKEN_GROUPS *PreviousState,
UINT64 *ReturnLength){
void *v9;
INT8 v10;
__int64 v11;
_TOKEN_GROUPS *v12;
INT64 result;
NTSTATUS v14;
_ETHREAD *CurrentThread;
_TOKEN *v16;
_SID_AND_ATTRIBUTES *v17;
INT64 v18;
_TOKEN *v19;
int v20;
UINT64 *v21;
INT64 v22;
signed __int32 v23[8];
PVOID *Object;
POBJECT_HANDLE_INFORMATION HandleInformation;
PSID DestinationSid;
INT8 RequestorMode;
UINT ChangeCount[2];
unsigned int v29;
UINT64 GroupCount;
_TOKEN *v31;
_SID_AND_ATTRIBUTES *NewStatea;
UINT8 ChangesMade;
UINT v34;
v34 = BufferLength;
GroupCount = 0i64;
NewStatea = 0i64;
ChangeCount[0] = 0;
ChangeCount[1] = 0;
ChangesMade = 0;
v9 = 0i64;
if( !ResetToDefault && !NewState )
return 3221225485i64;
v10 = *((_BYTE *)KeGetCurrentThread() + 562);
RequestorMode = v10;
if( v10 )
{
if( ResetToDefault )
{
v11 = 0x7FFFFFFF0000i64;
}
else
{
if( ((unsigned __int8)NewState & 3) != 0 )
ExRaiseDatatypeMisalignment();
v11 = 0x7FFFFFFF0000i64;
}
v12 = PreviousState;
if( PreviousState )
{
ProbeForWrite(PreviousState, (unsigned int)BufferLength, 4ui64);
if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
v11 = (__int64)ReturnLength;
*(_DWORD *)v11 = *(_DWORD *)v11;
}
}
else
{
v12 = PreviousState;
}
if( ResetToDefault
|| (LODWORD(GroupCount) = NewState->GroupCount,
LODWORD(Object) = 0,
result = SeCaptureSidAndAttributesArray(
NewState->Groups,
(unsigned int)GroupCount,
v10,
0i64,
(UINT64)Object,
(_POOL_TYPE)HandleInformation,
(UINT8)DestinationSid,
&NewStatea,
(UINT64 *)((char *)&GroupCount + 4)),
v29 = result,
(int)result >= 0) )
{
v31 = 0i64;
v14 = ObReferenceObjectByHandle(
TokenHandle,
v12 != 0i64 ? 72 : 64,
(POBJECT_TYPE)SeTokenObjectType,
v10,
(PVOID *)&v31,
0i64);
if( v14 < 0 )
{
if( NewStatea )
SeReleaseLuidAndAttributesArray((LUID_AND_ATTRIBUTES *)NewStatea, v10);
return(unsigned int)v14;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v16 = v31;
ExAcquireResourceExclusiveLite(v31->TokenLock, 1u);
_InterlockedOr(v23, 0);
v17 = NewStatea;
LOBYTE(v18) = ResetToDefault;
v19 = v31;
v20 = SepAdjustGroups(
v31,
0i64,
v18,
(unsigned int)GroupCount,
NewStatea,
v12,
0i64,
ChangeCount,
&ChangeCount[1],
&ChangesMade);
v29 = v20;
if( v12 )
{
v21 = ReturnLength;
*(_DWORD *)ReturnLength = ChangeCount[0];
}
if( v20 < 0 )
goto LABEL_24;
if( !v12 )
{
LABEL_20:
LOBYTE(v22) = ResetToDefault;
LOBYTE(v21) = 1;
v29 = SepAdjustGroups(
v19,
(INT64)v21,
v22,
(unsigned int)GroupCount,
v17,
v12,
v9,
ChangeCount,
&ChangeCount[1],
&ChangesMade);
if( v12 )
v12->GroupCount = ChangeCount[1];
if( ChangesMade )
v19->ModifiedId = (_LUID)(ExpLuidIncrement + _InterlockedExchangeAdd64(&ExpLuid, ExpLuidIncrement));
LABEL_24:
_InterlockedOr(v23, 0);
ExReleaseResourceLite(v16->TokenLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
HalPutDmaAdapter((PADAPTER_OBJECT)v31);
if( NewStatea )
SeReleaseLuidAndAttributesArray((LUID_AND_ATTRIBUTES *)NewStatea, v10);
return v29;
}
if( ChangeCount[0] <= v34 )
{
v9 = (void *)(((unsigned __int64)&v12->Groups[ChangeCount[1]].Sid + 3) & 0xFFFFFFFFFFFFFFFCui64);
goto LABEL_20;
}
_InterlockedOr(v23, 0);
ExReleaseResourceLite(v16->TokenLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
HalPutDmaAdapter((PADAPTER_OBJECT)v31);
if( NewStatea )
SeReleaseLuidAndAttributesArray((LUID_AND_ATTRIBUTES *)NewStatea, v10);
return 3221225507i64;
}
}
return result;
}Referenced by:
No references.