You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.5 KiB
123 lines
3.5 KiB
/****************************** Module Header ******************************\
|
|
* Module Name: clhook.c
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* Client-side hook code.
|
|
*
|
|
* 05-09-1991 ScottLu Created.
|
|
* 08-Feb-1992 IanJa Unicode/ANSI
|
|
\***************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
/***************************************************************************\
|
|
* SetWindowsHookExAW
|
|
*
|
|
* Client side routine for SetWindowsHookEx(). Needs to remember the library
|
|
* name since hmods aren't global. Remembers the hmod as well so that
|
|
* it can be used to calculate pfnFilter in different process contexts.
|
|
*
|
|
* History:
|
|
* 05-15-91 ScottLu Created.
|
|
\***************************************************************************/
|
|
|
|
HHOOK SetWindowsHookExAW(
|
|
int idHook,
|
|
HOOKPROC lpfn,
|
|
HINSTANCE hmod,
|
|
DWORD dwThreadID,
|
|
DWORD dwFlags)
|
|
{
|
|
WCHAR pwszLibFileName[MAX_PATH];
|
|
|
|
/*
|
|
* If we're passing an hmod, we need to grab the file name of the
|
|
* module while we're still on the client since module handles
|
|
* are NOT global.
|
|
*/
|
|
if (hmod != NULL) {
|
|
if (GetModuleFileNameW(hmod,
|
|
pwszLibFileName,
|
|
ARRAY_SIZE(pwszLibFileName)) == 0) {
|
|
|
|
/*
|
|
* hmod is bogus - return NULL.
|
|
*/
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
return _SetWindowsHookEx(hmod,
|
|
(hmod == NULL) ? NULL : pwszLibFileName,
|
|
dwThreadID, idHook, (PROC)lpfn, dwFlags);
|
|
}
|
|
|
|
/***************************************************************************\
|
|
* SetWindowsHookA,
|
|
* SetWindowsHookW
|
|
*
|
|
* ANSI and Unicode wrappers for NtUserSetWindowsHookAW(). Could easily be macros
|
|
* instead, but do we want to expose NtUserSetWindowsHookAW() ?
|
|
*
|
|
* History:
|
|
* 30-Jan-1992 IanJa Created
|
|
\***************************************************************************/
|
|
|
|
|
|
FUNCLOG2(LOG_GENERAL, HHOOK, WINAPI, SetWindowsHookA, int, nFilterType, HOOKPROC, pfnFilterProc)
|
|
HHOOK
|
|
WINAPI
|
|
SetWindowsHookA(
|
|
int nFilterType,
|
|
HOOKPROC pfnFilterProc)
|
|
{
|
|
return NtUserSetWindowsHookAW(nFilterType, pfnFilterProc, HF_ANSI);
|
|
}
|
|
|
|
|
|
|
|
FUNCLOG2(LOG_GENERAL, HHOOK, WINAPI, SetWindowsHookW, int, nFilterType, HOOKPROC, pfnFilterProc)
|
|
HHOOK
|
|
WINAPI
|
|
SetWindowsHookW(
|
|
int nFilterType,
|
|
HOOKPROC pfnFilterProc)
|
|
{
|
|
return NtUserSetWindowsHookAW(nFilterType, pfnFilterProc, 0);
|
|
}
|
|
|
|
|
|
/***************************************************************************\
|
|
* SetWindowsHookExA,
|
|
* SetWindowsHookExW
|
|
*
|
|
* ANSI and Unicode wrappers for SetWindowsHookExAW(). Could easily be macros
|
|
* instead, but do we want to expose SetWindowsHookExAW() ?
|
|
*
|
|
* History:
|
|
* 30-Jan-1992 IanJa Created
|
|
\***************************************************************************/
|
|
|
|
FUNCLOG4(LOG_GENERAL, HHOOK, WINAPI, SetWindowsHookExA, int, idHook, HOOKPROC, lpfn, HINSTANCE, hmod, DWORD, dwThreadId)
|
|
HHOOK WINAPI SetWindowsHookExA(
|
|
int idHook,
|
|
HOOKPROC lpfn,
|
|
HINSTANCE hmod,
|
|
DWORD dwThreadId)
|
|
{
|
|
return SetWindowsHookExAW(idHook, lpfn, hmod, dwThreadId, HF_ANSI);
|
|
}
|
|
|
|
|
|
FUNCLOG4(LOG_GENERAL, HHOOK, WINAPI, SetWindowsHookExW, int, idHook, HOOKPROC, lpfn, HINSTANCE, hmod, DWORD, dwThreadId)
|
|
HHOOK WINAPI SetWindowsHookExW(
|
|
int idHook,
|
|
HOOKPROC lpfn,
|
|
HINSTANCE hmod,
|
|
DWORD dwThreadId)
|
|
{
|
|
return SetWindowsHookExAW(idHook, lpfn, hmod, dwThreadId, 0);
|
|
}
|
|
|