PiDqObjectManagerServiceActionQueue

VOID __stdcall PiDqObjectManagerServiceActionQueue(VOID *Parameter){
  INT64 v1; 
  _FAST_MUTEX *v2; 
  char *v3; 
  char v4; 
  char *v5; 
  _ETHREAD *CurrentThread; 
  _PI_DQ_QUERY **v7; 
  __int64 v8; 
  char v9; 
  VOID **PoolWithTag; 
  __int64 v11; 
  volatile signed __int32 *i; 
  _PI_PNPRTL_OBJECT_EVENT **v13; 
  __int64 v14; 
  _PI_DQ_QUERY **v15; 
  _GUID *v16; 
  _PI_DQ_QUERY *v17; 
  __int64 v18; 
  _GUID *v19; 
  _ETHREAD *v20; 
  _PI_DQ_QUERY v21; 
  __int64 v22; 
  _ETHREAD *v23; 
  _PI_DQ_QUERY **v24; 
  __int64 v25; 
  int v26; 
  _EX_PUSH_LOCK *j; 
  _ETHREAD *v28; 
  char v29; 
  char v30; 
  PVOID P[2]; 
  int v32; 
  _GUID *OriginalId; 
  VOID **v34; 
  char *v35; 
  _GUID ActivityId; 

  OriginalId = 0i64;
  v2 = (_FAST_MUTEX *)((char *)Parameter + 104);
  v35 = (char *)Parameter;
  *(_OWORD *)P = 0i64;
  v3 = (char *)Parameter;
  v30 = 1;
  ActivityId = 0i64;
  v4 = 1;
  v5 = (char *)Parameter + 208;
  do
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v7 = 0i64;
    LODWORD(v8) = 0;
    v34 = 0i64;
    v32 = 0;
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquireResourceExclusiveLite((UINT64)v3, 1, v1);
    ExAcquireFastMutex(v2);
    if( *(char **)v5 == v5 )
    {
      P[1] = P;
      P[0] = P;
    }
    else
    {
      *(_OWORD *)P = *(_OWORD *)v5;
      *((_QWORD *)P[0] + 1) = P;
      *(_QWORD *)P[1] = P;
      *((_QWORD *)v5 + 1) = v5;
      *(_QWORD *)v5 = v5;
    }
    v9 = 0;
    if( (*((_DWORD *)v3 + 57) & 2) == 0 )
      v9 = v4;
    v4 = v9;
    if( v9 )
    {
      LODWORD(v8) = *((_DWORD *)v3 + 56);
      v32 = v8;
      if( (_DWORD)v8 )
      {
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 8i64 * (unsigned int)v8, 1483763280i64);
        v34 = PoolWithTag;
        v7 = (_PI_DQ_QUERY **)PoolWithTag;
        if( PoolWithTag )
        {
          v11 = 0i64;
          for( i = (volatile signed __int32 *)*((_QWORD *)v3 + 24);
                i != (volatile signed __int32 *)(v3 + 192);
                i = *(volatile signed __int32 **)i )
          {
            if( (unsigned int)v11 >= (unsigned int)v8 )
              goto LABEL_49;
            PoolWithTag[v11] = (VOID *)i;
            v11 = (unsigned int)(v11 + 1);
            _InterlockedIncrement(i + 53);
          }
        }
        else
        {
LABEL_49:
          v4 = 0;
        }
      }
    }
    if( !v4 )
    {
      for( j = (_EX_PUSH_LOCK *)*((_QWORD *)v3 + 24); j != (_EX_PUSH_LOCK *)(v3 + 192); j = (_EX_PUSH_LOCK *)j->_bf_0 )
      {
        v28 = (_ETHREAD *)KeGetCurrentThread();
        --v28->Tcb.KernelApcDisable;
        ExAcquirePushLockExclusiveEx(j + 8, 0i64);
        LODWORD(j[27]._bf_0) |= 1u;
        PiDqQueryFreeActiveData((_PI_DQ_QUERY *)j);
        PiDqQueryCompletePendedIrp((_PI_DQ_QUERY *)j);
        ExReleasePushLockEx((_DWORD)j + 64, 0);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
      }
      *((_DWORD *)v3 + 57) &= ~2u;
      v2 = (_FAST_MUTEX *)(v3 + 104);
    }
    KeReleaseGuardedMutex(v2);
    while( 1 )
    {
      v13 = (_PI_PNPRTL_OBJECT_EVENT **)P[0];
      if( P[0] == P )
        break;
      if( *((PVOID **)P[0] + 1) != P || (v14 = *(_QWORD *)P[0], *(PVOID *)(*(_QWORD *)P[0] + 8i64) != P[0]) )
        __fastfail(3u);
      P[0] = *(PVOID *)P[0];
      *(_QWORD *)(v14 + 8) = P;
      if( v4 && (_DWORD)v8 )
      {
        v15 = v7;
        v16 = OriginalId;
        v8 = (unsigned int)v8;
        do
        {
          v17 = *v15;
          if( *((_QWORD *)*v15 + 28) <= (unsigned __int64)v13[3] )
          {
            v29 = 0;
            if( !PnpIsNullGuid(*((VOID **)v17 + 3)) )
            {
              ActivityId = *(_GUID *)*((_QWORD *)v17 + 3);
              LODWORD(v19) = IoSetActivityIdThread((INT64)&ActivityId);
              v16 = v19;
              v29 = 1;
            }
            if( byte_140C130BA < 0 )
              McTemplateK0p_EtwWriteTransfer(
                v18,
                (const _EVENT_DESCRIPTOR *)KMPnPEvt_DevQuery_ProcessingStart,
                *((const _GUID **)v17 + 3),
                v17);
            v20 = (_ETHREAD *)KeGetCurrentThread();
            --v20->Tcb.KernelApcDisable;
            ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v17 + 8, 0i64);
            v21 = v17[54];
            ExReleasePushLockEx((_DWORD)v17 + 64, 0);
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
            if( (v21 & 9) == 0 )
            {
              PiDqQueryApplyObjectEvent(v17, v13[2]);
              v23 = (_ETHREAD *)KeGetCurrentThread();
              --v23->Tcb.KernelApcDisable;
              ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v17 + 8, 0i64);
              if( (v17[54] & 1) != 0 || *((_PI_DQ_QUERY **)v17 + 24) != v17 + 48 )
                PiDqQueryCompletePendedIrp(v17);
              ExReleasePushLockEx((_DWORD)v17 + 64, 0);
              KeLeaveCriticalRegionThread(KeGetCurrentThread());
            }
            if( byte_140C130BA < 0 )
              McTemplateK0p_EtwWriteTransfer(
                v22,
                (const _EVENT_DESCRIPTOR *)KMPnPEvt_DevQuery_ProcessingStop,
                *((const _GUID **)v17 + 3),
                v17);
            if( v29 )
              IoClearActivityIdThread(v16);
          }
          ++v15;
          --v8;
        }
        while( v8 );
        v3 = v35;
        LODWORD(v8) = v32;
        OriginalId = v16;
        v7 = (_PI_DQ_QUERY **)v34;
      }
      PiPnpRtlObjectEventRelease(v13[2]);
      ExFreePoolWithTag(v13, 0x58706E50u);
    }
    if( v7 )
    {
      if( (_DWORD)v8 )
      {
        v24 = v7;
        v25 = (unsigned int)v8;
        do
        {
          PiDqQueryRelease(*v24++);
          --v25;
        }
        while( v25 );
      }
      ExFreePoolWithTag(v7, 0x58706E50u);
    }
    v2 = (_FAST_MUTEX *)(v3 + 104);
    ExAcquireFastMutex((PFAST_MUTEX)(v3 + 104));
    v5 = v3 + 208;
    if( *(char **)v5 == v5 )
    {
      v26 = *((_DWORD *)v3 + 57);
      if( (v26 & 2) == 0 )
      {
        v30 = 0;
        *((_DWORD *)v3 + 57) = v26 & 0xFFFFFFFE;
      }
    }
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v3 + 104));
    ExReleaseResourceLite((PERESOURCE)v3);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  while( v30 );
}

Referenced by:

No references.