AslpFileMakeStringVersionAttributes
__int64 __fastcall AslpFileMakeStringVersionAttributes(__int64 a1, unsigned __int16 *a2){
_DWORD *v4;
__int64 v5;
int v6;
unsigned __int16 *i;
unsigned __int64 v8;
const CHAR *v9;
UINT64 v10;
unsigned __int64 v11;
unsigned __int16 *v12;
int v13;
WCHAR **v14;
__int64 v15;
WCHAR *v16;
char *v17;
__int16 v18;
unsigned __int16 *v19;
INT64 v20;
int v21;
unsigned __int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
INT64 v25;
unsigned __int16 *v26;
unsigned int v27;
int v28;
unsigned __int64 v29;
__int64 v30;
__int64 v31;
int v32;
wchar_t *v33;
__int64 v34;
__int64 v35;
__int64 v36;
const CHAR *v37;
UINT64 v38;
__int64 v40;
__int64 v41;
NTSTRSAFE_PCWSTR pszSrc;
INT16 v43[4];
WCHAR *Duplicate[2];
wchar_t *Str1;
INT16 v46[4];
wchar_t *String;
__int64 v48[2];
__int16 v50;
int v51;
String = 0i64;
v48[0] = 0i64;
*(_QWORD *)v46 = 0i64;
if( !a2 )
{
v4 = (_DWORD *)(a1 + 184);
v5 = 8i64;
do
{
*v4 |= 2u;
v4 += 8;
--v5;
}
while( v5 );
*(_DWORD *)(a1 + 792) |= 2u;
return 0;
}
i = a2;
Duplicate[0] = 0i64;
v8 = 0i64;
Duplicate[1] = 0i64;
*(_QWORD *)v43 = 0i64;
if( a2[2] )
{
v9 = "Version block invalid";
v10 = 1947i64;
}
else
{
v13 = AslStringDuplicate(Duplicate, (WCHAR *)L"\\VarFileInfo\\Translation");
v6 = v13;
if( v13 < 0 )
{
AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", 0x7A1ui64, "AslStringDuplicate failed [%x]", v13);
goto LABEL_8;
}
v15 = *a2;
if( (unsigned __int16)v15 <= 0x7FFFu )
{
if( (unsigned __int16)v15 >= 8u )
{
v16 = Duplicate[0];
v17 = (char *)a2 + v15;
v18 = *(unsigned __int16 *)((char *)a2 + v15 - 2);
v19 = (unsigned __int16 *)v17;
v50 = v18;
*((_WORD *)v17 - 1) = 0;
LABEL_16:
Str1 = AslpFileStringTokenize(v16, v14);
if( Str1 )
{
v11 = (unsigned int)((_DWORD)v17 - (_DWORD)i);
if( (unsigned int)v11 >= 8 && *i <= (unsigned int)v11 )
{
LOBYTE(v21) = AslpFileVerBlockGetValueOffset(
(INT16)v43,
(UINT8)i,
(_BYTE)v17 - (_BYTE)i,
v20,
v40,
(INT64)pszSrc,
*(INT64 *)v43);
if( v21 >= 0 )
{
v22 = *i;
v23 = *(_QWORD *)v43 + ((i[1] + 3i64) & 0xFFFFFFFFFFFFFFFCui64);
*(_QWORD *)v43 = v23;
if( v23 <= v22 )
{
v19 = (unsigned __int16 *)((char *)i + v22);
for( i = (unsigned __int16 *)((char *)i + v23);
i < v19;
i = (unsigned __int16 *)((char *)i + ((*i + 3i64) & 0xFFFFFFFFFFFFFFFCui64)) )
{
v24 = *i;
if( (unsigned __int16)v24 <= 8u )
break;
v11 = (char *)v19 - (char *)i;
if( v24 > (char *)v19 - (char *)i )
break;
if( !wcsicmp(Str1, i + 3) )
{
v16 = 0i64;
goto LABEL_16;
}
}
}
}
}
v6 = -1073741275;
*((_WORD *)v17 - 1) = v50;
v12 = 0i64;
}
else
{
v8 = (char *)v19 - (char *)i;
*((_WORD *)v17 - 1) = v50;
v12 = i;
v6 = 0;
}
goto LABEL_30;
}
v9 = "VersionBlock not long enough";
v10 = 1970i64;
}
else
{
v9 = "VersionBlock is too long";
v10 = 1965i64;
}
}
v6 = -1073741811;
AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", v10, v9);
LABEL_8:
v12 = 0i64;
LABEL_30:
AslFree((PVOID)v11);
if( v6 == -1073741275 )
{
v26 = 0i64;
v27 = 0;
}
else
{
if( v6 < 0 )
{
LODWORD(v40) = v6;
AslLogCallPrintf(
1ui64,
"AslpFileMakeStringVersionAttributes",
0x6B9ui64,
"AslpFileVerQueryBlock failed [%x]",
v40);
return(unsigned int)v6;
}
v26 = 0i64;
v27 = 0;
LOBYTE(v28) = AslpFileVerBlockGetValueOffset((INT16)v46, (UINT8)v12, v8, v25, v40, (INT64)pszSrc, *(INT64 *)v43);
if( v28 >= 0 && v8 > *(_QWORD *)v46 )
{
v26 = (unsigned __int16 *)((char *)v12 + *(_QWORD *)v46);
v27 = v8 - *(_DWORD *)v46;
}
}
v29 = 0i64;
v30 = (unsigned __int64)v27 >> 2;
do
{
v31 = *(int *)&byte_140008AE0[v29];
v51 = *(_DWORD *)&byte_140008AE0[v29];
v32 = AslpFileQueryVersionString(&String, v48, a2, v26, v30, *(NTSTRSAFE_PCWSTR *)&byte_140008AE0[v29 + 8]);
v6 = v32;
if( v32 < 0 )
{
if( v32 == -1073741275 )
{
*(_DWORD *)(32 * v31 + a1 + 24) |= 2u;
goto LABEL_45;
}
v37 = "AslpFileQueryVersionString failed [%x]";
v38 = 1776i64;
LABEL_53:
LODWORD(v41) = v32;
AslLogCallPrintf(1ui64, "AslpFileMakeStringVersionAttributes", v38, v37, v41);
return(unsigned int)v6;
}
v33 = String;
v32 = AslStringXmlSanitize(String);
v6 = v32;
if( v32 < 0 )
{
v37 = "AslStringXmlSanitize failed [%x]";
v38 = 1763i64;
goto LABEL_53;
}
v34 = 32i64 * v51;
v35 = -1i64;
*(_DWORD *)(v34 + a1) = 4;
do
++v35;
while( v33[v35] );
*(_DWORD *)(v34 + a1 + 24) |= 1u;
*(_QWORD *)(v34 + a1 + 8) = v35;
*(_QWORD *)(v34 + a1 + 16) = v33;
LABEL_45:
v29 += 16i64;
}
while( v29 < 0x80 );
if( v26 && v30 == 1 )
{
*(_DWORD *)(a1 + 768) = 2;
*(_QWORD *)(a1 + 776) = 4i64;
v36 = *v26;
*(_DWORD *)(a1 + 792) |= 1u;
*(_QWORD *)(a1 + 784) = v36;
}
else
{
*(_DWORD *)(a1 + 792) |= 2u;
}
return 0;
}Referenced by:
AslpFileGetVersionAttributes