199 lines
4.9 KiB
C++
199 lines
4.9 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
BigActionConstruction.cpp
|
||
|
Abstract:
|
||
|
The uninstall was not uninstalling the .lnk files on
|
||
|
the ALLUSER start Menu. This was because the uninstaller
|
||
|
script was not getting the right path.
|
||
|
|
||
|
This is an app specific shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
03/12/2001 prashkud Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(BigActionConstruction)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(FindFirstFileA)
|
||
|
APIHOOK_ENUM_ENTRY(RemoveDirectoryA)
|
||
|
APIHOOK_ENUM_ENTRY(DeleteFileA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
|
||
|
WCHAR g_szAllUsersStartMenu[MAX_PATH];
|
||
|
|
||
|
WCHAR* g_pszFilePath = L"\\Programs\\Big Action Construction";
|
||
|
WCHAR* g_pszReplacementFilePath = L"\\Programs\\Fisher~1\\Big Action Construction";
|
||
|
|
||
|
|
||
|
/*++
|
||
|
This hook replaces the wrong path with the right replacement path.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HANDLE
|
||
|
APIHOOK(FindFirstFileA)(
|
||
|
LPCSTR lpFileName,
|
||
|
LPWIN32_FIND_DATAA lpFindFileData
|
||
|
)
|
||
|
{
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
CString AllUserPath(g_szAllUsersStartMenu);
|
||
|
CString FileName(lpFileName);
|
||
|
// Or D:\Documents And Settings\All Users\Start Menu\g_pszFilePath\*.*
|
||
|
AllUserPath.AppendPath(g_pszFilePath);
|
||
|
AllUserPath.AppendPath(L"*.*");
|
||
|
|
||
|
// If any of the above constructed path match
|
||
|
if (AllUserPath.CompareNoCase(FileName) == 0)
|
||
|
{
|
||
|
// Fill in the replacement path
|
||
|
AllUserPath = g_szAllUsersStartMenu;
|
||
|
AllUserPath.AppendPath(g_szAllUsersStartMenu);
|
||
|
AllUserPath.AppendPath(L"*.*");
|
||
|
|
||
|
DPFN( eDbgLevelInfo, "[Notify] FindFirstFileA \
|
||
|
modified %s to %S",lpFileName, AllUserPath.Get());
|
||
|
|
||
|
return ORIGINAL_API(FindFirstFileA)(AllUserPath.GetAnsi(),lpFindFileData);
|
||
|
}
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
//do nothing
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(FindFirstFileA)(lpFileName,lpFindFileData);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
This hook replaces the wrong path with the right replacement path.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(RemoveDirectoryA)(
|
||
|
LPCSTR lpFileName
|
||
|
)
|
||
|
{
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
CString AllUserPath(g_szAllUsersStartMenu);
|
||
|
CString FileName(lpFileName);
|
||
|
// Or D:\Documents And Settings\All Users\Start Menu\g_pszFilePath
|
||
|
AllUserPath.AppendPath(g_pszFilePath);
|
||
|
|
||
|
if (AllUserPath.CompareNoCase(FileName) == 0)
|
||
|
{
|
||
|
// Fill in the replacement path
|
||
|
AllUserPath = g_szAllUsersStartMenu;
|
||
|
AllUserPath.AppendPath(g_szAllUsersStartMenu);
|
||
|
|
||
|
DPFN( eDbgLevelInfo, "[Notify] RemoveDirectoryA \
|
||
|
modified %s to %S", lpFileName, AllUserPath.Get());
|
||
|
|
||
|
return ORIGINAL_API(RemoveDirectoryA)(AllUserPath.GetAnsi());
|
||
|
}
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
//do nothing
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(RemoveDirectoryA)(lpFileName);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
This hook replaces the wrong path with the right replacement path.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(DeleteFileA)(
|
||
|
LPCSTR lpFileName
|
||
|
)
|
||
|
{
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
CString AllUserPath(g_szAllUsersStartMenu);
|
||
|
AllUserPath += g_pszFilePath;
|
||
|
|
||
|
CString csFileName(lpFileName);
|
||
|
int nIndex = AllUserPath.Find(csFileName);
|
||
|
|
||
|
if (nIndex >= 0)
|
||
|
{
|
||
|
// Seperate the title from the path.
|
||
|
char szTitle[MAX_PATH];
|
||
|
GetFileTitleA(lpFileName, szTitle, MAX_PATH);
|
||
|
CString csTitle(szTitle);
|
||
|
csTitle += L".lnk";
|
||
|
|
||
|
// Fill in the replacement path with the title.
|
||
|
AllUserPath = g_szAllUsersStartMenu;
|
||
|
AllUserPath.AppendPath(g_pszReplacementFilePath);
|
||
|
AllUserPath.AppendPath(csTitle);
|
||
|
|
||
|
DPFN( eDbgLevelInfo, "[Notify] DeleteFileA \
|
||
|
modified %s to %S", lpFileName, AllUserPath.Get());
|
||
|
|
||
|
return ORIGINAL_API(DeleteFileA)(AllUserPath.GetAnsi());
|
||
|
}
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
//do nothing
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(DeleteFileA)(lpFileName);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
NOTIFY_FUNCTION(
|
||
|
DWORD fdwReason
|
||
|
)
|
||
|
{
|
||
|
if (fdwReason == SHIM_STATIC_DLLS_INITIALIZED)
|
||
|
{
|
||
|
// Get the %AllUserStartMenu% from SHELL
|
||
|
HRESULT result = SHGetFolderPath(NULL, CSIDL_COMMON_STARTMENU, NULL,
|
||
|
SHGFP_TYPE_DEFAULT, g_szAllUsersStartMenu);
|
||
|
|
||
|
if ((result == S_FALSE) || (result == E_INVALIDARG))
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
CALL_NOTIFY_FUNCTION
|
||
|
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, FindFirstFileA)
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, RemoveDirectoryA)
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, DeleteFileA)
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|