SMKM_STORE_MGR::SmIoCtxQueueWork

__int64 __fastcall SMKM_STORE_MGR::SmIoCtxQueueWork(
        __int64 *a1,
        __int64 a2,
        __int64 a3,
        unsigned __int64 a4){
  int v4; 
  __int16 v6; 
  int v9; 
  int v10; 
  __int64 *v11; 
  __int64 *v12; 
  __int64 v13; 
  VOID *v14; 
  void(__fastcall *v16)(__int64, __int64 *, __int64); 
  _ETHREAD *v17; 
  _ETHREAD *v18; 
  __int64 v19; 
  __int64 *v20; 
  unsigned int v21; 
  __int64 *v22; 
  __int64 v23; 
  int v24; 
  __int16 v25; 
  __int16 v26; 
  __int64 *v27; 
  __int64 *v28; 
  __int128 v29; 

  v4 = *(_DWORD *)a4;
  v28 = (__int64 *)&v27;
  v6 = a3;
  v27 = 0i64;
  v29 = 0i64;
  v9 = v4 & 7;
  v10 = SMKM_STORE_MGR::SmIoCtxPrepareToQueue(a1, a2, a3, a4, (__int64)&v27);
  if( v10 < 0 )
  {
    v14 = (VOID *)v29;
  }
  else
  {
    if( v9 != 2 )
      goto LABEL_3;
    v16 = *(void(__fastcall **)(__int64, __int64 *, __int64))(a2 + 1848);
    if( v16 )
    {
      v23 = *a1;
      v24 = *(_DWORD *)(a4 + 24);
      v26 = 0;
      v25 = v6;
      v16(a2, &v23, 5i64);
    }
    if( (*(_BYTE *)(*(_QWORD *)SmKmStoreRefFromStoreIndex(a2, v6 & 0x3FF) + 6021i64) & 4) != 0
      && (*(_DWORD *)(a4 + 8) & 0x4000000) != 0
      && PsGetIoPriorityThread(v17) >= IoPriorityNormal )
    {
      if( v28 != (__int64 *)&v27 )
      {
        v20 = v27;
        v27 = (__int64 *)(*v27 & 0xFFFFFFFFFFFFFFF8ui64);
        if( v20 == v28 )
        {
          v27 = 0i64;
          v28 = (__int64 *)&v27;
        }
        else
        {
          *v28 = *v28 & 7 | (8 * ((unsigned __int64)*v28 >> 3) - 8);
        }
      }
      *(_OWORD *)(a4 + 40) = 0i64;
      *(_OWORD *)(a4 + 56) = 0i64;
      *(_OWORD *)(a4 + 72) = 0i64;
      *(_QWORD *)(a4 + 72) = v19;
      *(_QWORD *)(a4 + 80) = a2 + 464;
      KeQueryPriorityThread(v18);
      SMKM_STORE_MGR::SmAsyncReadQueueInsert(a2 + 464, a4 + 40, v21);
    }
    else
    {
LABEL_3:
      if( v28 != (__int64 *)&v27 )
      {
        v11 = v27;
        v27 = (__int64 *)(*v27 & 0xFFFFFFFFFFFFFFF8ui64);
        if( v11 == v28 )
        {
          v27 = 0i64;
          v28 = (__int64 *)&v27;
        }
        else
        {
          *v28 = *v28 & 7 | (8 * ((unsigned __int64)*v28 >> 3) - 8);
        }
      }
      v12 = (__int64 *)SmKmStoreRefFromStoreIndex(a2, v6 & 0x3FF);
      SMKM_STORE::SmStWorkItemQueue(*v12, v13, 0);
    }
    v14 = 0i64;
    *(_QWORD *)&v29 = 0i64;
    v10 = 0;
  }
  if( v14 )
    SmFpFree((_SM_FORWARD_PROGRESS_CTX *)(a2 + 1536), SmFpResourceMapping, (VOID *)0xFFFFFFFFFFFFFFFFi64, v14);
  while( v28 != (__int64 *)&v27 )
  {
    v22 = v27;
    v27 = (__int64 *)(*v27 & 0xFFFFFFFFFFFFFFF8ui64);
    if( v22 == v28 )
    {
      v27 = 0i64;
      v28 = (__int64 *)&v27;
    }
    else
    {
      *v28 = *v28 & 7 | (8 * ((unsigned __int64)*v28 >> 3) - 8);
    }
    SMKM_STORE_MGR::SmWorkItemFreeResource(a2, v22, (VOID *)0xFFFFFFFFFFFFFFFFi64);
  }
  return(unsigned int)v10;
}

Referenced by:

No references.