HalpBlkAllocateAndShadowMemory

UINT64 __stdcall HalpBlkAllocateAndShadowMemory(UINT64 a3, UINT64 NumberPages, INT64 r8, INT64 a4, INT64 *a5){
  int v5; 
  _MEMORY_CACHING_TYPE v6; 
  UINT64 v8; 
  INT64 v9; 
  VOID *v10; 
  size_t v11; 
  UINT64 Protection; 
  INT64 Protectiona; 

  v5 = a4;
  v6 = (int)NumberPages;
  v8 = 0i64;
  v9 = HalpAllocPhysicalMemory(LoaderBlock, 0i64, (unsigned int)NumberPages, 0i64);
  if( v9 )
  {
    if( a5 )
      *a5 = v9;
    LODWORD(Protection) = 4;
    v10 = (VOID *)HalpMap((_LARGE_INTEGER)v9, v6, MmCached, 0, Protection);
    v8 = (UINT64)v10;
    if( v10 )
    {
      v11 = v6 << 12;
      if( a3 )
      {
        memmove(v10, (const VOID *)a3, v11);
      }
      else
      {
        memset(v10, 0i64, v11);
        a3 = v8;
      }
      if( v6 )
      {
        while( 1 )
        {
          LODWORD(Protectiona) = v5;
          if( HalpBlkAddVirtualMapping(*(&CmpDummyThreadEvent + 488), v9, a3, 1i64, Protectiona) < 0 )
            break;
          v9 += 4096i64;
          a3 += 4096i64;
          if( --v6 == MmNonCached )
            return v8;
        }
        return 0i64;
      }
    }
  }
  return v8;
}

Referenced by:

HalpBlkAllocateShadowCodePages
HalpBlkAllocateShadowData