SMKM_STORE::SmStMapVirtualRegion
__int64 __fastcall SMKM_STORE::SmStMapVirtualRegion(
__int64 a1,
unsigned int a2,
unsigned int a3,
__int64 a4,
unsigned int a5){
int v7;
__int64 *v8;
_ETHREAD *CurrentThread;
__int64 v10;
UINT64 v11;
__int64 v12;
signed __int16 v14;
int v15;
signed __int16 v16;
bool v17;
signed __int16 v18;
v7 = 0;
v8 = (__int64 *)(*(_QWORD *)(a1 + 6216) + 8i64 * a2);
if( (a5 & 0x40) == 0
|| (CurrentThread = (_ETHREAD *)KeGetCurrentThread(),
v7 = 1,
--CurrentThread->Tcb.SpecialApcDisable,
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 6024), 0i64),
(*v8 & 0x7FFFFFFFFFFF0000i64) != 0) )
{
v11 = *(unsigned int *)(a1 + 6208);
v12 = *v8 & 0x7FFFFFFFFFFF0000i64;
if( (a5 & 8) != 0 )
{
v10 = 0i64;
if( (*(_WORD *)v8 & 0x4000) != 0 )
{
*(_WORD *)v8 &= ~0x4000u;
}
else if( !(unsigned int)SMKM_STORE::SmStCheckLockInProgressRegionComplete(a1, (__int64)v8, 0) )
{
v10 = 3i64;
}
LABEL_14:
if( !v7 )
return v10;
goto LABEL_15;
}
if( (a5 & 0x10) != 0 )
{
v10 = SMKM_STORE::SmStLockVirtualRegion(a1, a2, v8, *v8 & 0x7FFFFFFFFFFF0000i64, a5);
goto LABEL_14;
}
if( (a5 & 4) != 0 )
{
_InterlockedOr16((volatile signed __int16 *)v8, 0x8000u);
}
else
{
v10 = 2i64;
if( (a5 & 2) == 0 )
{
v14 = *(_WORD *)v8;
if( (*(_WORD *)v8 & 0x1FFF) == 0x1FFF )
{
LABEL_30:
v10 = 1i64;
goto LABEL_14;
}
while( 1 )
{
v15 = 0;
v16 = v14 ^ (v14 ^ (v14 + 1)) & 0x1FFF;
if( (v14 & 0x1FFF) == 0 && *v8 >= 0 )
{
v15 = SmAcquireReleaseCharges(v11, 1ui64, 0i64);
if( !v15 )
{
if( KeGetCurrentThread() != *(struct _KTHREAD **)(a1 + 6488) )
goto LABEL_14;
v16 = v16 & 0xC000 | 0x2000;
}
}
v18 = _InterlockedCompareExchange16((volatile signed __int16 *)v8, v16, v14);
v17 = v14 == v18;
v14 = v18;
if( v17 )
break;
if( v15 )
SmAcquireReleaseCharges(v11, 1ui64, 1ui64);
if( (v14 & 0x1FFF) == 0x1FFF )
goto LABEL_30;
}
}
}
v10 = v12 + a3;
goto LABEL_14;
}
v10 = 0i64;
LABEL_15:
if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 6024), 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 6024));
KeAbPostRelease((VOID *)(a1 + 6024));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
return v10;
}
Referenced by:
No references.