HalpBlkAllocateAndShadowMemory

INT64 __stdcall HalpBlkAllocateAndShadowMemory(VOID *Src, INT64 a2){
  int v2; 
  int v3; 
  __int64 v4; 
  UINT8 *v6; 
  INT64 v7; 
  UINT8 *v8; 
  INT64 v10; 
  INT64 *v11; 
  v3 = v2;
  v4 = (unsigned int)a2;
  v6 = 0i64;
  v7 = HalpAllocPhysicalMemory(HalpMmLoaderBlock, 0i64);
  if( v7 )
  {
    if( v11 )
      *v11 = v7;
    v8 = (UINT8 *)HalpMap((LARGE_INTEGER)v7, (MEMORY_CACHING_TYPE)v4, 1u);
    v6 = v8;
    if( v8 )
    {
      if( Src )
      {
        memmove(v8, (UINT8 *)Src, v4 << 12);
      }
      else
      {
        memset((INT64)v8, 0i64);
        Src = v6;
      }
      if( (_DWORD)v4 )
      {
        while( 1 )
        {
          LODWORD(v10) = v3;
          if( (int)HalpBlkAddVirtualMapping(HalpBlkRootPageTablePa, v7, (UINT64)Src, 1i64, v10) < 0 )
            break;
          v7 += 4096i64;
          Src = (char *)Src + 4096;
          LODWORD(v4) = v4 - 1;
          if( !(_DWORD)v4 )
            return(INT64)v6;
        }
        return 0i64;
      }
    }
  }
  return(INT64)v6;
}

Referenced by:

HalpBlkAllocateShadowCodePages
HalpBlkAllocateShadowData