AslpFileGetClrVersion
INT64 __fastcall AslpFileGetClrVersion(BYTE *a1, INT64 a2){
unsigned int *v4;
int ImageNtHeader;
unsigned int v6;
__int64 v7;
__int16 v8;
unsigned __int64 v9;
const CHAR *v10;
UINT64 v11;
unsigned __int64 v12;
__int64 v13;
__int64 v15;
v15 = 0i64;
v4 = 0i64;
*a1 = 0;
ImageNtHeader = AslpFileGetImageNtHeader(&v15, a2);
v6 = ImageNtHeader;
if( ImageNtHeader >= 0 )
{
v7 = v15;
v8 = *(_WORD *)(v15 + 24);
if( v8 == 267 )
{
v4 = (unsigned int *)(v15 + 232);
}
else if( v8 == 523 )
{
v4 = (unsigned int *)(v15 + 248);
}
if( !v4 || !*v4 || v4[1] < 0x48 )
return(unsigned int)-1073741701;
v9 = AslpImageRvaToVa(v15, a2 + 8, *v4);
if( v9 )
{
if( *(_WORD *)(v9 + 4) != 2 )
return(unsigned int)-1073741637;
v12 = AslpImageRvaToVa(v7, a2 + 8, *(_DWORD *)(v9 + 8));
if( v12 )
{
if( *(_DWORD *)v12 != 1112167234 )
{
v6 = -1073741637;
v10 = "Invalid COR20 Metadata signature encountered";
v11 = 4206i64;
goto LABEL_13;
}
v13 = *(unsigned int *)(v12 + 12);
if( (unsigned __int64)(v13 - 1) <= 0xFE )
{
memmove(a1, (UINT8 *)(v12 + 16), (unsigned int)v13);
a1[v13] = 0;
return 0;
}
v10 = "CLR version string null or too long";
v11 = 4218i64;
}
else
{
v10 = "Invalid COR20 Metadata virtual address encountered";
v11 = 4196i64;
}
}
else
{
v10 = "Invalid COM Descriptor virtual address encountered";
v11 = 4176i64;
}
v6 = -1073741701;
LABEL_13:
AslLogCallPrintf(1ui64, "AslpFileGetClrVersion", v11, v10);
return v6;
}
AslLogCallPrintf(1ui64, "AslpFileGetClrVersion", 0x1033ui64, "AslpFileGetImageNtHeader failed [%x]", ImageNtHeader);
return v6;
}Referenced by:
AslpFileGetClrVersionAttribute