GetAttributeName

UINT64 __stdcall GetAttributeName(WCHAR *Condition, _OPERAND_VALUE **Value, UINT64 *MoveBy){
  WCHAR *v5; 
  unsigned int v6; 
  unsigned int v7; 
  __int16 v8; 
  UINT16 v9; 
  unsigned int v10; 
  const wchar_t *v11; 
  UINT64 v12; 
  _OPERAND_VALUE *v13; 
  unsigned int v14; 
  bool v15; 
  VOID *v16; 
  _OPERAND_VALUE *v17; 
  _OPERAND_VALUE *v18; 
  __int64 v19; 
  WCHAR *v20; 
  WCHAR *DecodedString; 

  DecodedString = 0i64;
  v5 = Condition;
  v6 = 0;
  v7 = 0;
  if( wcsnicmp(Condition, L"@", 1u) )
  {
    while( 1 )
    {
      v9 = v5[v7];
      if( v9 > 0xFFu )
        break;
      if( !iswalnum(v9) )
      {
        v10 = 0;
        v11 = L":./_@";
        while( *v11 != v9 )
        {
          ++v10;
          ++v11;
          if( v10 >= 5 )
            goto LABEL_10;
        }
      }
      if( !v5[v7] )
        break;
      ++v7;
    }
  }
  else
  {
    while( IsLegalAttributeChar2(v5[v7]) && v8 )
      ++v7;
  }
LABEL_10:
  if( v7 >= 8 && !wcsnicmp(v5, L"@DEVICE.", 8u) )
  {
    if( v7 != 8 )
    {
      v13 = *Value;
      v14 = 2 * v7 - 16;
      v5 += 8;
      *((_BYTE *)*Value + 1) = -5;
      goto LABEL_31;
    }
    return 1336;
  }
  if( v7 < 0xA || wcsnicmp(v5, L"@RESOURCE.", 0xAu) )
  {
    if( v7 < 6 || wcsnicmp(v5, L"@USER.", 6u) )
    {
      if( v7 < 7 || wcsnicmp(v5, L"@TOKEN.", 7u) )
      {
        if( !v7 || !wcsnicmp(v5, L"@", 1u) )
          return 1336;
        v13 = *Value;
        v14 = 2 * v7;
        *((_BYTE *)*Value + 1) = -8;
      }
      else
      {
        if( v7 == 7 )
          return 1336;
        v13 = *Value;
        v14 = 2 * v7 - 14;
        v5 += 7;
        *((_BYTE *)*Value + 1) = -4;
      }
    }
    else
    {
      if( v7 == 6 )
        return 1336;
      v13 = *Value;
      v14 = 2 * v7 - 12;
      v5 += 6;
      *((_BYTE *)*Value + 1) = -7;
    }
  }
  else
  {
    if( v7 == 10 )
      return 1336;
    v13 = *Value;
    v14 = 2 * v7 - 20;
    v5 += 10;
    *((_BYTE *)*Value + 1) = -6;
  }
LABEL_31:
  v13[1] = v14;
  v15 = *((_BYTE *)v13 + 1) == 0xF8;
  *(_DWORD *)MoveBy = v7;
  if( v15 )
  {
    v16 = SddlpAlloc(v14, v14, v12);
    v17 = *Value;
    *((_QWORD *)*Value + 1) = v16;
    if( v16 )
      memmove(v16, v5, v17[1]);
    else
      return 8;
  }
  else
  {
    v6 = DecodeAttributeName((UINT8 *)v5, v14, &DecodedString);
    if( !v6 )
    {
      v18 = *Value;
      v19 = -1i64;
      v20 = DecodedString;
      *((_QWORD *)*Value + 1) = DecodedString;
      do
        ++v19;
      while( v20[v19] );
      v18[1] = 2 * v19;
    }
  }
  return v6;
}

Referenced by:

GetOperandValue