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.