We just discovered that DDSURFACEDESC2 in ddraw.h contains a LPVOID member. So if you are using this struct to manually read DDS files, the fields that follow the LPVOID member will be off in a 64-bit build, since LPVOID has a different size in 64 and 32 bit. Among the fields that follow are the caps bits which describe whether the file has a cube or volume texture.
The fix (or workaround) is to enforce a 32-bit version of the struct at all times when reading, as in the DDSWithoutD3DX sample.