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.