PopReadPagesFromHiberFile

INT64 __fastcall PopReadPagesFromHiberFile(UINT64 a1, UINT64 a2, PVOID *a3){
  _MDL *v4; 
  char v5; 
  unsigned __int64 v6; 
  ULONG v7; 
  signed int Status; 
  unsigned __int128 v9; 
  UINT64 v10; 
  UINT64 v11; 
  UINT64 v12; 
  void *PoolWithTag; 
  _MDL *Mdl; 
  signed int v15; 
  UINT64 a3a; 
  union _LARGE_INTEGER StartingOffset; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  struct _KEVENT Event; 
  a3a = 0i64;
  memset(&Event, 0, sizeof(Event));
  IoStatusBlock = 0i64;
  v4 = 0i64;
  v5 = 0;
  if( !*(&PopCapabilities + 8)
    || (unsigned __int64)(*(_QWORD *)&PopHiberInfo - 1i64) > 0xFFFFFFFFFFFFFFFDui64
    || (unsigned __int64)(*(_QWORD *)FileObject - 1i64) > 0xFFFFFFFFFFFFFFFDui64
    || qword_140C23450 < 0x1000 )
  {
    Status = -1073741637;
    goto LABEL_26;
  }
  v6 = (unsigned __int64)(unsigned int)a2 << 12;
  v7 = -1;
  if( v6 <= 0xFFFFFFFF )
    v7 = (_DWORD)a2 << 12;
  Status = v6 > 0xFFFFFFFF ? 0xC0000095 : 0;
  if( v6 <= 0xFFFFFFFF )
  {
    StartingOffset.QuadPart = 0i64;
    v9 = (unsigned int)a1 * (unsigned __int128)0x1000u;
    v10 = -1i64;
    if( (v9 & 0x8000000000000000ui64) == 0i64 )
    {
      if( !*((_QWORD *)&v9 + 1) )
      {
LABEL_13:
        v10 = v9;
        StartingOffset.QuadPart = v9;
        Status = 0;
        goto LABEL_14;
      }
    }
    else if( *((_QWORD *)&v9 + 1) == -1i64 )
    {
      goto LABEL_13;
    }
    StartingOffset.QuadPart = -1i64;
    Status = -1073741675;
LABEL_14:
    if( Status >= 0 )
    {
      Status = RtlLongLongAdd(v10, v7, &a3a);
      if( Status >= 0 )
      {
        if( a3a <= v11 )
        {
          PoolWithTag = ExAllocatePoolWithTag(PagedPool, v12, 0x206D654Dui64);
          *a3 = PoolWithTag;
          if( PoolWithTag )
          {
            Mdl = IoAllocateMdl(PoolWithTag, v7, 0, 0, 0i64);
            v4 = Mdl;
            a3a = (UINT64)Mdl;
            if( Mdl )
            {
              MmProbeAndLockPages(Mdl, 0, IoReadAccess);
              v5 = 1;
              KeInitializeEvent(&Event, NotificationEvent, 0);
              IoPageRead((_FILE_OBJECT *)FileObject, v4, &StartingOffset, &Event, &IoStatusBlock);
              Status = v15;
              if( v15 == 259 )
              {
                Status = KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
                if( Status >= 0 )
                  Status = IoStatusBlock.Status;
              }
            }
            else
            {
              Status = -1073741670;
            }
          }
          else
          {
            Status = -1073741801;
          }
        }
        else
        {
          Status = -1073741807;
        }
      }
    }
  }
LABEL_26:
  if( v5 )
    MmUnlockPages(v4);
  if( v4 )
    IoFreeMdl(v4);
  if( Status < 0 && *a3 )
  {
    ExFreePoolWithTag(*a3, 0x206D654Du);
    *a3 = 0i64;
  }
  return(unsigned int)Status;
}

Referenced by:

PopPowerInformationInternal
PopReadResumeContext