SMKM_STORE_MGR::SmFeAddInitiate

__int64 __fastcall SMKM_STORE_MGR::SmFeAddInitiate(
        __int64 a1,
        unsigned int *a2,
        int a3,
        unsigned int a4,
        __int64 a5,
        _ETHREAD *a6,
        char a7){
  __int16 v9; 
  unsigned int v10; 
  int v11; 
  __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; 
  __int64 v24; 
  _ETHREAD *v25; 
  ULONG_PTR SessionId; 
  char v27; 
  int v28; 
  bool v29; 
  __int64 v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  _ETHREAD *v34; 
  _ETHREAD *v35; 
  unsigned int v36; 
  char v37; 
  int v38; 
  __int64 v39; 
  unsigned __int64 v40; 
  __int64 v41; 
  NTSTATUS v42; 
  _ETHREAD *v43; 
  NTSTATUS v44; 
  UINT64 v45; 
  unsigned int v46; 
  unsigned int v47; 
  unsigned int v48[2]; 
  int v49; 
  int v50; 
  int v51; 
  __int64 v52; 
  int v53; 
  unsigned int v54; 
  union _LARGE_INTEGER Timeout; 
  __int128 v56; 
  __int16 Object; 
  char v58; 
  int v59; 
  __int64 v60[2]; 
  unsigned int *v61; 
  _ETHREAD *v62; 
  __int64 v63; 
  __int64 v64[3]; 
  int v65; 
  int v66; 
  __int64 v67; 
  INT64 result[17]; 
  v63 = a5;
  v49 = a3;
  v9 = a4;
  v61 = a2;
  v62 = a6;
  v54 = a4;
  memset((INT64)result, 0i64);
  v10 = *a2;
  v52 = 0x1000000000000i64;
  v11 = a7 & 2;
  WORD2(v52) = v9;
  v47 = 0;
  v12 = a1 + 440;
  Timeout.QuadPart = 0i64;
  v13 = 0;
  v64[1] = 0i64;
  v64[2] = 0i64;
  v67 = 0i64;
  v64[0] = (__int64)result;
  v65 = 0;
  v66 = 8;
  v53 = v11;
  if( (a7 & 2) != 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
    ExAcquirePushLockSharedEx(a1 + 440, 0i64);
    v47 = 2;
  }
  else if( (a7 & 4) != 0 )
  {
    if( !(unsigned int)StLockTryAcquireExclusive((struct VLOCK *)(a1 + 440), &v47) )
      return 3221225557i64;
  }
  else
  {
    v34 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v34 + 243);
    ExAcquirePushLockExclusiveEx(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)v64);
    v56 = 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)&v56,
      (__int64)v64);
    if( !(_QWORD)v56 )
      break;
    v20 = *((_QWORD *)&v56 + 1) + 8i64;
    v21 = (unsigned __int16)*(_DWORD *)v56 + 2i64;
    *((_QWORD *)&v56 + 1) = v20;
    if( v20 >= (__int64)v56 + 8 * v21 )
    {
      v33 = *(_QWORD *)(v56 + 8);
      if( v33 )
      {
        *(_QWORD *)&v56 = *(_QWORD *)(v56 + 8);
        *((_QWORD *)&v56 + 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;
    v60[1] = (__int64)v60;
    v60[0] = (__int64)v60;
    *(_QWORD *)(a1 + 1656) = &Object;
    v58 = 6;
    v59 = 0;
    *(_DWORD *)(a1 + 1648) = v10;
    if( v11 )
    {
      if( _InterlockedCompareExchange64((volatile signed __int64 *)v12, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared((INT64 *)(a1 + 440));
      KeAbPostRelease((PVOID)(a1 + 440));
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
    else
    {
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(a1 + 440));
      v48[0] = 0;
      v35 = (_ETHREAD *)KeGetCurrentThread();
      v36 = (unsigned int)MiGetSystemRegionType(a1 + 440) == 1 ? MmGetSessionIdEx(*((_QWORD *)v35 + 23)) : -1;
      --*((_WORD *)v35 + 243);
      v37 = ++*((_BYTE *)v35 + 794);
      v38 = (*((char *)v35 + 792) | *((char *)v35 + 870)) ^ 0x3F;
      while( 1 )
      {
        v29 = !_BitScanReverse((unsigned int *)&v39, v38);
        v48[1] = v39;
        if( v29 )
          goto LABEL_66;
        v40 = *((_QWORD *)v35 + 100) + 96 * v39;
        v38 &= ~(1 << v39);
        if( (*(_BYTE *)(v40 + 26) & 1) != 0
          && (*(_DWORD *)(v40 + 32) & 1) == 0
          && (*(_QWORD *)(v40 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v12 & 0x7FFFFFFFFFFFFFFCi64)
          && *(_DWORD *)(v40 + 40) == v36 )
        {
          *(_BYTE *)(v40 + 26) &= ~1u;
          if( *(_QWORD *)(v40 + 32) )
            break;
        }
      }
      if( !v40 )
      {
LABEL_66:
        if( (*((_DWORD *)v35 + 30) & 0x10000) == 0 )
          KeBugCheckEx(0x162u, (ULONG_PTR)v35, a1 + 440, v36, 0i64);
        goto LABEL_78;
      }
      *(_BYTE *)(v40 + 32) |= 2u;
      if( *(__int64 *)(v40 + 32) < 0 )
        KiAbEntryRemoveFromTree(v40);
      v48[0] = 0;
      v48[0] = *(_DWORD *)(v40 + 88) & 0x1FFFF;
      *(_DWORD *)(v40 + 88) &= 0xFFFE0000;
      *(_BYTE *)(v40 + 25) &= ~1u;
      *(_QWORD *)(v40 + 32) = 0i64;
      v41 = (__int64)(v40 - *((_QWORD *)v35 + 100)) / 96;
      if( v37 == 1 )
        *((_BYTE *)v35 + 792) |= 1 << v41;
      else
        _InterlockedOr8((volatile signed __int8 *)v35 + 870, 1 << v41);
LABEL_78:
      --*((_BYTE *)v35 + 794);
      KiAbThreadRemoveBoosts((ULONG_PTR)v35, a1 + 440, v48);
      v29 = (*((_WORD *)v35 + 243))++ == 0xFFFF;
      if( v29 && *((_ETHREAD **)v35 + 19) != (_ETHREAD *)((char *)v35 + 152) )
        KiCheckForKernelApcDelivery();
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
      v11 = v53;
    }
    Timeout.QuadPart = -2500000i64;
    v42 = KeWaitForSingleObject(&Object, WrKernel, 0, 0, &Timeout);
    v43 = (_ETHREAD *)KeGetCurrentThread();
    v44 = v42;
    --*((_WORD *)v43 + 243);
    v45 = 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 )
    {
      LODWORD(v52) = 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)v64);
      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),
                (__int64)v64,
                &v52);
      }
      else if( v23 >= 0 )
      {
        v16 = -1073741484;
      }
      if( v16 < 0 )
        break;
      if( ++v22 == v49 )
      {
        SMKM_STORE_MGR::SmIoCtxQueueWork(v62, a1, v54, v63);
        v16 = 0;
        goto LABEL_17;
      }
      ++v10;
    }
    if( v22 )
      SMKM_STORE_MGR::SmFeAddComplete(a1, v61, v22, v24, 2);
  }
