172 lines
5 KiB
C++
172 lines
5 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
SampleShim_Old.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This DLL serves as a template for the creation of shim DLLs. Follow
|
||
|
the commenting/coding style of this source file wherever possible.
|
||
|
Never use tabs, configure your editor to insert spaces instead of
|
||
|
tab characters.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is a sample DLL.
|
||
|
|
||
|
This shim is a museum piece, it nolonger compiles.
|
||
|
|
||
|
History:
|
||
|
|
||
|
02/02/2000 markder Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "ShimHook.h"
|
||
|
|
||
|
// Add APIs that you wish to hook to this enumeration. The first one
|
||
|
// must have "= USERAPIHOOKSTART", and the last one must be
|
||
|
// APIHOOK_Count.
|
||
|
enum
|
||
|
{
|
||
|
APIHOOK_MessageBoxA = USERAPIHOOKSTART,
|
||
|
APIHOOK_MessageBoxW,
|
||
|
APIHOOK_Count
|
||
|
};
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function intercepts all calls to MessageBoxA
|
||
|
and prefixes the output string with "SampleShim says:".
|
||
|
|
||
|
Note that all Win32 APIs use __stdcall calling conventions, so
|
||
|
you must be sure to have this set in MSVC++. Go to Projects|Settings,
|
||
|
C/C++ tab, select Category: "Code Generation" from dropdown, make
|
||
|
sure "Calling convention" is set to __stdcall.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
int
|
||
|
APIHook_MessageBoxA(
|
||
|
HWND hWnd, // handle to owner window
|
||
|
LPCSTR lpText, // text in message box
|
||
|
LPCSTR lpCaption, // message box title
|
||
|
UINT uType // message box style
|
||
|
)
|
||
|
{
|
||
|
// Declare all local variables at top of function. Always use
|
||
|
// Hungarian notation as follows:
|
||
|
//
|
||
|
// Type Scope
|
||
|
// ----------------------- ------------------
|
||
|
// Pointers p Global g_
|
||
|
// DWORD dw Class member m_
|
||
|
// LONG l Static s_
|
||
|
// ANSI strings sz
|
||
|
// Wide-char strings wsz
|
||
|
// Arrays rg
|
||
|
//
|
||
|
int iReturnValue;
|
||
|
LPSTR szNewOutputString;
|
||
|
CHAR szPrefix[] = "SampleShim says: ";
|
||
|
|
||
|
// All string alterations must be done in new memory. Never
|
||
|
// alter a passed-in string in-place.
|
||
|
szNewOutputString = (LPSTR) malloc( strlen( lpText ) +
|
||
|
strlen( szPrefix ) + 1 );
|
||
|
|
||
|
// Use the DPF macro to print debug strings. See Hooks\inc\ShimDebug.h
|
||
|
// for debug level values. Use eDbgLevelError if an unexpected error occurs
|
||
|
// in your shim code. For informational output, use eDbgLevelUser.
|
||
|
DPF(eDbgLevelUser, "APIHook_MessageBoxA called.\n");
|
||
|
|
||
|
strcpy( szNewOutputString, szPrefix );
|
||
|
strcat( szNewOutputString, lpText );
|
||
|
|
||
|
// Use the LOOKUP_APIHOOK macro to call the original API. You must use
|
||
|
// this so that API chaining and inclusion/exclusion information is
|
||
|
// preserved.
|
||
|
iReturnValue = LOOKUP_APIHOOK(MessageBoxA)( hWnd,
|
||
|
szNewOutputString,
|
||
|
lpCaption,
|
||
|
uType );
|
||
|
|
||
|
|
||
|
free( szNewOutputString );
|
||
|
|
||
|
return iReturnValue;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function intercepts all calls to MessageBoxW
|
||
|
and prefixes the output string with "SampleShim says:".
|
||
|
|
||
|
Note that to make your shim generally applicable, you should include
|
||
|
both ANSI and wide-character versions of your stub function.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
int
|
||
|
APIHook_MessageBoxW(
|
||
|
HWND hWnd, // handle to owner window
|
||
|
LPCWSTR lpText, // text in message box
|
||
|
LPCWSTR lpCaption, // message box title
|
||
|
UINT uType // message box style
|
||
|
)
|
||
|
{
|
||
|
// NEVER use TCHAR variables or tcs-prefixed string manipulation routines.
|
||
|
// Prefix all wide-character string constants with L. Never use _T() or
|
||
|
// TEXT() macros.
|
||
|
int iReturnValue;
|
||
|
LPWSTR wszNewOutputString;
|
||
|
WCHAR wszPrefix[] = L"SampleShim says: ";
|
||
|
|
||
|
// A single line of code should never be more than 80 characters long.
|
||
|
wszNewOutputString = (LPWSTR) malloc( sizeof(WCHAR) *
|
||
|
( wcslen( lpText ) +
|
||
|
wcslen( wszPrefix ) + 1 ) );
|
||
|
|
||
|
DPF(eDbgLevelUser, "APIHook_MessageBoxW called.\n");
|
||
|
|
||
|
// Make sure to use wide-character versions of all string manipulation
|
||
|
// routines where appropriate.
|
||
|
wcscpy( wszNewOutputString, wszPrefix );
|
||
|
wcscat( wszNewOutputString, lpText );
|
||
|
|
||
|
iReturnValue = LOOKUP_APIHOOK(MessageBoxW)( hWnd,
|
||
|
wszNewOutputString,
|
||
|
lpCaption,
|
||
|
uType );
|
||
|
|
||
|
free( wszNewOutputString );
|
||
|
|
||
|
return iReturnValue;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
VOID
|
||
|
InitializeHooks(DWORD fdwReason)
|
||
|
{
|
||
|
if (fdwReason != DLL_PROCESS_ATTACH) return;
|
||
|
|
||
|
// Don't touch this line.
|
||
|
INIT_HOOKS(APIHOOK_Count);
|
||
|
|
||
|
// Add APIs that you wish to hook here. All API prototypes
|
||
|
// must be declared in Hooks\inc\ShimProto.h. Compiler errors
|
||
|
// will result if you forget to add them.
|
||
|
DECLARE_APIHOOK(USER32.DLL, MessageBoxA);
|
||
|
DECLARE_APIHOOK(USER32.DLL, MessageBoxW);
|
||
|
|
||
|
// If you have any more initialization to do, do it here.
|
||
|
}
|