AslpFileVerQueryBlock
__int64 __fastcall AslpFileVerQueryBlock(unsigned __int16 *a1, const wchar_t *a2, unsigned __int16 **a3, _QWORD *a4){
unsigned __int16 *i;
int v7;
WCHAR **v8;
unsigned int v9;
__int64 v10;
WCHAR *v11;
char *v12;
__int16 v13;
unsigned __int16 *v14;
INT64 v15;
WCHAR *v16;
unsigned int v17;
int v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
const CHAR *v23;
UINT64 v24;
UINT64 v25;
INT64 v26;
INT64 v27;
PVOID P;
__int64 v29;
i = a1;
P = 0i64;
v27 = 0i64;
v29 = 0i64;
*a4 = 0i64;
if( a1[2] )
{
v9 = -1073741811;
AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", 0x79Bui64, "Version block invalid");
return v9;
}
v7 = AslStringDuplicate((WCHAR **)&P, (WCHAR *)a2);
v9 = v7;
if( v7 < 0 )
{
AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", 0x7A1ui64, "AslStringDuplicate failed [%x]", v7);
}
else
{
v10 = *i;
if( (unsigned __int16)v10 > 0x7FFFu )
{
v23 = "VersionBlock is too long";
v24 = 1965i64;
}
else
{
if( (unsigned __int16)v10 >= 8u )
{
v11 = (WCHAR *)P;
v12 = (char *)i + v10;
v13 = *(unsigned __int16 *)((char *)i + v10 - 2);
v14 = (unsigned __int16 *)v12;
*((_WORD *)v12 - 1) = 0;
LABEL_7:
v16 = AslpFileStringTokenize(v11, v8);
if( v16 )
{
v17 = (_DWORD)v12 - (_DWORD)i;
if( (unsigned int)((_DWORD)v12 - (_DWORD)i) >= 8 && *i <= v17 )
{
LOBYTE(v18) = AslpFileVerBlockGetValueOffset((INT16)&v29, (UINT8)i, v17, v15, v25, v26, v27);
if( v18 >= 0 )
{
v19 = *i;
v20 = v29 + ((i[1] + 3i64) & 0xFFFFFFFFFFFFFFFCui64);
v29 = v20;
if( v20 <= v19 )
{
v14 = (unsigned __int16 *)((char *)i + v19);
for( i = (unsigned __int16 *)((char *)i + v20);
i < v14;
i = (unsigned __int16 *)((char *)i + ((*i + 3i64) & 0xFFFFFFFFFFFFFFFCui64)) )
{
v21 = *i;
if( (unsigned __int16)v21 <= 8u || v21 > (char *)v14 - (char *)i )
break;
if( !wcsicmp(v16, i + 3) )
{
v11 = 0i64;
goto LABEL_7;
}
}
}
}
}
v9 = -1073741275;
}
else
{
*a3 = i;
*a4 = (char *)v14 - (char *)i;
v9 = 0;
}
*((_WORD *)v12 - 1) = v13;
goto LABEL_20;
}
v23 = "VersionBlock not long enough";
v24 = 1970i64;
}
v9 = -1073741811;
AslLogCallPrintf(1ui64, "AslpFileVerQueryBlock", v24, v23);
}
LABEL_20:
if( P )
ExFreePoolWithTag(P, 0x74705041u);
return v9;
}Referenced by:
AslpFileQueryVersionString