NtFilterToken

NTSTATUS __stdcall NtFilterToken(
        PVOID ExistingTokenHandle,
        UINT64 Flags,
        _TOKEN_GROUPS *SidsToDisable,
        _TOKEN_PRIVILEGES *PrivilegesToDelete,
        _TOKEN_GROUPS *RestrictedSids,
        PVOID *NewTokenHandle){
  CHAR v7; 
  __int64 v8; 
  unsigned int v9; 
  NTSTATUS inserted; 
  unsigned int i; 
  UINT64 v12; 
  PVOID *Object; 
  PVOID *Objecta; 
  _POOL_TYPE HandleInformation; 
  POBJECT_HANDLE_INFORMATION HandleInformationa; 
  UINT8 PrivilegesToDeletea; 
  _SID_AND_ATTRIBUTES **CapturedArray; 
  UINT64 ulAddend; 
  UINT64 ArrayCount; 
  ULONG v22[2]; 
  PADAPTER_OBJECT DmaAdapter; 
  _SID_AND_ATTRIBUTES *v24; 
  unsigned int v25; 
  UINT64 AlignedArraySize; 
  PVOID v27; 
  _SID_AND_ATTRIBUTES *GroupsToDisable; 
  _LUID_AND_ATTRIBUTES *v29; 
  struct _OBJECT_HANDLE_INFORMATION v30; 
  PVOID v31; 
  unsigned int Flagsa; 
  Flagsa = Flags;
  DmaAdapter = 0i64;
  v24 = 0i64;
  v22[0] = 0;
  ArrayCount = 0i64;
  GroupsToDisable = 0i64;
  AlignedArraySize = 0i64;
  v22[1] = 0;
  v29 = 0i64;
  v31 = 0i64;
  v30 = 0i64;
  v7 = *((_BYTE *)KeGetCurrentThread() + 562);
  v8 = 0x7FFFFFFF0000i64;
  if( (unsigned __int64)NewTokenHandle < 0x7FFFFFFF0000i64 )
    v8 = (__int64)NewTokenHandle;
  *(_QWORD *)v8 = *(_QWORD *)v8;
  if( SidsToDisable )
  {
    if( ((unsigned __int8)SidsToDisable & 3) != 0 )
      goto LABEL_18;
    LODWORD(ArrayCount) = SidsToDisable->GroupCount;
    v9 = 0;
    v25 = 0;
    while( v9 < (unsigned int)ArrayCount )
    {
      *(&SidsToDisable->GroupCount + 4 * ++v9) = 0;
      v25 = v9;
    }
    LODWORD(Object) = 0;
    inserted = SeCaptureSidAndAttributesArray(
                 SidsToDisable->Groups,
                 (unsigned int)ArrayCount,
                 v7,
                 0i64,
                 (UINT64)Object,
                 HandleInformation,
                 PrivilegesToDeletea,
                 &GroupsToDisable,
                 &AlignedArraySize);
  }
  else
  {
    inserted = 0;
  }
  if( inserted < 0 )
    goto LABEL_19;
  if( PrivilegesToDelete )
  {
    if( ((unsigned __int8)PrivilegesToDelete & 3) != 0 )
      goto LABEL_18;
    v22[1] = PrivilegesToDelete->PrivilegeCount;
    CapturedArray = (_SID_AND_ATTRIBUTES **)&v29;
    inserted = SeCaptureLuidAndAttributesArray(
                 PrivilegesToDelete->Privileges,
                 v22[1],
                 v7,
                 (LUID_AND_ATTRIBUTES **)PrivilegesToDelete,
                 (UINT64 *)Object);
  }
  if( inserted >= 0 && RestrictedSids )
  {
    if( ((unsigned __int8)RestrictedSids & 3) == 0 )
    {
      HIDWORD(ArrayCount) = RestrictedSids->GroupCount;
      LODWORD(Object) = 0;
      inserted = SeCaptureSidAndAttributesArray(
                   RestrictedSids->Groups,
                   RestrictedSids->GroupCount,
                   v7,
                   0i64,
                   (UINT64)Object,
                   HandleInformation,
                   PrivilegesToDeletea,
                   &v24,
                   (UINT64 *)v22);
      goto LABEL_19;
    }
LABEL_18:
    ExRaiseDatatypeMisalignment();
  }
LABEL_19:
  if( inserted >= 0 )
  {
    for( i = 0; i < HIDWORD(ArrayCount); ++i )
    {
      if( v24[i].Attributes )
      {
        inserted = -1073741811;
        goto LABEL_30;
      }
    }
    v27 = 0i64;
    inserted = ObReferenceObjectByHandle(ExistingTokenHandle, 2u, (POBJECT_TYPE)SeTokenObjectType, v7, &v27, &v30);
    if( inserted >= 0 )
    {
      DmaAdapter = 0i64;
      LODWORD(ulAddend) = v22[0];
      LODWORD(CapturedArray) = HIDWORD(ArrayCount);
      LODWORD(HandleInformationa) = v22[1];
      LOBYTE(v12) = v7;
      inserted = SepFilterToken(
                   (_TOKEN *)v27,
                   v12,
                   Flagsa,
                   (unsigned int)ArrayCount,
                   GroupsToDisable,
                   (UINT64)HandleInformationa,
                   v29,
                   (UINT64)CapturedArray,
                   v24,
                   ulAddend,
                   (_TOKEN **)&DmaAdapter);
      if( inserted >= 0 )
      {
        LODWORD(Objecta) = 0;
        inserted = ObInsertObjectEx(DmaAdapter, 0i64, v30.GrantedAccess, 1ui64, (UINT64)Objecta, 0i64, &v31);
        if( inserted >= 0 )
        {
          SepAppendAceToTokenObjectAcl((_TOKEN *)DmaAdapter, 8ui64, SeAliasAdminsSid);
          HalPutDmaAdapter(DmaAdapter);
        }
      }
      HalPutDmaAdapter((PADAPTER_OBJECT)v27);
      if( inserted >= 0 )
        *NewTokenHandle = v31;
    }
  }
LABEL_30:
  if( GroupsToDisable )
    SeReleaseLuidAndAttributesArray((LUID_AND_ATTRIBUTES *)GroupsToDisable, v7);
  if( v29 )
    SeReleaseLuidAndAttributesArray(v29, v7);
  if( v24 )
    SeReleaseLuidAndAttributesArray((LUID_AND_ATTRIBUTES *)v24, v7);
  return inserted;
}

Referenced by:

No references.