MiValidateExistingImage

INT64 __fastcall MiValidateExistingImage(UINT64 *a1){
  INT64 v1; 
  CHAR v2; 
  CHAR v3; 
  bool v4; 
  INT64 result; 
  INT64 v7; 
  __int64 v8; 
  __int64 v9; 
  int v10; 
  __int64 v11; 
  unsigned int v12; 
  __int64 v13; 
  int v14; 
  UINT8 v15; 
  UINT8 v16; 
  int v17; 
  unsigned int v18; 
  int v19; 
  int v20; 
  unsigned __int8 v21; 
  int v22; 
  INT64 v23; 
  INT64 v24; 
  UINT8 SigningLevel; 
  INT64 v26; 
  _FILE_OBJECT *FileObject; 
  v1 = a1[8];
  v2 = 0;
  LODWORD(v26) = 0;
  v3 = 0;
  v4 = 0;
  FileObject = (_FILE_OBJECT *)a1[7];
  if( (*(_DWORD *)(v1 + 56) & 0x800) != 0 && (*(_DWORD *)a1 & 0x80000) != 0 )
  {
    dword_140C4C958 = 12;
    return 3221226547i64;
  }
  if( (*(_DWORD *)a1 & 0x40) != 0 )
    v7 = 2i64;
  else
    v7 = (*(_DWORD *)a1 & 0x20) != 0;
  result = MiRelocateImageAgain(v1, v7);
  if( (int)result < 0 )
  {
    dword_140C4C958 = 13;
    return result;
  }
  v8 = *(unsigned int *)a1;
  v9 = 6i64;
  if( (v8 & 0x100) != 0 )
  {
    v10 = 4;
  }
  else if( (v8 & 0x20) != 0 )
  {
    v10 = 1;
  }
  else if( (v8 & 0x10) != 0 )
  {
    v10 = (*(_DWORD *)a1 & 0x1000) != 0 ? 8 : 2;
  }
  else
  {
    v10 = 0;
  }
  v11 = *(_QWORD *)v1;
  v12 = v10 | 0x10;
  if( (v8 & 0x800) == 0 )
    v12 = v10;
  v13 = (unsigned int)v8;
  if( (v8 & 0x400) != 0 && (v8 & 0x10) == 0 )
  {
    v14 = *(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2512i64);
    v15 = *((_BYTE *)a1 + 24);
    v16 = *(_BYTE *)(v11 + 15) >> 4;
    SigningLevel = 0;
    result = SeGetImageRequiredSigningLevel(FileObject, v12, v15, v16, &SigningLevel);
    if( (int)result < 0 )
    {
      dword_140C4C958 = 14;
      return result;
    }
    v13 = *(unsigned int *)a1;
    if( (v13 & 0x800) == 0 )
    {
      if( *((_BYTE *)a1 + 24) )
      {
        v17 = v26;
        v8 = 1i64;
        if( (v14 & 0x800000) != 0 )
          v17 = 1;
        LODWORD(v26) = v17;
      }
      if( (v14 & 0x1000000) != 0 )
      {
        v2 = 8;
      }
      else
      {
        v2 = 0;
        if( (v14 & 0x2000000) != 0 )
          v2 = 6;
      }
    }
    *((_BYTE *)a1 + 24) = SigningLevel;
  }
  if( (v13 & 0x80000) != 0 )
  {
    v12 |= 0x40000000u;
    if( !*((_BYTE *)a1 + 24) )
      *((_BYTE *)a1 + 24) = 4;
  }
  v18 = v12 | 0x20000000;
  if( (v13 & 0x400000) == 0 )
    v18 = v12;
  if( (v13 & 0x400) != 0 )
  {
    if( (v13 & 0x10) != 0 )
      goto LABEL_47;
    v13 = *(unsigned __int8 *)(v11 + 15);
    LOBYTE(v8) = *((_BYTE *)a1 + 24);
    if( qword_140C1D960 )
    {
      LOBYTE(v9) = (unsigned __int8)v13 >> 4;
      v19 = ((__int64(__fastcall *)(_QWORD, __int64, __int64, _QWORD))qword_140C1D960)(
              v18,
              v8,
              v9,
              ((unsigned int)v13 >> 1) & 7);
      LOBYTE(v8) = *((_BYTE *)a1 + 24);
      LOBYTE(v13) = *(_BYTE *)(v11 + 15);
      if( v19 )
        goto LABEL_47;
    }
    if( !qword_140C1D900
      || (LOBYTE(v13) = (unsigned __int8)v13 >> 4, v20 = qword_140C1D900(v13, v8), v21 = *(_BYTE *)(v11 + 15), !v20)
      || (v18 & 0x40000000) != 0 && (*(_DWORD *)(v1 + 92) & 0xC0000) != 0x80000
      || (v21 & 0xF0) == 0 && *(char *)(*(_QWORD *)(v11 + 56) + 46i64) < 0 )
    {
LABEL_47:
      v21 = *(_BYTE *)(v11 + 15);
      v3 = 1;
    }
    v22 = (int)qword_140C1D900;
    if( qword_140C1D900 )
    {
      LOBYTE(v8) = v2;
      LOBYTE(v13) = v21 >> 4;
      v22 = qword_140C1D900(v13, v8);
    }
    v4 = v22 == 0;
  }
  LODWORD(v24) = v26;
  LODWORD(v23) = v18;
  result = MiValidateSectionSigningPolicy(
             1ui64,
             (UINT64)FileObject,
             v1,
             *((unsigned int *)a1 + 42),
             a1[20],
             v23,
             v3,
             v4,
             v24,
             *((_BYTE *)a1 + 24),
             v2);
  if( (int)result < 0 )
    dword_140C4C958 = 15;
  return result;
}

Referenced by:

No references.