NtAdjustGroupsToken

NTSTATUS __stdcall NtAdjustGroupsToken(
        _HANDLE TokenHandle,
        BOOL ResetToDefault,
        PTOKEN_GROUPS NewState,
        ULONG BufferLength,
        PTOKEN_GROUPS PreviousState,
        PULONG ReturnLength){
  PTOKEN_GROUPS v6; 
  VOID *v8; 
  VOID *v9; 
  char PreviousMode; 
  __int64 v11; 
  _TOKEN_GROUPS *v12; 
  NTSTATUS result; 
  int v14; 
  INT64 v15; 
  _ETHREAD *CurrentThread; 
  PERESOURCE *v17; 
  _SID_AND_ATTRIBUTES *v18; 
  _TOKEN *v19; 
  NTSTATUS v20; 
  signed __int32 v21[8]; 
  UINT64 CaptureBufferLength; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  VOID *SidBuffer; 
  INT8 RequestorMode; 
  UINT64 ChangeCount; 
  NTSTATUS v27; 
  UINT64 GroupCount; 
  PVOID Object; 
  _SID_AND_ATTRIBUTES *NewStatea; 
  UINT8 ChangesMade; 
  ULONG v32; 

  v32 = BufferLength;
  v6 = NewState;
  v8 = *(VOID **)&TokenHandle;
  GroupCount = 0i64;
  NewStatea = 0i64;
  ChangeCount = 0i64;
  ChangesMade = 0;
  v9 = 0i64;
  if( !ResetToDefault && !NewState )
    return -1073741811;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  RequestorMode = PreviousMode;
  if( PreviousMode )
  {
    if( ResetToDefault )
    {
      v11 = 0x7FFFFFFF0000i64;
    }
    else
    {
      if( ((unsigned __int8)NewState & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      v11 = 0x7FFFFFFF0000i64;
    }
    v12 = PreviousState;
    if( PreviousState )
    {
      ProbeForWrite((UINT64)PreviousState, BufferLength, 4i64);
      if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
        v11 = (__int64)ReturnLength;
      *(_DWORD *)v11 = *(_DWORD *)v11;
    }
  }
  else
  {
    v12 = PreviousState;
  }
  if( ResetToDefault
    || (LODWORD(GroupCount) = v6->GroupCount,
        LODWORD(CaptureBufferLength) = 0,
        LOBYTE(NewState) = PreviousMode,
        result = SeCaptureSidAndAttributesArray(
                   v6->Groups,
                   (unsigned int)GroupCount,
                   (INT64)NewState,
                   0i64,
                   CaptureBufferLength,
                   (POOL_TYPE)HandleInformation,
                   (UINT8)SidBuffer,
                   &NewStatea,
                   (UINT64 *)((char *)&GroupCount + 4)),
        v27 = result,
        result >= 0) )
  {
    Object = 0i64;
    v14 = ObReferenceObjectByHandle(
            v8,
            v12 != 0i64 ? 72 : 64,
            (_OBJECT_TYPE *)SeTokenObjectType,
            PreviousMode,
            &Object,
            0i64);
    if( v14 < 0 )
    {
      if( NewStatea )
        SeReleaseLuidAndAttributesArray((_LUID_AND_ATTRIBUTES *)NewStatea, PreviousMode);
      return v14;
    }
    else
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      v17 = (PERESOURCE *)Object;
      ExAcquireResourceExclusiveLite(*((_QWORD *)Object + 6), 1, v15);
      _InterlockedOr(v21, 0);
      v18 = NewStatea;
      v19 = (_TOKEN *)Object;
      v20 = SepAdjustGroups(
              (_TOKEN *)Object,
              0,
              ResetToDefault,
              (unsigned int)GroupCount,
              NewStatea,
              v12,
              0i64,
              &ChangeCount,
              (UINT64 *)((char *)&ChangeCount + 4),
              &ChangesMade);
      v27 = v20;
      if( v12 )
        *ReturnLength = ChangeCount;
      if( v20 < 0 )
        goto LABEL_24;
      if( !v12 )
      {
LABEL_20:
        v27 = SepAdjustGroups(
                v19,
                1u,
                ResetToDefault,
                (unsigned int)GroupCount,
                v18,
                v12,
                v9,
                &ChangeCount,
                (UINT64 *)((char *)&ChangeCount + 4),
                &ChangesMade);
        if( v12 )
          v12->GroupCount = HIDWORD(ChangeCount);
        if( ChangesMade )
          v19->ModifiedId = (_LUID)(ExpLuidIncrement + _InterlockedExchangeAdd64(&ExpLuid, ExpLuidIncrement));
LABEL_24:
        _InterlockedOr(v21, 0);
        ExReleaseResourceLite(v17[6]);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        HalPutDmaAdapter((PADAPTER_OBJECT)Object);
        if( NewStatea )
          SeReleaseLuidAndAttributesArray((_LUID_AND_ATTRIBUTES *)NewStatea, PreviousMode);
        return v27;
      }
      if( (unsigned int)ChangeCount <= v32 )
      {
        v9 = (VOID *)(((unsigned __int64)&v12->Groups[0].Sid + (unsigned int)(16 * HIDWORD(ChangeCount)) + 3) & 0xFFFFFFFFFFFFFFFCui64);
        goto LABEL_20;
      }
      _InterlockedOr(v21, 0);
      ExReleaseResourceLite(v17[6]);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      HalPutDmaAdapter((PADAPTER_OBJECT)Object);
      if( NewStatea )
        SeReleaseLuidAndAttributesArray((_LUID_AND_ATTRIBUTES *)NewStatea, PreviousMode);
      return -1073741789;
    }
  }
  return result;
}

Referenced by:

No references.