SMKM_STORE::SmStUnmapVirtualRegion
void __fastcall SMKM_STORE::SmStUnmapVirtualRegion(
__int64 a1,
unsigned int a2,
__int64 a3,
__int64 a4,
int a5,
unsigned int a6){
__int64 v6;
INT64 *v7;
UINT64 v8;
__int64 v9;
int v11;
__int64 v12;
_ETHREAD *CurrentThread;
MDL **VirtualLockedRegion;
unsigned __int16 v15;
v6 = *(_QWORD *)(a1 + 6216);
v7 = (INT64 *)(a1 + 6024);
v8 = *(unsigned int *)(a1 + 6208);
v9 = a2;
v11 = 0;
v12 = *(_QWORD *)(v6 + 8i64 * a2) & 0x7FFFFFFFFFFF0000i64;
if( (a6 & 8) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = 1;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx(a1 + 6024, 0i64);
}
if( (a6 & 4) != 0 )
{
if( *(__int64 *)(v6 + 8 * v9) >= 0 )
{
VirtualLockedRegion = (MDL **)SMKM_STORE::SmStFindVirtualLockedRegion(a1, (a6 >> 4) & 7, v12);
SmKmUnlockMdl(*VirtualLockedRegion, *(_QWORD *)(a1 + 6480), a1 + 6360);
SmFpFree(*(_QWORD *)(a1 + 6480), 2i64, a1 + 6360, (INT64)*VirtualLockedRegion);
*VirtualLockedRegion = 0i64;
}
goto LABEL_16;
}
if( (a6 & 2) != 0 )
{
v15 = 0x7FFF;
LABEL_8:
_InterlockedAnd16((volatile signed __int16 *)(v6 + 8 * v9), v15);
goto LABEL_16;
}
if( (a6 & 1) != 0 )
goto LABEL_16;
if( (*(_WORD *)(v6 + 8 * v9) & 0x2000) != 0 && KeGetCurrentThread() == *(struct _KTHREAD **)(a1 + 6488) )
{
v15 = -8193;
goto LABEL_8;
}
if( (_InterlockedDecrement16((volatile signed __int16 *)(v6 + 8 * v9)) & 0x1FFF) == 0
&& *(__int64 *)(v6 + 8 * v9) >= 0 )
{
SmAcquireReleaseCharges(v8, 1ui64, 1ui64);
}
LABEL_16:
if( v11 )
{
if( _InterlockedCompareExchange64(v7, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v7);
KeAbPostRelease(v7);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
Referenced by:
No references.