NtAdjustPrivilegesToken

NTSTATUS __fastcall NtAdjustPrivilegesToken(
        UINT64 a1,
        INT8 a2,
        UINT64 a3,
        INT64 a4,
        UINT64 PreviousState,
        UINT64 *ReturnLength){
  unsigned int v6; 
  char PreviousMode; 
  __int64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  NTSTATUS result; 
  int v15; 
  INT64 v16; 
  _ETHREAD *CurrentThread; 
  __int64 v18; 
  _LUID_AND_ATTRIBUTES *v19; 
  __int64 v20; 
  int v21; 
  signed __int32 v22[8]; 
  PVOID *Object; 
  UINT64 *ChangeCount; 
  UINT8 *ChangesMade; 
  INT8 RequestorMode; 
  _DWORD ArrayCount[3]; 
  UINT64 v28; 
  _LUID_AND_ATTRIBUTES *NewState; 
  NTSTATUS v30; 
  _DWORD v31[3]; 
  UINT8 v32; 

  v6 = a4;
  ArrayCount[0] = 0;
  NewState = 0i64;
  v31[0] = 0;
  v28 = 0i64;
  v32 = 0;
  if( !a2 && !a3 )
    return -1073741811;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  RequestorMode = PreviousMode;
  if( PreviousMode )
  {
    if( a2 )
    {
      v11 = 0x7FFFFFFF0000i64;
    }
    else
    {
      if( (a3 & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      v11 = 0x7FFFFFFF0000i64;
      ArrayCount[0] = *(_DWORD *)a3;
      v31[1] = 12 * (ArrayCount[0] - 1) + 16;
      if( 12 * (ArrayCount[0] - 1) != -16 )
      {
        v12 = a3 + (unsigned int)(12 * (ArrayCount[0] - 1) + 16);
        if( v12 > 0x7FFFFFFF0000i64 || v12 < a3 )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
    v13 = PreviousState;
    if( PreviousState )
    {
      ProbeForWrite(PreviousState, (unsigned int)a4, 4i64);
      if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
        v11 = (__int64)ReturnLength;
      *(_DWORD *)v11 = *(_DWORD *)v11;
    }
LABEL_16:
    if( !a2 )
    {
      ChangesMade = (UINT8 *)v31;
      ChangeCount = (UINT64 *)&NewState;
      result = SeCaptureLuidAndAttributesArray(
                 (_LUID_AND_ATTRIBUTES *)(a3 + 4),
                 ArrayCount[0],
                 PreviousMode,
                 (_LUID_AND_ATTRIBUTES **)a4,
                 (UINT64 *)Object);
      v30 = result;
      if( result < 0 )
        return result;
    }
    goto LABEL_18;
  }
  v13 = PreviousState;
  if( !a2 )
  {
    ArrayCount[0] = *(_DWORD *)a3;
    goto LABEL_16;
  }
LABEL_18:
  *(_QWORD *)&ArrayCount[1] = 0i64;
  v15 = ObReferenceObjectByHandle(
          (VOID *)a1,
          v13 != 0 ? 40 : 32,
          (_OBJECT_TYPE *)SeTokenObjectType,
          PreviousMode,
          (VOID **)&ArrayCount[1],
          0i64);
  if( v15 < 0 )
  {
    if( NewState )
      SeReleaseLuidAndAttributesArray(NewState, PreviousMode);
    return v15;
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    v18 = *(_QWORD *)&ArrayCount[1];
    ExAcquireResourceExclusiveLite(*(_QWORD *)(*(_QWORD *)&ArrayCount[1] + 48i64), 1, v16);
    _InterlockedOr(v22, 0);
    v19 = NewState;
    v20 = *(_QWORD *)&ArrayCount[1];
    SepAdjustPrivileges(
      *(_TOKEN **)&ArrayCount[1],
      0,
      a2,
      ArrayCount[0],
      NewState,
      (_TOKEN_PRIVILEGES *)v13,
      &v28,
      (UINT64 *)((char *)&v28 + 4),
      &v32);
    if( v13 && (*(_DWORD *)ReturnLength = v28, (unsigned int)v28 > v6) )
    {
      _InterlockedOr(v22, 0);
      ExReleaseResourceLite(*(PERESOURCE *)(v18 + 48));
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      HalPutDmaAdapter(*(PADAPTER_OBJECT *)&ArrayCount[1]);
      if( NewState )
        SeReleaseLuidAndAttributesArray(NewState, PreviousMode);
      return -1073741789;
    }
    else
    {
      v30 = SepAdjustPrivileges(
              (_TOKEN *)v20,
              1u,
              a2,
              ArrayCount[0],
              v19,
              (_TOKEN_PRIVILEGES *)v13,
              &v28,
              (UINT64 *)((char *)&v28 + 4),
              &v32);
      if( v13 )
      {
        v21 = HIDWORD(v28);
        *(_DWORD *)v13 = HIDWORD(v28);
        if( !v21 )
        {
          *(_QWORD *)(v13 + 4) = 0i64;
          *(_DWORD *)(v13 + 12) = 0;
        }
      }
      if( v32 )
        *(_QWORD *)(v20 + 56) = ExpLuidIncrement + _InterlockedExchangeAdd64(&ExpLuid, ExpLuidIncrement);
      _InterlockedOr(v22, 0);
      ExReleaseResourceLite(*(PERESOURCE *)(v18 + 48));
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      HalPutDmaAdapter(*(PADAPTER_OBJECT *)&ArrayCount[1]);
      if( NewState )
        SeReleaseLuidAndAttributesArray(NewState, PreviousMode);
      return v30;
    }
  }
}

Referenced by:

RtlpSysVolTakeOwnership