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