91 lines
2.2 KiB
C++
91 lines
2.2 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);
|
||
|
|
||
|
StringCchCopyA(lpBuffer, nBufferLength, "%temp%");
|
||
|
|
||
|
return strlen(lpBuffer);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
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
|