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

199 lines
4.7 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