I have setup a dll injection to hook swapbuffers in gdi32.dll.
The injection works great and triggers my hook_swapbuffers() function.
I want the hook_swapbuffers to put an overlay (for now a red semi transparent quad) on top of the victim process - in this case an opengl based game.
hook_swapbuffers() calls the following:
// initialise gl states
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearDepth(1.0f);
glDisable(GL_DEPTH_TEST);
glDepthFunc(GL_ALWAYS);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
// Draw
glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glPushMatrix(); // store current matrix settings
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// set the limits of our ortho projection
glOrtho(-1.0, 1.0, -1.0, 1.0, 0.1, 100);
glBegin(GL_QUADS);
glColor4f(1.0f, 0.0f, 0.0f, 0.5f); // Red
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f(1.0f, -1.0f, 1.0f);
glEnd();
glPopMatrix(); // restore original matrix
// Cleanup gl states
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
It then calls the normal SwapBuffers function.
If I comment out my games draw calls, the hook draw works great and I get a red semi-transparent screen aligned quad rendered over my game (as all draws are commented out, the game is effectively a black canvas, now dark red with my quad overlayed).
Unfortunately the minute I put my games draws back in, my screen aligned quad no longer renders??? I can set the glClear to clear the colour buffer and that occurs correctly, so the hook is working and opengl is taking on the commands from the hook.
I'm thinking I have some rogue state from the game affecting the draws in the hook function. Maybe the viewport/camera or some bound data that doesn't need to exist for my hook test.
Any help or pointers will be greatly received.