docs: @Override
      public List<FileNotifyInformation> watch () throws CIFSException {
          if ( !this.handle.isValid() ) {
              throw new SmbException("Watch was broken by tree disconnect");
          }
          try ( SmbTreeHandleImpl th = this.handle.getTree() ) {
  
              CommonServerMessageBlockRequest req;
              NotifyResponse resp = null;
              if ( th.isSMB2() ) {
                  Smb2ChangeNotifyRequest r = new Smb2ChangeNotifyRequest(th.getConfig(), this.handle.getFileId());
                  r.setCompletionFilter(this.filter);
                  r.setNotifyFlags(this.recursive ? Smb2ChangeNotifyRequest.SMB2_WATCH_TREE : 0);
                  req = r;
              }
              else {
                  if ( !th.hasCapability(SmbConstants.CAP_NT_SMBS) ) {
                      throw new SmbUnsupportedOperationException("Not supported without CAP_NT_SMBS");
                  }
  
                  /*
                   * NtTrans Notify Change Request / Response
                   */
                  req = new NtTransNotifyChange(th.getConfig(), this.handle.getFid(), this.filter, this.recursive);
                  resp = new NtTransNotifyChangeResponse(th.getConfig());
              }
  
              if ( log.isTraceEnabled() ) {
                  log.trace("Sending NtTransNotifyChange for " + this.handle);
              }
              try {
                  resp = th.send(req, resp, RequestParam.NO_TIMEOUT, RequestParam.NO_RETRY);
              }
              catch ( SmbException e ) {
                  if ( e.getNtStatus() == 0xC0000120 ) {
                      // cancelled
                      log.debug("Request was cancelled", e);
                      return null;
                  }
                  throw e;
              }
              if ( log.isTraceEnabled() ) {
                  log.trace("Returned from NtTransNotifyChange " + resp.getErrorCode());
              }
  
              if ( !resp.isReceived() ) {
                  throw new CIFSException("Did not receive response");
              }
  
              if ( resp.getErrorCode() == 0x10B ) {
                  this.handle.markClosed();
              }
              if ( resp.getErrorCode() == 0x10C ) {
                  resp.getNotifyInformation().clear();
              }
              return resp.getNotifyInformation();
          }
      }