2025-04-27 07:49:33 -04:00

153 lines
3.3 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
ShimMechanismVerificationTest1.cpp
Abstract:
This DLL serves as a test for the shim michanism.
Notes:
History:
11/13/2000 diaaf Created
11/27/2000 diaaf modified to support the new macros.
04/02/2001 diaaf modified to support the new macros.
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(ShimMechanismVerificationTest1)
#include "ShimHookMacroEx.h"
//
// Add APIs that you wish to hook to this macro construction.
//
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(GetCommandLineA)
APIHOOK_ENUM_ENTRY(GetCommandLineW)
APIHOOK_ENUM_END
//
// Global Variables
//
CHAR *gszCommandLineA1;
WCHAR *gwcsCommandLineW1;
/*++
This stub function intercepts all calls to GetCommandLineA
and appends "1" to the returned string.
--*/
LPSTR APIHOOK(GetCommandLineA)()
{
CHAR szAppendValue[] = "1";
LPSTR szReturnValue;
DPF("ShimMechanismVerificationTest1", eDbgLevelInfo,
"GetCommandLineA called.\n");
szReturnValue = ORIGINAL_API(GetCommandLineA)();
gszCommandLineA1 = (CHAR*)LocalAlloc(LPTR, strlen(szReturnValue)
+ strlen(szAppendValue) + sizeof(CHAR));
strcpy(gszCommandLineA1, szReturnValue);
strcat(gszCommandLineA1, szAppendValue);
LOG("ShimMechanismVerificationTest1", eDbgLevelWarning,
"GetCommandLineA is returning \"%S\".", gszCommandLineA1);
return gszCommandLineA1;
}
/*++
This stub function intercepts all calls to GetCommandLineW
and appends "1" to the returned string.
--*/
LPWSTR APIHOOK(GetCommandLineW)()
{
WCHAR wszAppendValue[] = L"1";
LPWSTR wszReturnValue;
DPF("ShimMechanismVerificationTest1", eDbgLevelInfo,
"GetCommandLineW called.\n");
wszReturnValue = ORIGINAL_API(GetCommandLineW)();
gwcsCommandLineW1 = (WCHAR*)LocalAlloc(LPTR, wcslen(wszReturnValue)
+ wcslen(wszAppendValue) + sizeof(WCHAR));
wcscpy(gwcsCommandLineW1, wszReturnValue);
wcscat(gwcsCommandLineW1, wszAppendValue);
LOG("ShimMechanismVerificationTest1", eDbgLevelWarning,
"GetCommandLineW is returning \"%S\".", gwcsCommandLineW1);
return gwcsCommandLineW1;
}
/*++
Handle DLL_PROCESS_ATTACH and DLL_PROCESS_DETACH in your notify function
to do initialization and uninitialization.
--*/
BOOL
NOTIFY_FUNCTION(
DWORD fdwReason
)
{
if (fdwReason == DLL_PROCESS_ATTACH) {
gszCommandLineA1 = NULL;
gwcsCommandLineW1 = NULL;
DPF("ShimMechanismVerificationTest1", eDbgLevelInfo,
"ShimMechanismVerificationTest1 initialized.");
} else {
if (gszCommandLineA1)
{
LocalFree(gszCommandLineA1);
gszCommandLineA1 = NULL;
}
if (gwcsCommandLineW1)
{
LocalFree(gwcsCommandLineW1);
gwcsCommandLineW1 = NULL;
}
DPF("ShimMechanismVerificationTest1", eDbgLevelInfo,
"ShimMechanismVerificationTest1 uninitialized.");
}
return TRUE;
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
CALL_NOTIFY_FUNCTION
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineA)
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineW)
HOOK_END
IMPLEMENT_SHIM_END