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