PopReadPagesFromHiberFile

NTSTATUS __stdcall PopReadPagesFromHiberFile(UINT64 a1, UINT64 a2, _XSTATE_FEATURE *a3){
  PVOID *v3; 
  _MDL *v4; 
  char v5; 
  unsigned __int64 v6; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned __int64 v9; 
  signed int Status; 
  UINT64 QuadPart; 
  __int64 v12; 
  _LARGE_INTEGER v13; 
  UINT64 v14; 
  UINT64 v15; 
  VOID **PoolWithTag; 
  VOID *v17; 
  _MDL *Mdl; 
  PMDL v19; 
  UINT64 v21; 
  _LARGE_INTEGER StartingOffset; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  __int128 Object; 
  __int64 v25; 

  v3 = (PVOID *)a3;
  v21 = 0i64;
  Object = 0i64;
  v25 = 0i64;
  IoStatusBlock = 0i64;
  v4 = 0i64;
  v5 = 0;
  if( !*(&stru_140C23628 + 2080)
    || (unsigned __int64)(*(_QWORD *)&PopHiberInfo - 1i64) > 0xFFFFFFFFFFFFFFFDui64
    || (char *)FileObject - 1 > (char *)0xFFFFFFFFFFFFFFFDi64
    || (a3 = (_XSTATE_FEATURE *)4096, (unsigned __int64)qword_140C23450 < 0x1000) )
  {
    Status = -1073741637;
    goto LABEL_26;
  }
  v6 = (unsigned __int64)(unsigned int)a2 << 12;
  a2 = 0xFFFFFFFFi64;
  v7 = -1;
  if( v6 <= 0xFFFFFFFF )
    v7 = v8;
  Status = v9 > 0xFFFFFFFF ? 0xC0000095 : 0;
  if( v9 <= 0xFFFFFFFF )
  {
    StartingOffset.QuadPart = 0i64;
    *(_OWORD *)(&a2 - 1) = (unsigned int)a1 * (unsigned __int128)0x1000u;
    QuadPart = -1i64;
    if( v12 >= 0 )
    {
      if( !a2 )
      {
LABEL_13:
        QuadPart = v13.QuadPart;
        StartingOffset = v13;
        Status = 0;
        goto LABEL_14;
      }
    }
    else if( a2 == -1i64 )
    {
      goto LABEL_13;
    }
    StartingOffset.QuadPart = -1i64;
    Status = -1073741675;
LABEL_14:
    if( Status >= 0 )
    {
      Status = RtlLongLongAdd(QuadPart, v7, &v21);
      if( Status >= 0 )
      {
        if( v21 <= v14 )
        {
          PoolWithTag = ExAllocatePoolWithTag(1ui64, v15, 544040269i64);
          *v3 = PoolWithTag;
          if( PoolWithTag )
          {
            Mdl = IoAllocateMdl(v17, v7, 0, 0, 0i64);
            v4 = Mdl;
            v21 = (UINT64)Mdl;
            if( Mdl )
            {
              MmProbeAndLockPages(v19, 0, IoReadAccess);
              v5 = 1;
              KeInitializeEvent((INT64)&Object, 0, 0);
              Status = IoPageRead((_FILE_OBJECT *)FileObject, v4, &StartingOffset, (_KEVENT *)&Object, &IoStatusBlock);
              if( Status == 259 )
              {
                Status = KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
                if( Status >= 0 )
                  Status = IoStatusBlock.Status;
              }
            }
            else
            {
              Status = -1073741670;
            }
          }
          else
          {
            Status = -1073741801;
          }
        }
        else
        {
          Status = -1073741807;
        }
      }
    }
  }
LABEL_26:
  if( v5 )
    MmUnlockPages((INT64)v4, a2, (INT64)a3);
  if( v4 )
    IoFreeMdl(v4);
  if( Status < 0 && *v3 )
  {
    ExFreePoolWithTag(*v3, 0x206D654Du);
    *v3 = 0i64;
  }
  return Status;
}

Referenced by:

PopPowerInformationInternal
PopReadResumeContext