ObpProcessRemoveObjectQueue

_FIRMWARE_TYPE __fastcall ObpProcessRemoveObjectQueue(){
  _ADAPTER_OBJECT *NextSession; 
  _ADAPTER_OBJECT *v1; 
  int v2; 
  __int128 **v3; 
  int v4; 
  unsigned int v5; 
  __int64 v6; 
  unsigned int v7; 
  int v8; 
  int *v9; 
  int v10; 
  __int64 v11; 
  _OBJECT_HEADER *v12; 
  _HANDLE_REVOCATION_INFO *v13; 
  _OBJECT_HEADER *HandleCount; 
  signed __int64 v15; 
  unsigned __int64 v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  signed __int32 v20[10]; 
  __int128 *v21; 
  __int128 *v22; 
  _KAPC_STATE ApcState; 

  if( !qword_140C13150 )
  {
    v16 = __rdtsc();
    v17 = 41929663 * ((((unsigned __int64)HIDWORD(v16) << 32) | (unsigned int)v16) >> 4);
    qword_140C13150 = v17;
    if( !v17 )
      qword_140C13150 = 1i64;
    v18 = __rdtsc();
    qword_140C13158 = (41929663 * (unsigned int)((((unsigned __int64)HIDWORD(v18) << 32) | (unsigned int)v18) >> 4)) ^ 0xC24i64;
    qword_140C13160 = KiQueryUnbiasedInterruptTime(1u) + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64 + 288000000000i64;
  }
  if( KiQueryUnbiasedInterruptTime(1u) >= qword_140C13160 )
  {
    v21 = &xmmword_140CFBC20;
    v22 = &xmmword_140CFBA60;
    NextSession = (_ADAPTER_OBJECT *)MmGetNextSession(0i64);
    v1 = NextSession;
    if( NextSession )
    {
      if( MmAttachSession(NextSession, &ApcState) >= 0 )
      {
        if( !qword_140C13168 )
          qword_140C13168 = *(&SbiVmbusArrivalEvent + 731);
        if( (_DWORD)xmmword_140CFBA70 && (_BYTE)KdDebuggerNotPresent )
        {
          v2 = 0;
          v3 = &v22;
          v4 = 2;
          do
          {
            v5 = 0;
            v6 = *(_QWORD *)*v3;
            v7 = *((_DWORD *)*v3 + 4);
            v8 = v2 + v6 + (unsigned int)*v3;
            if( v7 )
            {
              v9 = *(int **)*v3;
              do
              {
                v10 = *v9;
                ++v5;
                v11 = *v9++;
                v8 = v5 * ((v10 + *(_DWORD *)((v11 >> 4) + v6)) ^ v8);
              }
              while( v5 < v7 );
            }
            --v3;
            v2 += 2 * v8;
            --v4;
          }
          while( v4 );
          if( v2 != qword_140C13168 && !qword_140C13120 )
          {
            v20[8] = -2071986176;
            qword_140C13120 = (unsigned int)__ROL4__(-2071986176, 233);
            xmmword_140C13128 = 0i64;
            qword_140C13138 = 266i64;
            qword_140C13140 = v6;
          }
        }
        MmDetachSession(v1, &ApcState);
      }
      MmQuitNextSession(v1);
    }
    if( qword_140C13120 )
    {
      if( (VOID(__stdcall *)(_KDPC *, PVOID, PVOID, PVOID))`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList.DeferredRoutine != KiScanQueues )
        KeInitializeDpc(
          &`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList,
          KiScanQueues,
          &`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList);
      qword_140C13148 = 3878784i64;
      KeInsertQueueDpc((UINT64)&`ObpTraceDeferredDeletionWorker'::`2'::ObjectEventList, 0i64, 0i64);
    }
    qword_140C13160 = KiQueryUnbiasedInterruptTime(1u) + 41929663 * (__rdtsc() >> 4) % 0x12A05F2000i64 + 288000000000i64;
  }
  while( 1 )
  {
    v12 = (_OBJECT_HEADER *)_InterlockedExchange64(&qword_140C25870, 1i64);
    do
    {
      v13 = OBJECT_HEADER_TO_HANDLE_REVOCATION_INFO(v12);
      if( v13 )
        ObpHandleRevocationBlockRemoveObject(v13);
      if( ObpTraceFlags )
        ObpDeregisterObject(v12);
      HandleCount = (_OBJECT_HEADER *)v12->HandleCount;
      ObpRemoveObjectRoutine(v12, 1u);
      v12 = HandleCount;
    }
    while( HandleCount && HandleCount != (_OBJECT_HEADER *)1 );
    if( qword_140C25870 == 1i64 )
    {
      v15 = _InterlockedCompareExchange64(&qword_140C25870, 0i64, 1i64);
      if( v15 == 1 )
        break;
    }
  }
  _InterlockedOr(v20, 0);
  if( stru_140C25868._bf_0 )
    LODWORD(v15) = ExfUnblockPushLock(&stru_140C25868._bf_0, 0i64);
  return(int)v15;
}

Referenced by:

No references.