LABEL_38:
  if( v11 )
  {
    if( _InterlockedCompareExchange64((volatile signed __int64 *)v12, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)(a1 + 440));
    KeAbPostRelease((PVOID)(a1 + 440));
  }
  else
  {
LABEL_17:
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 440));
    v51 = 0;
    v25 = (_ETHREAD *)KeGetCurrentThread();
    if( (unsigned int)MiGetSystemRegionType(a1 + 440) == 1 )
      SessionId = (unsigned int)MmGetSessionIdEx(*((_QWORD *)v25 + 23));
    else
      SessionId = 0xFFFFFFFFi64;
    --*((_WORD *)v25 + 243);
    v27 = ++*((_BYTE *)v25 + 794);
    v28 = (*((char *)v25 + 792) | *((char *)v25 + 870)) ^ 0x3F;
    while( 1 )
    {
      v29 = !_BitScanReverse((unsigned int *)&v30, v28);
      v50 = v30;
      if( v29 )
        break;
      v31 = *((_QWORD *)v25 + 100) + 96 * v30;
      v28 &= ~(1 << v30);
      if( (*(_BYTE *)(v31 + 26) & 1) != 0
        && (*(_DWORD *)(v31 + 32) & 1) == 0
        && (*(_QWORD *)(v31 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v12 & 0x7FFFFFFFFFFFFFFCi64)
        && *(_DWORD *)(v31 + 40) == (_DWORD)SessionId )
      {
        *(_BYTE *)(v31 + 26) &= ~1u;
        if( *(_QWORD *)(v31 + 32) )
        {
          if( v31 )
          {
            *(_BYTE *)(v31 + 32) |= 2u;
            if( *(__int64 *)(v31 + 32) < 0 )
              KiAbEntryRemoveFromTree(v31);
            v51 = *(_DWORD *)(v31 + 88) & 0x1FFFF;
            *(_DWORD *)(v31 + 88) &= 0xFFFE0000;
            *(_BYTE *)(v31 + 25) &= ~1u;
            *(_QWORD *)(v31 + 32) = 0i64;
            v32 = (__int64)(v31 - *((_QWORD *)v25 + 100)) / 96;
            if( v27 == 1 )
              *((_BYTE *)v25 + 792) |= 1 << v32;
            else
              _InterlockedOr8((volatile signed __int8 *)v25 + 870, 1 << v32);
            goto LABEL_33;
          }
          break;
        }
      }
    }
    if( (*((_DWORD *)v25 + 30) & 0x10000) == 0 )
      KeBugCheckEx(0x162u, (ULONG_PTR)v25, v12, SessionId, 0i64);
LABEL_33:
    --*((_BYTE *)v25 + 794);
    KiAbThreadRemoveBoosts((ULONG_PTR)v25, v12, (unsigned int *)&v51);
    v29 = (*((_WORD *)v25 + 243))++ == 0xFFFF;
    if( v29 && *((_ETHREAD **)v25 + 19) != (_ETHREAD *)((char *)v25 + 152) )
      KiCheckForKernelApcDelivery();
  }
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  return(unsigned int)v16;
}

Referenced by:

No references.