SMKM_STORE::SmStUnmapVirtualRegion
void __fastcall SMKM_STORE::SmStUnmapVirtualRegion(
__int64 a1,
unsigned int a2,
__int64 a3,
__int64 a4,
int a5,
unsigned int a6){
__int64 v6;
_EX_PUSH_LOCK *v7;
UINT64 v8;
__int64 v9;
int v11;
__int64 v12;
_ETHREAD *CurrentThread;
PMDL *VirtualLockedRegion;
unsigned __int16 v15;
v6 = *(_QWORD *)(a1 + 6216);
v7 = (_EX_PUSH_LOCK *)(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;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 6024), 0i64);
}
if( (a6 & 4) != 0 )
{
if( *(__int64 *)(v6 + 8 * v9) >= 0 )
{
VirtualLockedRegion = (PMDL *)SMKM_STORE::SmStFindVirtualLockedRegion(a1, (a6 >> 4) & 7, v12);
SmKmUnlockMdl(*VirtualLockedRegion, *(_SM_FORWARD_PROGRESS_CTX **)(a1 + 6480), (VOID *)(a1 + 6360));
SmFpFree(
*(_SM_FORWARD_PROGRESS_CTX **)(a1 + 6480),
SmFpResourceLockMdl,
(VOID *)(a1 + 6360),
*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->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v7);
KeAbPostRelease(v7);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
Referenced by:
No references.