PiProcessCanceledRemoveForReset

INT64 __fastcall PiProcessCanceledRemoveForReset(INT64 a1, INT64 rdx0, UINT64 **r8_0, INT64 *r9_0){
  unsigned int v4; 
  ULONG_PTR v5; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  DEVICE_OBJECT *v12; 
  __int64 v13; 
  _QWORD a3[2]; 
  int a4; 
  __int64 a2; 
  v4 = 0;
  v5 = (int)a1;
  a3[0] = 0i64;
  a4 = 0;
  a2 = 1i64;
  while( IopEnumerateRelations((unsigned int **)r8_0, (int *)&a2, a3, 0i64, 0i64) )
  {
    if( a3[0] )
      v9 = *(_QWORD *)(*(_QWORD *)(a3[0] + 312i64) + 40i64);
    else
      v9 = 0i64;
    if( v9 )
      *(_DWORD *)(v9 + 704) &= ~2u;
  }
  if( *(_DWORD *)*r8_0 == 1 )
  {
    v10 = *(_QWORD *)(rdx0 + 152);
    if( v10 )
      v11 = *(_QWORD *)(*(_QWORD *)(v10 + 312) + 40i64);
    else
      v11 = 0i64;
    if( *(_DWORD *)(v11 + 300) == 788 )
      KeBugCheckEx(0xCAu, 0xEui64, v5, *(int *)r9_0, (ULONG_PTR)r8_0);
    *(_DWORD *)(v10 + 48) |= 0x4000000u;
    IopQueryDeviceState((DEVICE_OBJECT *)v10, 0i64);
  }
  else if( (*(_BYTE *)(*(_QWORD *)(rdx0 + 40) + 216i64) & 1) != 0 && *(_DWORD *)r9_0 == 5
         || (*(_DWORD *)(*(_QWORD *)(rdx0 + 40) + 216i64) & 2) != 0 )
  {
    a2 = 1i64;
    while( IopEnumerateRelations((unsigned int **)r8_0, (int *)&a2, a3, &a4, 0i64) )
    {
      v12 = (DEVICE_OBJECT *)a3[0];
      if( a3[0] )
        v13 = *(_QWORD *)(*(_QWORD *)(a3[0] + 312i64) + 40i64);
      else
        v13 = 0i64;
      if( a4 != 1 && *(_DWORD *)(v13 + 300) != 788 )
      {
        *(_DWORD *)(a3[0] + 48i64) |= 0x4000000u;
        IopQueryDeviceState(v12, 0i64);
      }
    }
  }
  else
  {
    return(unsigned int)-2147483608;
  }
  return v4;
}

Referenced by:

PnpProcessQueryRemoveAndEject