Bob Moore's Coding Tips

4. Why doesn't my system wide hook capture all processes ?

The usual reason for system-wide hooks not operating systemically is that an essential piece of data (usually, but not always retricted to, the HHOOK) is not stored in a shared section, so each loaded instance of the DLL has a different value for the variable, and only one (in the address space of the initial loader app) has the right value and behaves as expected.

So, to create a shared section :

1. Use a pragma in your DLL code to specify the shared variables :

#pragma data_seg(".SHRDATA")
HWND hWndMain = 0;
HHOOK hKeybdHook = NULL ;
BOOL bSomeFlagOrOther = FALSE;
#pragma data_seg()

Note that shared variables *MUST* be initialised.

2. Create a DEF file with the following in it :

SECTIONS
.SHRDATA READ WRITE SHARED

Where the section name matches that in your pragma above. If having a
DEF file offends you, you can specify the section in a linker command
parameter (see the docs for the linker).

Back to tips