Because system libraries (KERNEL32, USER32, GDI32, ADVAPI32, ...) of Windows 9x are located in kernel space (better in shared area between 80000000H and C0000000H) it is not possible to hook them normally. When you use HOOK_HARD flag (of course together with other flags) then system libraries can be hooked. But because these modules lay in shared area the hooks apply to every process. What does it mean? 1) Hooks.dll should be located in shared memory too. Such a dll can be created as follows: a) All writeable sections must have SHARED flag (0x10000000) set. b) Image base should be between 80000000H and C0000000H (you can set it for example equal to KERNEL32's image base). 2) Hooks are global. You can't use handles and other process specific "values" because you don't have to be in "your" process actually. To make hooks pseudolocal follow this: a) In DllMain save current process ID (GetCurrentProcessId) b) And then compare this saved ID with current process ID inside hook procedure. 3) Unhooking is required. When unhooking fails, the process with hooks must not exit. Otherwise APIs after Hooks.dll freeing will point to undefined space.