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