docs: @Override
      protected int readBytesWireFormat ( byte[] buffer, int bufferIndex ) throws SMBProtocolDecodingException {
          int start = bufferIndex;
          int structureSize = SMBUtil.readInt2(buffer, bufferIndex);
  
          if ( structureSize != 89 ) {
              throw new SMBProtocolDecodingException("Structure size is not 89");
          }
  
          this.oplockLevel = buffer[ bufferIndex + 2 ];
          this.openFlags = buffer[ bufferIndex + 3 ];
          bufferIndex += 4;
  
          this.createAction = SMBUtil.readInt4(buffer, bufferIndex);
          bufferIndex += 4;
  
          this.creationTime = SMBUtil.readTime(buffer, bufferIndex);
          bufferIndex += 8;
          this.lastAccessTime = SMBUtil.readTime(buffer, bufferIndex);
          bufferIndex += 8;
          this.lastWriteTime = SMBUtil.readTime(buffer, bufferIndex);
          bufferIndex += 8;
          this.changeTime = SMBUtil.readTime(buffer, bufferIndex);
          bufferIndex += 8;
  
          this.allocationSize = SMBUtil.readInt8(buffer, bufferIndex);
          bufferIndex += 8;
          this.endOfFile = SMBUtil.readInt8(buffer, bufferIndex);
          bufferIndex += 8;
  
          this.fileAttributes = SMBUtil.readInt4(buffer, bufferIndex);
          bufferIndex += 4;
          bufferIndex += 4; // Reserved2
  
          System.arraycopy(buffer, bufferIndex, this.fileId, 0, 16);
          bufferIndex += 16;
  
          int createContextOffset = SMBUtil.readInt4(buffer, bufferIndex);
          bufferIndex += 4;
          int createContextLength = SMBUtil.readInt4(buffer, bufferIndex);
          bufferIndex += 4;
  
          if ( createContextOffset > 0 && createContextLength > 0 ) {
              List<CreateContextResponse> contexts = new LinkedList<>();
              int createContextStart = getHeaderStart() + createContextOffset;
              int next = 0;
              do {
                  int cci = createContextStart;
                  next = SMBUtil.readInt4(buffer, cci);
                  cci += 4;
  
                  int nameOffset = SMBUtil.readInt2(buffer, cci);
                  int nameLength = SMBUtil.readInt2(buffer, cci + 2);
                  cci += 4;
  
                  int dataOffset = SMBUtil.readInt2(buffer, cci + 2);
                  cci += 4;
                  int dataLength = SMBUtil.readInt4(buffer, cci);
                  cci += 4;
  
                  byte[] nameBytes = new byte[nameLength];
                  System.arraycopy(buffer, createContextStart + nameOffset, nameBytes, 0, nameBytes.length);
                  cci = Math.max(cci, createContextStart + nameOffset + nameLength);
  
                  CreateContextResponse cc = createContext(nameBytes);
                  if ( cc != null ) {
                      cc.decode(buffer, createContextStart + dataOffset, dataLength);
                      contexts.add(cc);
                  }
  
                  cci = Math.max(cci, createContextStart + dataOffset + dataLength);
  
                  if ( next > 0 ) {
                      createContextStart += next;
                  }
                  bufferIndex = Math.max(bufferIndex, cci);
              }
              while ( next > 0 );
              this.createContexts = contexts.toArray(new CreateContextResponse[0]);
          }
  
          if ( log.isDebugEnabled() ) {
              log.debug("Opened " + this.fileName + ": " + Hexdump.toHexString(this.fileId));
          }
  
          return bufferIndex - start;
      }