Quote: "It doesn't involve locking the main surface and individual pixel writes does it?"
No, that would be really slow.
So, just technically using DirectX:
1) You need to create a texture with your image (D3DXLoadTextureFromFile or something like that, don't have time to search that right now)
2) Create a quad (rectangle if you want) out of two triangles which you will use to render the image (using Direct3DDevice9::CreateVertexBuffer call - or some similar)
3) Create a shader in which you place the quad vertices to exact screen coordinates (you can set those coordinates as a shader constants) - unfortunately, in DX9 you must obey specific rules for pixel perfect matching (but you can start out without that and add that later) .. here you can use GDK stuff for loading the shader, but you have to write it on your own
4) Set up your shader (in GDK or Direct3D), the texture (in Direct3D) and render the quad (using Direct3DDevice9:
rawPrimitive)
You are almost done, but it is possible that you will have to experiment a bit so that your image is not hidden by sprites rendered by GDK.
Hope this helps, I can't elaborate more right now, ask if you need, but you can find most info in DirectX documentation which you installed with the SDK.