IopKeepAliveWorker

VOID __stdcall IopKeepAliveWorker(PVOID StartContext){
  UINT64 v1; 
  unsigned __int8 v2; 
  unsigned __int8 v3; 
  PVOID v4; 
  int v5; 
  PVOID v6; 
  PVOID *v7; 
  bool v8; 
  UINT64 v9; 
  UINT64 v10; 
  __int64 v11; 
  char v12; 
  _DWORD *v13; 
  int v14; 
  unsigned __int8 v15; 
  unsigned __int64 v16; 
  BOOL v17; 
  KeAcquireSpinLockRaiseToDpc(&qword_140C45BF0, v1);
  qword_140C45C20 = (__int64)KeGetCurrentThread();
LABEL_2:
  v3 = v2;
  while( 1 )
  {
    v4 = qword_140C45BE0;
    if( qword_140C45BE0 == &qword_140C45BE0 )
      break;
    v5 = *((_DWORD *)qword_140C45BE0 + 8);
    *((_DWORD *)qword_140C45BE0 + 8) = 0;
    if( v5 )
    {
      KxReleaseSpinLock(&qword_140C45BF0);
      __writecr8(v3);
      if( v5 > 0 )
      {
        do
        {
          ObfReferenceObjectWithTag(*((PVOID *)v4 + 3), 0x746C6644u);
          PspAdjustKeepAliveCountProcess(*((void **)v4 + 3), 1, *((_QWORD *)v4 + 5), *((_BYTE *)v4 + 18));
          --v5;
        }
        while( v5 );
        goto LABEL_23;
      }
      if( v5 != -1 )
      {
        v11 = (unsigned int)(-1 - v5);
        do
        {
          PspAdjustKeepAliveCountProcess(*((void **)v4 + 3), -1, *((_QWORD *)v4 + 5), *((_BYTE *)v4 + 18));
          ObfDereferenceObjectWithTag(*((PVOID *)v4 + 3), 0x746C6644ui64);
          --v11;
        }
        while( v11 );
      }
      v12 = *((_BYTE *)v4 + 18);
      v13 = (_DWORD *)*((_QWORD *)v4 + 3);
      if( v12 )
        v14 = v13[619];
      else
        v14 = v13[627];
      if( (v14 & 0x7FFFFFFF) == 1 )
      {
        KeAcquireSpinLockRaiseToDpc(&qword_140C45BF0, v9);
        v16 = v15;
        if( *(__int64 *)&KUSER_SHARED_DATA.SystemTime.LowPart >= *((_QWORD *)v4 + 6) )
        {
          KxReleaseSpinLock(&qword_140C45BF0);
          __writecr8(v16);
          v12 = *((_BYTE *)v4 + 18);
          v13 = (_DWORD *)*((_QWORD *)v4 + 3);
          goto LABEL_21;
        }
        --*((_DWORD *)v4 + 8);
        KxReleaseSpinLock(&qword_140C45BF0);
        __writecr8(v16);
        LOBYTE(v17) = 1;
        KeDelayExecutionThread(0, v17, (PLARGE_INTEGER)v4 + 6);
      }
      else
      {
LABEL_21:
        PspAdjustKeepAliveCountProcess(v13, -1, *((_QWORD *)v4 + 5), v12);
        ObfDereferenceObjectWithTag(*((PVOID *)v4 + 3), 0x746C6644ui64);
      }
LABEL_23:
      KeAcquireSpinLockRaiseToDpc(&qword_140C45BF0, v10);
      goto LABEL_2;
    }
    v6 = *(PVOID *)v4;
    v7 = (PVOID *)*((_QWORD *)v4 + 1);
    if( *(PVOID *)(*(_QWORD *)v4 + 8i64) != v4 || *v7 != v4 )
      __fastfail(3u);
    *v7 = v6;
    *((_QWORD *)v6 + 1) = v7;
    v8 = *((_BYTE *)v4 + 17) == 1;
    *((_BYTE *)v4 + 16) = 0;
    if( v8 )
      ExFreePoolWithTag(v4, 0);
  }
  qword_140C45C20 = 0i64;
  byte_140C45C18 = 0;
  KxReleaseSpinLock(&qword_140C45BF0);
  __writecr8(v3);
}

Referenced by:

No references.