RtlCountRequiredHotPatchAddressTableEntries

__int64 __fastcall RtlCountRequiredHotPatchAddressTableEntries(
        __int64 a1,
        unsigned int a2,
        unsigned int a3,
        _DWORD *a4,
        int *a5,
        char a6,
        int a7,
        int a8,
        _DWORD *a9){
  unsigned __int64 v10; 
  int v12; 
  unsigned int HotPatchSize; 
  int *v14; 
  __int64 v15; 
  int v16; 
  bool v17; 
  int *v18; 
  bool v19; 
  __int64 v20; 
  _BYTE *v21; 
  _BYTE *v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  int v26; 

  v10 = a3;
  v12 = 0;
  HotPatchSize = RtlGetHotPatchSize(a4);
  v14 = a5;
  v15 = HotPatchSize;
  v16 = *a5;
  if( !*a5 )
  {
LABEL_23:
    *a9 = v12;
    return 0i64;
  }
  while( 1 )
  {
    v17 = 0;
    v18 = v14;
    if( a6 )
    {
      if( v16 < 0 )
        v17 = 1;
    }
    else
    {
      v17 = v16 >= 0;
    }
    v19 = 0;
    ++v14;
    if( (v16 & 0xFC000) == 114688 )
      v19 = v17;
    if( v19 )
      break;
    v14 = &v18[(v16 & 0xFFF) * (unsigned int)v15 + 1];
LABEL_22:
    v16 = *v14;
    if( !*v14 )
      goto LABEL_23;
  }
  if( (v16 & 0xFFF) == 0 )
    goto LABEL_22;
  while( 1 )
  {
    v20 = (unsigned int)*v14;
    if( (unsigned int)v20 < 0x10 || (int)v20 + 2 > a2 )
      return 3221225595i64;
    v21 = 0i64;
    v22 = (_BYTE *)(a1 + v20);
    if( (_DWORD)v15 != 2 )
      v21 = v14 + 2;
    LODWORD(v23) = RtlpCheckFunctionPatchAppliedInOriginalImage(v22, v21);
    if( v23 == -1i64 )
      return 3221225595i64;
    if( v23 )
    {
      if( v23 < v25 || v23 - v25 >= v10 )
        return 3221225507i64;
    }
    else
    {
      ++v12;
    }
    v14 = (int *)(v24 + 4 * v15);
    if( v26 == 1 )
      goto LABEL_22;
  }
}

Referenced by:

MiPrepareToHotPatchImage