RtlCreateRetpolineStubsFunctionTable

INT64 __fastcall RtlCreateRetpolineStubsFunctionTable(INT64 a1, _DWORD *a2, UINT64 a3){
  INT64 v3; 
  _DWORD *RetpolineStubsFunctionTable; 
  INT64 result; 
  int v7; 
  int v8; 
  int *v9; 
  __int64 v10; 
  int v11; 
  int v12; 
  int v13; 
  INT64 a5; 
  HIDWORD(a5) = HIDWORD(a1);
  v3 = PsNtosImageBase;
  LODWORD(a5) = 0;
  RetpolineStubsFunctionTable = (_DWORD *)RtlpGetRetpolineStubsFunctionTable(
                                            (VOID *)PsNtosImageBase,
                                            PsNtosImageBase,
                                            (INT64)a2,
                                            (unsigned int)a3,
                                            &a5);
  if( !RetpolineStubsFunctionTable )
    return 3221226021i64;
  v7 = a5;
  if( (unsigned int)a5 > 0x32 )
    return 2147483653i64;
  v8 = (_DWORD)a2 + *a2;
  if( (_DWORD)a5 )
  {
    v9 = &dword_140E01A74;
    v10 = (unsigned int)a5;
    do
    {
      v11 = v3 + RetpolineStubsFunctionTable[1];
      *(v9 - 1) = v3 + *RetpolineStubsFunctionTable - (_DWORD)a2;
      *v9 = v11 - (_DWORD)a2;
      v9[1] = v8 - (_DWORD)a2;
      v12 = RtlCalculateUnwindInfoSizeForRetpoline(v3, (INT64)RetpolineStubsFunctionTable, 0i64);
      v9 += 3;
      v8 = v12 + v13;
      RetpolineStubsFunctionTable += 3;
      --v10;
    }
    while( v10 );
  }
  RtlRetpolineStubsFunctionTableSize = 12 * v7;
  dword_140C00E90 = 12 * v7;
  result = 0i64;
  qword_140C00E88 = (__int64)RtlRetpolineStubsFunctionTable;
  return result;
}

Referenced by:

MiInitializeRetpoline