LdrRelocateImageWithBias

UINT32 __stdcall LdrRelocateImageWithBias(
        PVOID NewAddress,
        LONGLONG AdditionalBias,
        PCCH LoaderName,
        UINT32 Success,
        UINT32 Conflict,
        UINT32 Invalid){
  UINT32 v6; 
  IMAGE_NT_HEADERS *v8; 
  unsigned __int16 Magic; 
  unsigned __int64 ImageBase_high; 
  _IMAGE_BASE_RELOCATION *v11; 
  int v12; 
  DWORD SizeOfBlock; 
  IMAGE_NT_HEADERS *v15; 
  UINT64 Size; 
  v6 = 0;
  LODWORD(Size) = 0;
  v15 = 0i64;
  if( RtlImageNtHeaderEx(1ui64, NewAddress, 0i64, &v15) < 0 )
    return -1073741701;
  v8 = v15;
  Magic = v15->OptionalHeader.Magic;
  if( Magic == 267 )
  {
    ImageBase_high = HIDWORD(v15->OptionalHeader.ImageBase);
  }
  else
  {
    if( Magic != 523 )
      return -1073741701;
    ImageBase_high = v15->OptionalHeader.ImageBase;
  }
  LODWORD(v11) = RtlImageDirectoryEntryToData(NewAddress, 1u, 5u, &Size);
  if( !v11 )
    return(v8->FileHeader.Characteristics & 1) != 0 ? 0xC0000018 : 0;
  v12 = Size;
  if( !(_DWORD)Size )
    return(v8->FileHeader.Characteristics & 1) != 0 ? 0xC0000018 : 0;
  while( 1 )
  {
    SizeOfBlock = v11->SizeOfBlock;
    v12 -= SizeOfBlock;
    v11 = LdrProcessRelocationBlockLongLong(
            v8->FileHeader.Machine,
            (UINT64)NewAddress + v11->VirtualAddress,
            (SizeOfBlock - 8) >> 1,
            (UINT16 *)&v11[1],
            (INT64)NewAddress - ImageBase_high);
    if( !v11 )
      break;
    if( !v12 )
      return v6;
  }
  return -1073741701;
}

Referenced by:

MiMapSystemImageWithLargePage