DecodeAttributeName

UINT64 __stdcall DecodeAttributeName(UINT8 *Value, UINT64 ValueSize, WCHAR **DecodedString){
  unsigned int v3; 
  unsigned int v4; 
  __int64 v6; 
  WCHAR *v7; 
  WCHAR *v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 v13; 
  __int64 v14; 
  UINT8 v15; 
  __int64 v16; 
  WCHAR v17; 
  UINT8 v19; 
  char v20[3]; 
  unsigned int v21; 
  UINT8 Digit; 
  WCHAR **v23; 
  UINT8 v24; 
  v23 = DecodedString;
  v3 = 0;
  v4 = ValueSize;
  v21 = 0;
  Digit = 0;
  v24 = 0;
  LOWORD(v6) = 0;
  v19 = 0;
  v20[0] = 0;
  if( !Value || !(_DWORD)ValueSize || !DecodedString )
    return 87i64;
  if( (ValueSize & 1) != 0 )
    return 1336;
  SddlpAlloc(ValueSize + 2, ValueSize);
  v8 = v7;
  if( !v7 )
    return 8;
  v9 = v4 >> 1;
  v10 = 0;
  v11 = v9;
  if( !v9 )
  {
LABEL_26:
    *v23 = v8;
    return v3;
  }
  v12 = 0;
  while( 1 )
  {
    v13 = v10;
    v14 = v10 + 4;
    v15 = 0;
    if( *(_WORD *)&Value[2 * v10] != 37 )
      goto LABEL_18;
    if( (unsigned int)v14 >= v11 )
      break;
    if( !GetDigitFromChar2(*(_WORD *)&Value[2 * v10 + 2], &Digit) )
      break;
    if( !GetDigitFromChar2(*(_WORD *)&Value[2 * v10 + 4], &v24) )
      break;
    if( !GetDigitFromChar2(*(_WORD *)&Value[2 * v10 + 6], &v19) )
      break;
    if( !GetDigitFromChar2(*(_WORD *)&Value[2 * v14], (UINT8 *)v20) )
      break;
    v6 = (unsigned __int16)((unsigned __int8)v20[0] | (unsigned __int16)(16
                                                                       * (v19 | (unsigned __int16)(16
                                                                                                 * (v24 | (unsigned __int16)(16 * Digit))))));
    v15 = IsEncodedAttributeChar((unsigned __int8)v20[0] | (unsigned __int16)(16
                                                                            * (v19 | (unsigned __int16)(16 * (v24 | (unsigned __int16)(16 * Digit))))));
    if( !v15 )
      break;
    v12 = v21;
    v13 = v10;
LABEL_18:
    v16 = v12++;
    v21 = v12;
    if( v15 )
      v17 = v6;
    else
      v17 = *(_WORD *)&Value[2 * v13];
    v8[v16] = v17;
    if( !v15 )
      LODWORD(v14) = v10;
    v10 = v14 + 1;
    if( (int)v14 + 1 >= v9 )
      goto LABEL_26;
    v11 = v9;
  }
  ExFreePoolWithTag(v8, 0);
  return 1336;
}

Referenced by:

GetAttributeName
LocalGetRelativeAttributeForString