SMKM_STORE::SmStWorker

__int64 __fastcall SMKM_STORE::SmStWorker(__int64 a1){
  __int64 v1; 
  int v3; 
  __int64 v4; 
  int v5; 
  int v6; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v8; 
  __int64 v9; 
  _ETHREAD *v10; 
  unsigned int SessionId; 
  char v12; 
  int v13; 
  bool v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  __int64 *v18; 
  int v19; 
  UINT64 v20; 
  UINT8 v21; 
  UINT8 v22; 
  int v23; 
  __int64 *v24; 
  _ETHREAD *v25; 
  unsigned int v26; 
  char v27; 
  int v28; 
  __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  unsigned __int64 UnbiasedInterruptTime; 
  _ETHREAD *v33; 
  unsigned int v34; 
  char v35; 
  int v36; 
  __int64 v37; 
  unsigned __int64 v38; 
  __int64 v39; 
  __int64 result; 
  IRP *WaitMode; 
  int v42[4]; 
  PVOID ThreadPtr; 
  union _LARGE_INTEGER Interval; 
  PVOID Object[3]; 
  int v46; 
  int v47; 
  int v48; 
  int v49; 
  v1 = *(_QWORD *)a1;
  v42[0] = 0;
  Interval.QuadPart = 0i64;
  v3 = 0;
  IoSetThreadHardErrorMode(0);
  ThreadPtr = KeGetCurrentThread();
  v4 = *(unsigned __int8 *)(v1 + 6022);
  if( (_DWORD)v4 == 4 )
    v5 = *(_DWORD *)(v1 + 6728);
  else
    v5 = *((_DWORD *)`SMKM_STORE::SmStGetPriorityByMemoryCondition'::`2'::PriorityByMemoryCondition + v4);
  KeSetActualBasePriorityThread((__int64)ThreadPtr, v5);
  v6 = 0;
  if( (*(_BYTE *)(v1 + 6021) & 4) != 0 )
  {
    SmSetThreadPagePriority(&ThreadPtr, 0i64);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    if( (unsigned int)MiChargeResident(&MiSystemPartition, 0x1Aui64, 1024i64) )
    {
      --*((_WORD *)CurrentThread + 243);
      *((_BYTE *)CurrentThread + 1304) |= 4u;
      v3 = 1;
      v6 = 0;
    }
    else
    {
      v6 = -1073741670;
    }
    *((_DWORD *)ThreadPtr + 325) |= 2u;
  }
  *(_DWORD *)(a1 + 32) = v6;
  KeSetEvent((PRKEVENT)(a1 + 8), 0);
  if( v6 >= 0 )
  {
    Object[0] = (PVOID)(v1 + 6128);
    v8 = v1 + 6600;
    Object[1] = (PVOID)(v1 + 6152);
    while( 1 )
    {
      while( 1 )
      {
        KeWaitForMultipleObjects(
          (_BYTE *)2,
          Object,
          WaitAny,
          Executive,
          0,
          0,
          (_LARGE_INTEGER *)(v8 & -(__int64)(*(_QWORD *)v8 != 0i64)),
          0i64);
        v46 = v19;
        v23 = v19;
        if( v19 >= 2 )
          break;
LABEL_37:
        if( v23 )
        {
          if( v23 == 1 )
            goto LABEL_89;
LABEL_35:
          v8 = v1 + 6600;
        }
        else
        {
          KeResetEvent(Object[0], v20, v21, v22, WaitMode);
          v24 = SMKM_STORE::SmStWorkItemGet(v1, v42);
          v8 = v1 + 6600;
          v18 = v24;
          if( v24 )
          {
            while( 1 )
            {
              SMKM_STORE::SmStAcquireStoreLockExclusive(v1);
              LOBYTE(v9) = *(_BYTE *)(v1 + 6021);
              if( (v9 & 1) == 0 || v42[0] )
              {
                if( (v9 & 2) != 0 && (*(_DWORD *)v18 & 7) == 0 )
                {
                  v46 = -1073741058;
LABEL_12:
                  if( (*(_BYTE *)(v1 + 6021) & 4) != 0 )
                  {
                    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 6024), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                      ExfTryToWakePushLock((volatile INT64 *)(v1 + 6024));
                    v48 = 0;
                    v10 = (_ETHREAD *)KeGetCurrentThread();
                    if( (unsigned int)MiGetSystemRegionType(v1 + 6024) == 1 )
                      SessionId = MmGetSessionIdEx(*((_QWORD *)v10 + 23));
                    else
                      SessionId = -1;
                    --*((_WORD *)v10 + 243);
                    v12 = ++*((_BYTE *)v10 + 794);
                    v13 = (*((char *)v10 + 792) | *((char *)v10 + 870)) ^ 0x3F;
                    while( 1 )
                    {
                      v14 = !_BitScanReverse((unsigned int *)&v15, v13);
                      v42[2] = v15;
                      if( v14 )
                        break;
                      v16 = *((_QWORD *)v10 + 100) + 96 * v15;
                      v13 &= ~(1 << v15);
                      if( (*(_BYTE *)(v16 + 26) & 1) != 0
                        && (*(_DWORD *)(v16 + 32) & 1) == 0
                        && (*(_QWORD *)(v16 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v1 + 6024) & 0x7FFFFFFFFFFFFFFCi64)
                        && *(_DWORD *)(v16 + 40) == SessionId )
                      {
                        *(_BYTE *)(v16 + 26) &= ~1u;
                        if( *(_QWORD *)(v16 + 32) )
                        {
                          if( v16 )
                          {
                            *(_BYTE *)(v16 + 32) |= 2u;
                            if( *(__int64 *)(v16 + 32) < 0 )
                              KiAbEntryRemoveFromTree(v16);
                            v48 = 0;
                            v48 = *(_DWORD *)(v16 + 88) & 0x1FFFF;
                            *(_DWORD *)(v16 + 88) &= 0xFFFE0000;
                            *(_BYTE *)(v16 + 25) &= ~1u;
                            *(_QWORD *)(v16 + 32) = 0i64;
                            v17 = (__int64)(v16 - *((_QWORD *)v10 + 100)) / 96;
                            if( v12 == 1 )
                              *((_BYTE *)v10 + 792) |= 1 << v17;
                            else
                              _InterlockedOr8((volatile signed __int8 *)v10 + 870, 1 << v17);
                            goto LABEL_29;
                          }
                          break;
                        }
                      }
                    }
                    if( (*((_DWORD *)v10 + 30) & 0x10000) == 0 )
                      KeBugCheckEx(0x162u, (ULONG_PTR)v10, v1 + 6024, SessionId, 0i64);
LABEL_29:
                    --*((_BYTE *)v10 + 794);
                    KiAbThreadRemoveBoosts((ULONG_PTR)v10, v1 + 6024, (unsigned int *)&v48);
                    v14 = (*((_WORD *)v10 + 243))++ == 0xFFFF;
                    if( v14 && *((_ETHREAD **)v10 + 19) != (_ETHREAD *)((char *)v10 + 152) )
                      KiCheckForKernelApcDelivery();
                    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
                  }
                  SMKM_STORE_MGR::SmWorkItemFree(v9, (_DWORD *)v1, (__int64)v18, &v46);
                  goto LABEL_34;
                }
                v46 = ST_STORE::StWorkItemProcess(v1, (__int64)v18);
                if( v46 != 259 )
                  goto LABEL_12;
              }
              else
              {
                v46 = -1073741058;
                ST_STORE::StStoreWorkItemCleanup(v1, v18);
              }
              if( (*(_BYTE *)(v1 + 6021) & 4) != 0 )
              {
                if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 6024), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                  ExfTryToWakePushLock((volatile INT64 *)(v1 + 6024));
                v49 = 0;
                v25 = (_ETHREAD *)KeGetCurrentThread();
                if( (unsigned int)MiGetSystemRegionType(v1 + 6024) == 1 )
                  v26 = MmGetSessionIdEx(*((_QWORD *)v25 + 23));
                else
                  v26 = -1;
                --*((_WORD *)v25 + 243);
                v27 = ++*((_BYTE *)v25 + 794);
                v28 = (*((char *)v25 + 792) | *((char *)v25 + 870)) ^ 0x3F;
                while( 1 )
                {
                  v14 = !_BitScanReverse((unsigned int *)&v29, v28);
                  v42[3] = v29;
                  if( v14 )
                    break;
                  v30 = *((_QWORD *)v25 + 100) + 96 * v29;
                  v28 &= ~(1 << v29);
                  if( (*(_BYTE *)(v30 + 26) & 1) != 0
                    && (*(_DWORD *)(v30 + 32) & 1) == 0
                    && (*(_QWORD *)(v30 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v1 + 6024) & 0x7FFFFFFFFFFFFFFCi64)
                    && *(_DWORD *)(v30 + 40) == v26 )
                  {
                    *(_BYTE *)(v30 + 26) &= ~1u;
                    if( *(_QWORD *)(v30 + 32) )
                    {
                      if( v30 )
                      {
                        *(_BYTE *)(v30 + 32) |= 2u;
                        if( *(__int64 *)(v30 + 32) < 0 )
                          KiAbEntryRemoveFromTree(v30);
                        v49 = 0;
                        v49 = *(_DWORD *)(v30 + 88) & 0x1FFFF;
                        *(_DWORD *)(v30 + 88) &= 0xFFFE0000;
                        *(_BYTE *)(v30 + 25) &= ~1u;
                        *(_QWORD *)(v30 + 32) = 0i64;
                        v31 = (__int64)(v30 - *((_QWORD *)v25 + 100)) / 96;
                        if( v27 == 1 )
                          *((_BYTE *)v25 + 792) |= 1 << v31;
                        else
                          _InterlockedOr8((volatile signed __int8 *)v25 + 870, 1 << v31);
                        goto LABEL_59;
                      }
                      break;
                    }
                  }
                }
                if( (*((_DWORD *)v25 + 30) & 0x10000) == 0 )
                  KeBugCheckEx(0x162u, (ULONG_PTR)v25, v1 + 6024, v26, 0i64);
LABEL_59:
                --*((_BYTE *)v25 + 794);
                KiAbThreadRemoveBoosts((ULONG_PTR)v25, v1 + 6024, (unsigned int *)&v49);
                v14 = (*((_WORD *)v25 + 243))++ == 0xFFFF;
                if( v14 && *((_ETHREAD **)v25 + 19) != (_ETHREAD *)((char *)v25 + 152) )
                  KiCheckForKernelApcDelivery();
                KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
              }
LABEL_34:
              v18 = SMKM_STORE::SmStWorkItemGet(v1, v42);
              if( !v18 )
                goto LABEL_35;
            }
          }
        }
      }
      v8 = v1 + 6600;
      if( v19 == 258 )
      {
        SMKM_STORE::SmStAcquireStoreLockExclusive(v1);
        ST_STORE::StDrainReadContextList(v1);
        *(_QWORD *)(v1 + 5928) += *(_QWORD *)(v1 + 5920);
        UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
        ST_STORE::StLazyWorkMgrRunExpiredWork(v1 + 5744, UnbiasedInterruptTime);
        if( (*(_BYTE *)(v1 + 6021) & 4) != 0 )
        {
          if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 6024), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock((volatile INT64 *)(v1 + 6024));
          v47 = 0;
          v33 = (_ETHREAD *)KeGetCurrentThread();
          if( (unsigned int)MiGetSystemRegionType(v1 + 6024) == 1 )
            v34 = MmGetSessionIdEx(*((_QWORD *)v33 + 23));
          else
            v34 = -1;
          --*((_WORD *)v33 + 243);
          v35 = ++*((_BYTE *)v33 + 794);
          v36 = (*((char *)v33 + 792) | *((char *)v33 + 870)) ^ 0x3F;
          while( 1 )
          {
            v14 = !_BitScanReverse((unsigned int *)&v37, v36);
            v42[1] = v37;
            if( v14 )
              break;
            v38 = *((_QWORD *)v33 + 100) + 96 * v37;
            v36 &= ~(1 << v37);
            if( (*(_BYTE *)(v38 + 26) & 1) != 0
              && (*(_DWORD *)(v38 + 32) & 1) == 0
              && (*(_QWORD *)(v38 + 32) & 0x7FFFFFFFFFFFFFFCi64) == ((v1 + 6024) & 0x7FFFFFFFFFFFFFFCi64)
              && *(_DWORD *)(v38 + 40) == v34 )
            {
              *(_BYTE *)(v38 + 26) &= ~1u;
              if( *(_QWORD *)(v38 + 32) )
              {
                if( v38 )
                {
                  *(_BYTE *)(v38 + 32) |= 2u;
                  if( *(__int64 *)(v38 + 32) < 0 )
                    KiAbEntryRemoveFromTree(v38);
                  v47 = 0;
                  v47 = *(_DWORD *)(v38 + 88) & 0x1FFFF;
                  *(_DWORD *)(v38 + 88) &= 0xFFFE0000;
                  *(_BYTE *)(v38 + 25) &= ~1u;
                  *(_QWORD *)(v38 + 32) = 0i64;
                  v39 = (__int64)(v38 - *((_QWORD *)v33 + 100)) / 96;
                  if( v35 == 1 )
                    *((_BYTE *)v33 + 792) |= 1 << v39;
                  else
                    _InterlockedOr8((volatile signed __int8 *)v33 + 870, 1 << v39);
                  goto LABEL_83;
                }
                break;
              }
            }
          }
          if( (*((_DWORD *)v33 + 30) & 0x10000) == 0 )
            KeBugCheckEx(0x162u, (ULONG_PTR)v33, v1 + 6024, v34, 0i64);
LABEL_83:
          --*((_BYTE *)v33 + 794);
          KiAbThreadRemoveBoosts((ULONG_PTR)v33, v1 + 6024, (unsigned int *)&v47);
          v14 = (*((_WORD *)v33 + 243))++ == 0xFFFF;
          if( v14 && *((_ETHREAD **)v33 + 19) != (_ETHREAD *)((char *)v33 + 152) )
            KiCheckForKernelApcDelivery();
          KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
        }
        v23 = 0;
        goto LABEL_37;
      }
    }
  }
LABEL_89:
  if( v3 )
    MmSetHardFaultBehavior((__int64)KeGetCurrentThread(), 0);
  Interval.QuadPart = -150000i64;
  while( 1 )
  {
    result = *(unsigned int *)(v1 + 6732);
    if( !(_DWORD)result )
      break;
    KeDelayExecutionThread(0, 0, &Interval);
  }
  return result;
}

Referenced by:

No references.