MiCreateRetpolineRelocationInformation

INT64 __fastcall MiCreateRetpolineRelocationInformation(INT64 a1, INT64 a2, UINT64 a3, _QWORD *a4){
  unsigned int v4; 
  int v5; 
  unsigned int v6; 
  unsigned int v8; 
  _QWORD *v10; 
  _QWORD *v11; 
  int v12; 
  CHAR *v13; 
  int RetpolineRelocationInformation; 
  int v15; 
  UINT64 v17; 
  UINT64 v18; 
  v4 = a3;
  v5 = a2;
  v6 = (unsigned int)a3 >> 12;
  v8 = 8 * ((unsigned int)a3 >> 12);
  LODWORD(v10) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
  v11 = v10;
  if( v10 )
  {
    v12 = 4 * (*(_DWORD *)(a1 + 4) + 3 * v6);
    LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
    v11[6] = v13;
    if( v13 )
    {
      LODWORD(v18) = v8;
      LODWORD(v17) = v12;
      RetpolineRelocationInformation = RtlCreateRetpolineRelocationInformation(
                                         v4,
                                         *(unsigned int *)(a1 + 4),
                                         *(_QWORD *)(a1 + 8),
                                         *(_QWORD *)(a1 + 16),
                                         *(_QWORD *)(a1 + 24),
                                         v13,
                                         v17,
                                         (INT64)(v11 + 7),
                                         v18);
      if( RetpolineRelocationInformation >= 0 )
      {
        *((_DWORD *)v11 + 2) = *(_DWORD *)a1;
        v15 = dword_140C4C9F0 + 4095;
        *((_DWORD *)v11 + 1) = v5;
        *(_DWORD *)v11 = ((v4 + 4095) & 0xFFFFF000) + (v15 & 0xFFFFF000);
        *a4 = v11;
        v11 = 0i64;
        RetpolineRelocationInformation = 0;
      }
    }
    else
    {
      RetpolineRelocationInformation = -1073741670;
    }
    if( v11 )
      MiFreeRetpolineRelocationInformation(v11);
  }
  else
  {
    return(unsigned int)-1073741670;
  }
  return(unsigned int)RetpolineRelocationInformation;
}

Referenced by:

MiCaptureBootDriverRetpolineInfo
MiParseImageLoadConfig