PnpHandleEnumerateHandlesAgainstPdoStack

__int64 __fastcall PnpHandleEnumerateHandlesAgainstPdoStack(PVOID Object, __int64 a2, __int64 a3){
  PVOID v4; 
  INT64 v5; 
  unsigned int v6; 
  INT64 v7; 
  UINT8 v8; 
  __int64 v9; 
  _DEVICE_OBJECT *v10; 
  UINT8 v11; 
  INT64 v12; 
  INT64 v13; 
  _DEVICE_OBJECT *DeviceAttachmentBaseRefWithTag; 
  UINT8 v15; 
  void *v16; 
  UINT8 v17; 

  v4 = Object;
  ObfReferenceObjectWithTag(Object, 0x746C6644ui64);
  while( 1 )
  {
    v6 = PnpHandleEnumerateHandlesAgainstDeviceObject((__int64)v4, (__int64)PnpCollectOpenHandlesCallBack, a3);
    if( v6 )
      break;
    v8 = KeAcquireQueuedSpinLock(9i64, v5, v7);
    v9 = *((_QWORD *)v4 + 7);
    v10 = 0i64;
    v11 = v8;
    if( v9 )
    {
      v10 = *(_DEVICE_OBJECT **)(v9 + 8);
      if( v10 )
        ObfReferenceObjectWithTag(*(VOID **)(v9 + 8), 0x746C6644ui64);
    }
    KeReleaseQueuedSpinLock(LockQueueIoVpbLock, v11);
    if( v10 )
    {
      DeviceAttachmentBaseRefWithTag = IoGetDeviceAttachmentBaseRefWithTag(v10, 0x746C6644ui64);
      v6 = PnpHandleEnumerateHandlesAgainstDeviceObject(
             (__int64)DeviceAttachmentBaseRefWithTag,
             (__int64)PnpCollectOpenHandlesCallBack,
             a3);
      ObfDereferenceObjectWithTag(DeviceAttachmentBaseRefWithTag, 0x746C6644ui64);
      ObfDereferenceObjectWithTag(v10, 0x746C6644ui64);
      if( v6 )
        break;
    }
    v15 = KeAcquireQueuedSpinLock(10i64, v12, v13);
    v16 = (void *)*((_QWORD *)v4 + 3);
    v17 = v15;
    if( v16 )
      ObfReferenceObjectWithTag(*((VOID **)v4 + 3), 0x746C6644ui64);
    KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v17);
    ObfDereferenceObjectWithTag(v4, 0x746C6644ui64);
    v4 = v16;
    if( !v16 )
      return v6;
  }
  ObfDereferenceObjectWithTag(v4, 0x746C6644ui64);
  return v6;
}

Referenced by:

PnpCollectOpenHandles