Intercepting GDI calls

Roderick Colenbrander thunderbird2k at
Fri Feb 12 03:24:35 CST 2010

On Fri, Feb 12, 2010 at 8:01 AM, Charles Davis <cdavis at> wrote:
> Jui-Hao Chiang wrote:
>> Hi, all:
>> I am currently starting a project which tries to run a window
>> application on one (source) machine, and display on another
>> (destination) machine. Of course, the VNC or X11 forwarding technique
>> can achieve the same goal, but I am trying to reduce the bandwidth by
>> "not" transferring the video frame buffer but transfer the GDI
>> function calls instead.
> Uhhh... That's kinda how X11 works. I mean, sending drawing and
> windowing calls as opposed to transferring the entire FB.
> What do you hope to accomplish with this? Given what I just told you,
> why won't X11 suffice?
>> The way I can see is try to intercept all the calls inside gdi32.dll,
>> and forward the calls and parameters to remote machine by using some
>> RPC library, and then replay the GDI calls on the destination machine.
>> However, I have two doubts:
>> (1) It seems like the user32.dll is actually handling the window,
>> menu, and cursor.
> That's right.
>  Does the drawing of menu and cursor depends on
>> user-level gdi32.dll?
> Yes it does. But bear in mind that gdi32 doesn't know how to draw menus
> and cursors, and other things. It only draws what you tell it to draw.
> You have to specify what you want to draw in terms of primitive shapes.
> That's what user32 does.
> or other kernel-level dlls?
> What kernel-level DLLs? Wine is entirely user mode. Don't let the
> presence of "ntoskrnl.exe" fool you; that's done in user mode, too :).
>> (2) It seems that there is no corresponding win32k.sys implementation
>> in wine, and the user-level GDI calls seems to be forwarded to
>> winex11.drv, right?
> That's correct. (In the future, that might change, especially on a
> certain OS made by a company named after fruit. But rest assured,
> there's not going to be a win32k.sys implementation anytime soon.)
>> I wander is there any good way or a place inside the source to do this
>> kind of interception?
> If you really want to go through with this, what you want to do is write
> your own driver, similar to winex11.drv. In fact, I suggest using it as
> a base. Then you can forward the calls to some other machine (running
> Windows or some other OS) with RPC or some such mechanism.
> Chip

I also agree that you are basically trying to duplicate X11. It is a
lot of work to emulate all gdi32 / user32 calls yourself. Further I
doubt you can achieve similar performance as X11.

I would investigate in better X11 encryption methods. Have you thought
about using NX server? It reduces bandwidth a lot compared to plain


More information about the wine-devel mailing list