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