http://bugs.winehq.org/show_bug.cgi?id=23765
--- Comment #3 from Stefan Dösinger stefan@codeweavers.com --- I investigated this problem. Fraps mostly works for OpenGL applications. For d3d-based apps there are a number of problems:
1) IDirect3DDevice9::PresentEx, IDirect3DSwapChain8::Present, IDirectDrawSurface::Unlock/Blt/Flip need DECLSPEC_HOTPATCH. This is fairly easy to fix.
2) Fraps assumes that IDirect3DDevice8::Present calls IDirect3DSwapChain8::Present. Fixable. It also assumes that IDirectDrawSurface7 calls back to DirectDrawSurface1 rather than the other way around. Also fixable, but needs some more checks.
3) Fraps assumes that the offset of functions inside ddraw, d3d8 and d3d9 is constant. It calculates IDirect3DSwapChain9::Present - d3d9_handle in its main process, sends this address to the injection DLL inside the client app and hooks client_d3d9_handle + offset.
The last problem is tricky to fix. A workaround is to give ddraw, d3d8 and d3d9 (and later on d3d10 and d3d11) fixed load addresses. Alexandre already said no to this approach.
Another workaround might be to use the offset between IDirect3DCreate9 and hooked functions. This is something the Fraps maintainers have to do though. I have suggested this idea to them. I guess it isn't a guarantee either, but more likely to work because both address are in the code area of the d3d9 binary.