ST_STORE::StDmpSinglePageRetrieve
__int64 __fastcall ST_STORE::StDmpSinglePageRetrieve(
__int64 a1,
__int64 a2,
__int64 a3,
__int64 a4,
__int64 a5){
unsigned int v5;
char *v7;
int v8;
int v9;
__int64 v10;
int v11;
__int64 v12;
__int16 v13;
int v14;
unsigned int IsCurrentRegion;
unsigned int v16;
char *v17;
char *v18;
__int64 v19;
__int64 v20;
__int64 v22;
__int64 v23;
unsigned __int64 v24;
VOID *v25;
int Payload;
__int64 v27;
VOID *ThreadPtr[10];
unsigned int SystemPagePriority;
v27 = 0i64;
v5 = a4 & 2 | 1;
ThreadPtr[0] = 0i64;
SystemPagePriority = 0;
v7 = 0i64;
v8 = 0;
if( (a4 & 2) != 0 )
{
v10 = *(_QWORD *)(a3 + 16);
}
else
{
v9 = ST_STORE::StDmpSinglePageLookup((__int64 *)a1, a2, a3, &v27);
if( v9 < 0 )
return(unsigned int)v9;
v10 = v27;
}
v11 = *(_DWORD *)v10 & *(_DWORD *)(a1 + 808);
v12 = (unsigned int)(*(_DWORD *)v10 >> *(_DWORD *)(a1 + 812));
if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0 )
{
SystemPagePriority = SmSetThreadSystemPagePriority(ThreadPtr, 0i64, 0i64);
v8 = 1;
}
*(_DWORD *)a5 = *(_DWORD *)v10;
v13 = 4096;
v14 = *(_DWORD *)(v10 + 4) & 0xFFF;
if( v14 )
v13 = v14;
*(_WORD *)(a5 + 4) = v13;
*(_WORD *)(a5 + 6) = (unsigned __int8)*(_WORD *)a3;
if( *(_BYTE *)(a1 + 776) )
{
if( *(_DWORD *)(*(_QWORD *)(a1 + 1016) + 24i64) )
{
*(_DWORD *)(a5 + 8) = *(_DWORD *)(v10 + 12);
*(_DWORD *)(a5 + 12) = *(unsigned __int16 *)(v10 + 6);
}
}
else
{
*(_DWORD *)(a5 + 8) = *(_DWORD *)(v10 + 8);
}
if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0 )
IsCurrentRegion = 8;
else
IsCurrentRegion = ST_STORE::StDmIsCurrentRegion(a1, v12);
v16 = 16 * v11;
if( IsCurrentRegion == 8 )
{
v17 = SMKM_STORE::SmStMapRegion(*(_QWORD *)(a1 + 800), v12, v16, a4, 1u);
v7 = v17;
if( (unsigned __int64)v17 <= 3 )
{
v9 = -1073741550;
if( v17 == (char *)1 )
v9 = -2147483634;
goto LABEL_20;
}
v18 = v17;
}
else
{
v18 = (char *)(*(_QWORD *)(a1 + 16i64 * IsCurrentRegion + 1256) + v16);
}
*(_QWORD *)(a2 + 56) = a3;
v9 = ST_STORE::StDmSinglePageTransfer(
(unsigned int *)a1,
*(void **)(a2 + 16),
(unsigned __int64)v18 | v5,
a4,
*(VOID **)(a3 + 8),
a5,
a2);
if( v9 >= 0 )
v9 = 0;
if( v7 )
{
v20 = *(_QWORD *)(a1 + 800);
if( (*(_BYTE *)(v20 + 6021) & 4) != 0 )
{
SMKM_STORE::SmStUnmapVirtualRegion(v20, v12, v19, v20, Payload, 0);
}
else
{
v22 = *(_QWORD *)(v20 + 6216);
v23 = *(_QWORD *)(v22 + 8 * v12);
v24 = v23 & 0xFFFFFFFFFFFFFFFEui64;
v25 = (VOID *)(v23 & 0xFFFFFFFFFFFFFFF8ui64);
*(_QWORD *)(v22 + 8 * v12) = v24;
if( (v24 & 3) == 0 )
SmFpFree((_SM_FORWARD_PROGRESS_CTX *)(v20 + 6608), SmFpResourceMapping, KeGetCurrentThread(), v25);
}
}
LABEL_20:
if( v8 )
SmSetThreadSystemPagePriority(ThreadPtr, SystemPagePriority, 1ui64);
return(unsigned int)v9;
}
Referenced by:
No references.