[This is preliminary documentation and is subject to change.]
Treat this stream like any other; Read(array<Byte>(), Int32, Int32), Write(array<Byte>(), Int32, Int32), Seek(Int64, SeekOrigin) all work normally (or close enough) in most cases. There are some specific exceptions, which shouldn't be a problem normally, outlined below.
When reading, if the underlying stream does not report a length itself, the value reported by Length represents the amount buffered. The attempts to keep the Length beyond the current seek location at all times.
when reading, Seek(Int64, SeekOrigin) will operate normally but only within the data already buffered; attempts to seek beyond this will raise an exception. There is no way to force a certain amount of data to be buffered.
When writing, to cause all buffered data to be written to the underlying stream, call RealFlush()()()(). This non-standard behavior is due to unfortunate existing code which calls Flush()()()() after writing to a Stream, which would otherwise cause us a problem with write-once underlying streams (which we're specifically trying to support here).