PiDetermineDeleteType

NTSTATUS __stdcall PiDetermineDeleteType(INT64 a1){
  __int64 v1; 
  __int64 v2; 
  __int64 v3; 
  NTSTATUS v4; 
  int v5; 

  v1 = *(_QWORD *)(a1 + 152);
  if( v1 )
    v2 = *(_QWORD *)(*(_QWORD *)(v1 + 312) + 40i64);
  else
    v2 = 0i64;
  v3 = *(_QWORD *)(a1 + 112) - *(_QWORD *)&GUID_DEVICE_EJECT.Data1;
  if( !v3 )
    v3 = *(_QWORD *)(a1 + 120) - *(_QWORD *)GUID_DEVICE_EJECT.Data4;
  v4 = 4;
  if( v3 )
  {
    if( (*(_DWORD *)(a1 + 144) & 4) != 0 )
    {
      v5 = *(_DWORD *)(v2 + 304);
      if( (*(_DWORD *)(v2 + 396) & 0x10) != 0 )
      {
        if( v5 <= 774 || v5 >= 780 || v5 == 777 )
          return 6;
        else
          return 5;
      }
      else if( v5 != 777 && v5 > 774 && v5 < 780 || (*(_DWORD *)(*(_QWORD *)(v1 + 312) + 32i64) & 4) != 0 )
      {
        return 3;
      }
      else
      {
        return 2;
      }
    }
    else
    {
      return 0;
    }
  }
  return v4;
}

Referenced by:

PnpProcessQueryRemoveAndEject