windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/suda2000.cpp
2020-09-26 16:20:57 +08:00

91 lines
2.1 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Suda2000.cpp
Abstract:
Call to GetTempPathA is not getting enough buffer and it is returning some
garbage value, so GetTempFileNameA fails. This hooked API, GetTempPathA
returns a constant string "%temp%". GetTempFileNameA expands the environment
variable ("%temp%") and returns a valid path name.
History:
06/15/2001 mamathas Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(Suda2000)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(GetTempPathA)
APIHOOK_ENUM_ENTRY(GetTempFileNameA)
APIHOOK_ENUM_END
/*++
This stub function intercepts all calls to GetTempPathA and sets lpBuffer[out]
with a constant string "%temp%" and returns the length.
--*/
DWORD
APIHOOK(GetTempPathA)(
DWORD nBufferLength,
LPSTR lpBuffer
)
{
LOGN(eDbgLevelError,
"GetTempPathA: Returns invalid Temp Path (%S)\n Changed to %tmp%", lpBuffer);
_tcscpy(lpBuffer, "%temp%");
return 6; // returns the length of "%temp%"
}
/*++
This stub function intercepts all calls to GetTempFileNameA and sets lpPathName
with valid path and then calls the original API.
--*/
UINT
APIHOOK(GetTempFileNameA)(
LPCTSTR lpPathName, // directory name
LPCTSTR lpPrefixString, // file name prefix
UINT uUnique, // integer for use in creating the temporary file name
LPTSTR lpTempFileName // file name buffer
)
{
CHAR szDestinationString[MAX_PATH];
ZeroMemory(szDestinationString, MAX_PATH);
ExpandEnvironmentStringsA((LPCSTR)lpPathName, (LPSTR)szDestinationString, MAX_PATH);
LOGN(eDbgLevelInfo,
"ExpandEnvironmentStringsA: Returned the value of environment variable, \"%temp%\" = (%S) ", szDestinationString);
return ORIGINAL_API(GetTempFileNameA)((LPCSTR)szDestinationString, (LPCSTR)lpPrefixString,uUnique,(LPSTR)lpTempFileName);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, GetTempPathA)
APIHOOK_ENTRY(KERNEL32.DLL, GetTempFileNameA)
HOOK_END
IMPLEMENT_SHIM_END