SMKM_STORE_MGR::SmFeAddInitiate

__int64 __fastcall SMKM_STORE_MGR::SmFeAddInitiate(
        __int64 a1,
        _DWORD *a2,
        int er8_0,
        unsigned int a4,
        unsigned __int64 a5,
        __int64 *a6,
        char a7){
  __int16 v9; 
  unsigned int v10; 
  int v11; 
  volatile signed __int64 *v12; 
  int v13; 
  _ETHREAD *CurrentThread; 
  int v16; 
  __int64 v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  int v22; 
  int v23; 
  int v24; 
  _ETHREAD *v25; 
  __int64 SessionId; 
  unsigned __int8 v27; 
  int v28; 
  bool v29; 
  __int64 v30; 
  _KLOCK_ENTRY *v31; 
  __int64 v32; 
  __int64 v33; 
  _ETHREAD *v34; 
  _ETHREAD *v35; 
  unsigned int v36; 
  unsigned __int8 v37; 
  int v38; 
  __int64 v39; 
  _KLOCK_ENTRY *v40; 
  __int64 v41; 
  NTSTATUS v42; 
  _ETHREAD *v43; 
  NTSTATUS v44; 
  _EX_PUSH_LOCK *v45; 
  unsigned int v46; 
  unsigned int v47; 
  UINT64 v48; 
  int v49; 
  int v50; 
  char a3[12]; 
  int v52; 
  unsigned int v53; 
  _LARGE_INTEGER v54; 
  __int128 v55; 
  __int16 Object; 
  char v57; 
  int v58; 
  __int64 v59[2]; 
  _DWORD *v60; 
  __int64 *v61; 
  unsigned __int64 v62; 
  __int64 v63[3]; 
  int v64; 
  int v65; 
  __int64 v66; 
  char v67[136]; 

  v62 = a5;
  v49 = er8_0;
  v9 = a4;
  v60 = a2;
  v61 = a6;
  v53 = a4;
  memset(v67, 0i64, 0x80u);
  v10 = *a2;
  *(_QWORD *)&a3[4] = 0x1000000000000i64;
  v11 = a7 & 2;
  *(_WORD *)&a3[8] = v9;
  v47 = 0;
  v12 = (volatile signed __int64 *)(a1 + 440);
  v54.QuadPart = 0i64;
  v13 = 0;
  v63[1] = 0i64;
  v63[2] = 0i64;
  v66 = 0i64;
  v63[0] = (__int64)v67;
  v64 = 0;
  v65 = 8;
  v52 = v11;
  if( (a7 & 2) != 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.SpecialApcDisable;
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 440), 0i64);
    v47 = 2;
  }
  else if( (a7 & 4) != 0 )
  {
    if( !(unsigned int)StLockTryAcquireExclusive((VOID *)(a1 + 440), &v47) )
      return 3221225557i64;
  }
  else
  {
    v34 = (_ETHREAD *)KeGetCurrentThread();
    --v34->Tcb.SpecialApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 440), 0i64);
    v47 = 1;
  }
  v16 = -1073740682;
  while( 1 )
  {
    B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
      a1 + 448,
      v10,
      (__int64)v63);
    v55 = 0i64;
    B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorFromSearchResult(
      v17,
      (__int64)&v55,
      (__int64)v63);
    if( !(_QWORD)v55 )
      break;
    v20 = *((_QWORD *)&v55 + 1) + 8i64;
    v21 = (unsigned __int16)*(_DWORD *)v55 + 2i64;
    *((_QWORD *)&v55 + 1) = v20;
    if( v20 >= (__int64)v55 + 8 * v21 )
    {
      v33 = *(_QWORD *)(v55 + 8);
      if( v33 )
      {
        *(_QWORD *)&v55 = *(_QWORD *)(v55 + 8);
        *((_QWORD *)&v55 + 1) = v33 + 16;
      }
      v20 = (v33 + 16) & -(__int64)(v33 != 0);
    }
    if( !v20 || v18 < *(_DWORD *)v20 && v19 < *(_DWORD *)v20 )
      break;
    if( (*(_BYTE *)(v20 + 7) & 1) != 0 )
    {
      v16 = -1073740747;
      goto LABEL_38;
    }
    if( v13 || (a7 & 1) == 0 )
      goto LABEL_38;
    Object = 0;
    v59[1] = (__int64)v59;
    v59[0] = (__int64)v59;
    *(_QWORD *)(a1 + 1656) = &Object;
    v57 = 6;
    v58 = 0;
    *(_DWORD *)(a1 + 1648) = v10;
    if( v11 )
    {
      if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 440));
      KeAbPostRelease((VOID *)(a1 + 440));
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
    else
    {
      if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 440));
      LODWORD(v48) = 0;
      v35 = (_ETHREAD *)KeGetCurrentThread();
      v36 = MiGetSystemRegionType(a1 + 440) == 1 ? MmGetSessionIdEx(v35->Tcb.ApcState.Process) : -1;
      --v35->Tcb.SpecialApcDisable;
      v37 = ++v35->Tcb.AbAllocationRegionCount;
      v38 = ((char)v35->Tcb.AbEntrySummary | (char)v35->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
      while( 1 )
      {
        v29 = !_BitScanReverse((unsigned int *)&v39, v38);
        HIDWORD(v48) = v39;
        if( v29 )
          goto LABEL_66;
        v40 = &v35->Tcb.LockEntries[v39];
        v38 &= ~(1 << v39);
        if( (v40->AcquiredByte & 1) != 0
          && (v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
          && (v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)v12 & 0x7FFFFFFFFFFFFFFCi64)
          && v40->LockState.SessionId == v36 )
        {
          v40->AcquiredByte &= ~1u;
          if( v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
            break;
        }
      }
      if( !v40 )
      {
LABEL_66:
        if( (*(&v35->Tcb.MiscFlags + 1) & 0x10000) == 0 )
          KeBugCheckEx(0x162u, v35, (PVOID)(a1 + 440), (PVOID)v36, 0i64);
        goto LABEL_78;
      }
      v40->CrossThreadReleasableAndBusyByte |= 2u;
      if( v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
        KiAbEntryRemoveFromTree(v40);
      LODWORD(v48) = 0;
      LODWORD(v48) = v40->BoostBitmap.AllFields & 0x1FFFF;
      v40->BoostBitmap.AllFields &= 0xFFFE0000;
      v40->ThreadLocalFlags &= ~1u;
      v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
      v41 = v40 - v35->Tcb.LockEntries;
      if( v37 == 1 )
        v35->Tcb.AbEntrySummary |= 1 << v41;
      else
        _InterlockedOr8((volatile signed __int8 *)&v35->Tcb.AbOrphanedEntrySummary, 1 << v41);
LABEL_78:
      --v35->Tcb.AbAllocationRegionCount;
      KiAbThreadRemoveBoosts(&v35->Tcb, (VOID *)(a1 + 440), &v48);
      v29 = v35->Tcb.SpecialApcDisable++ == -1;
      if( v29 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v35->Tcb.ApcState.ApcListHead[0].Flink != &v35->Tcb.152 )
        KiCheckForKernelApcDelivery();
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
      v11 = v52;
    }
    v54.QuadPart = -2500000i64;
    v42 = KeWaitForSingleObject((UINT64)&Object, 26, 0, 0, (INT64)&v54);
    v43 = (_ETHREAD *)KeGetCurrentThread();
    v44 = v42;
    --v43->Tcb.SpecialApcDisable;
    v45 = (_EX_PUSH_LOCK *)(a1 + 440);
    if( v11 )
    {
      ExAcquirePushLockSharedEx(v45, 0i64);
      v46 = 2;
    }
    else
    {
      ExAcquirePushLockExclusiveEx(v45, 0i64);
      v46 = 1;
    }
    v47 = v46;
    *(_QWORD *)(a1 + 1656) = 0i64;
    if( v44 )
      goto LABEL_38;
    v13 = 1;
  }
  if( v11 )
  {
    v16 = 0;
  }
  else
  {
    v22 = 0;
    while( 1 )
    {
      *(_DWORD *)&a3[4] = v10;
      v23 = B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
              a1 + 448,
              v10,
              (__int64)v63);
      v16 = v23;
      if( v23 == -1073741275 )
      {
        v16 = B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeInsertEx(
                (int **)(a1 + 448),
                (UINT64)v63,
                &a3[4]);
      }
      else if( v23 >= 0 )
      {
        v16 = -1073741484;
      }
      if( v16 < 0 )
        break;
      if( ++v22 == v49 )
      {
        SMKM_STORE_MGR::SmIoCtxQueueWork(v61, a1, v53, v62);
        v16 = 0;
        goto LABEL_17;
      }
      ++v10;
    }
    if( v22 )
      SMKM_STORE_MGR::SmFeAddComplete(a1, (_DWORD)v60, v22, v24, 2);
  }
