Call of Juarez: Gunslinger's IStream::Stat returns S_OK but nothing is set in the output structure. So we end up with uninitialized stream size value. That is usually a big value, and then attempt to read with IStream::Read() with huge current position results in a crash in memcpy called from game's IStream::Read implementation.
I reproduced what the game is doing on Windows (attaching an ad-hoc test which is probably too weird to be included). In the essence of that, ending up with larger size from ::Stat (either setting it explicitly or having as random) doesn't change anything at all on Windows. The smaller size is favoured. So it seems like Windows gets the size from WMV headers and favours that together with reported stream size. Doing the same in Wine looks problematic. A straightforward trivial way, obtaining the size from stream data, means parsing a patented format which we probably want to avoid in Wine code. The gstreamer part relies on the stream size to be known.
[test.patch](/uploads/5e7d0fd8df971ce3dfb13027433a3aae/test.patch)