I've now run numerous tests on DirectDraw.
The following conditions do not result in an attempted write to the surface pointer: - Null surface descriptor (returns E_INVALIDARG) - Wrong surface descriptor size (returns E_INVALIDARG) - Unset cooperative level (returns DDERR_NOCOOPERATIVELEVELSET)
The following conditions do result in an attempted write to the surface pointer: - Tried to create explicit frontbuffer (returns DDERR_INVALIDCAPS if NULL was written to the surface pointer and E_INVALIDARG if the write failed) - Requested surface with zero width or zero height (returns E_INVALIDARG)
None of the above conditions increments the IDirectDraw7 refcount.
So, we can try to write NULL to the surface pointer before the explicit frontbuffer/backbuffer and zero width/height checks, and that should give us behavior that is indistinguishable from Windows.
-Alex