LABEL_38:
  if( v11 )
  {
    if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 440));
    KeAbPostRelease((VOID *)(a1 + 440));
  }
  else
  {
LABEL_17:
    if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 440));
    *(_DWORD *)a3 = 0;
    v25 = (_ETHREAD *)KeGetCurrentThread();
    if( MiGetSystemRegionType(a1 + 440) == 1 )
      SessionId = (unsigned int)MmGetSessionIdEx(v25->Tcb.ApcState.Process);
    else
      SessionId = 0xFFFFFFFFi64;
    --v25->Tcb.SpecialApcDisable;
    v27 = ++v25->Tcb.AbAllocationRegionCount;
    v28 = ((char)v25->Tcb.AbEntrySummary | (char)v25->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
    while( 1 )
    {
      v29 = !_BitScanReverse((unsigned int *)&v30, v28);
      v50 = v30;
      if( v29 )
        break;
      v31 = &v25->Tcb.LockEntries[v30];
      v28 &= ~(1 << v30);
      if( (v31->AcquiredByte & 1) != 0
        && (v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
        && (v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)v12 & 0x7FFFFFFFFFFFFFFCi64)
        && v31->LockState.SessionId == (_DWORD)SessionId )
      {
        v31->AcquiredByte &= ~1u;
        if( v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
        {
          if( v31 )
          {
            v31->CrossThreadReleasableAndBusyByte |= 2u;
            if( v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
              KiAbEntryRemoveFromTree(v31);
            *(_DWORD *)a3 = v31->BoostBitmap.AllFields & 0x1FFFF;
            v31->BoostBitmap.AllFields &= 0xFFFE0000;
            v31->ThreadLocalFlags &= ~1u;
            v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
            v32 = v31 - v25->Tcb.LockEntries;
            if( v27 == 1 )
              v25->Tcb.AbEntrySummary |= 1 << v32;
            else
              _InterlockedOr8((volatile signed __int8 *)&v25->Tcb.AbOrphanedEntrySummary, 1 << v32);
            goto LABEL_33;
          }
          break;
        }
      }
    }
    if( (*(&v25->Tcb.MiscFlags + 1) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, v25, (PVOID)v12, (PVOID)SessionId, 0i64);
LABEL_33:
    --v25->Tcb.AbAllocationRegionCount;
    KiAbThreadRemoveBoosts(&v25->Tcb, (VOID *)v12, (UINT64 *)a3);
    v29 = v25->Tcb.SpecialApcDisable++ == -1;
    if( v29 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v25->Tcb.ApcState.ApcListHead[0].Flink != &v25->Tcb.152 )
      KiCheckForKernelApcDelivery();
  }
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  return(unsigned int)v16;
}

Referenced by:

No references.