Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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
|