PoSetHiberRange

VOID __stdcall PoSetHiberRange(VOID *MemoryMap, UINT64 Flags, VOID *Address, UINT64 Length, UINT64 Tag){
  unsigned int v5; 
  _POP_HIBER_CONTEXT *v6; 
  void *v7; 
  int v8; 
  UINT64 v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  unsigned __int64 v14; 
  UINT64 v15; 
  UINT64 v16; 
  __int64 SizeofSection[9]; 
  _POP_HIBER_CONTEXT *HiberContext; 
  UINT64 StartPage; 

  StartPage = (UINT64)Address;
  HiberContext = (_POP_HIBER_CONTEXT *)MemoryMap;
  v5 = Flags;
  v6 = (_POP_HIBER_CONTEXT *)MemoryMap;
  LODWORD(SizeofSection[0]) = 0;
  if( (KiBugCheckActive & 3) != 0 )
    return;
  if( MemoryMap )
  {
    v8 = Flags & 0x10000;
    if( (Flags & 0x10000) != 0 )
      goto LABEL_28;
  }
  else
  {
    v6 = (_POP_HIBER_CONTEXT *)::HiberContext;
    HiberContext = (_POP_HIBER_CONTEXT *)::HiberContext;
    if( !::HiberContext )
      KeBugCheckEx(0xA0u, (PVOID)0x10B, (PVOID)0xA, 0i64, 0i64);
    v7 = (void *)*((unsigned int *)::HiberContext + 46);
    if( (_DWORD)v7 != 8 )
    {
      if( (_DWORD)v7 != 9 )
        KeBugCheckEx(0xA0u, (PVOID)0x10B, (PVOID)0xA, v7, 0i64);
      return;
    }
    if( (Flags & 0xFFFFBFFF) != 0x10000 || !Length && (Flags & 0x4000) != 0 )
LABEL_28:
      KeBugCheckEx(0xA0u, (PVOID)0x10C, (PVOID)0xA, (PVOID)(unsigned int)Flags, 0i64);
    v8 = Flags & 0x10000;
  }
  if( !Length )
  {
    if( v8 )
    {
      MmMarkImageForHiberPhase((VOID *)StartPage);
      return;
    }
    if( MmGetSectionRange((VOID *)StartPage, (VOID **)&StartPage, (UINT64 *)SizeofSection) < 0 )
      KeBugCheckEx(0xA0u, (PVOID)2, (PVOID)0xA11A7, 0i64, 0i64);
    Length = LODWORD(SizeofSection[0]);
  }
  if( (v5 & 4) != 0 )
    v5 = v5 & 0xFFFFFFF9 | 2;
  if( (v5 & 0x4000) != 0 )
  {
    LODWORD(v16) = Tag;
    PopSetRange(v6, v5 & 0xFFFFBFFF, StartPage, Length, v16);
  }
  else
  {
    v9 = StartPage >> 12;
    v10 = (Length + StartPage + 4095) >> 12;
    while( v9 < v10 )
    {
      LODWORD(v14) = MmGetPhysicalAddress(v9 << 12);
      v13 = v9 + 1;
      v15 = v14 >> 12;
      v12 = 1i64;
      if( v9 + 1 < v10 )
      {
        do
        {
          LODWORD(v11) = MmGetPhysicalAddress((v9 << 12) + (v12 << 12));
          if( v13 + v15 - v9 != v11 >> 12 )
            break;
          ++v12;
          ++v13;
        }
        while( v13 < v10 );
        v6 = HiberContext;
      }
      LODWORD(v16) = Tag;
      PopSetRange(v6, v5, v15, v12, v16);
      v9 += v12;
    }
  }
}

Referenced by:

BgkResumePrepare
BgpFwMarkHiberPhase
HaliLocateHiberRanges
HalpDmaMarkHiberAdapter
HalpExtEnvMarkHiberRegions
HalpIommuDmarPageTableMarkHiberPhase
HalpIommuExtMarkHiberMemory
HalpIommuMarkHiberPhase
HalpMmAllocCtxMarkHiberPhase
HalpPciMarkHiberPhase
HalpTimerMarkHiberPhase
HvlDiscardPagesFromHibernation
HvlDiscardSecurePagesFromHibernation
HvlpMarkHvlPagesForHibernation
HvlpMarkHypervisorPagesForHibernation
IoGetDumpHiberRanges
KdMarkHiberPhase
KeMarkHiberPhase
MiGatherHiberRange
MiMarkHiberNotCachedPte
MiMarkKernelPageTablePte
MiMarkNonPagedHiberPhasePte
MmMarkHiberPhase
MmMarkHiberRange
PopAllocateHiberContext
PopBuildMemoryImageHeader
PopHiberInitializeResources
PopMarkComponentsBootPhase
PopMarkHiberPhase
RtlMarkHiberPhase
VslAllocateSecureHibernateResources