|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
ForceAnsiGetDisplayNameOf.cpp
Abstract:
This shim force the routine IShellFolder::GetDisplayNameOf to return an Ascii string whenever it detects that GetDisplayNameOf returned a unicode string.
Notes:
This is an app is generic.
History:
07/26/2000 mnikkel Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(ForceAnsiGetDisplayNameOf) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(SHGetDesktopFolder) APIHOOK_ENUM_ENTRY_COMSERVER(SHELL32) APIHOOK_ENUM_END
IMPLEMENT_COMSERVER_HOOK(SHELL32)
/*++
Hook SHGetDesktopFolder to get the IShellFolder Interface Pointer.
--*/
HRESULT APIHOOK(SHGetDesktopFolder)( IShellFolder **ppshf ) { HRESULT hReturn; hReturn = ORIGINAL_API(SHGetDesktopFolder)(ppshf);
if (SUCCEEDED(hReturn)) { HookObject( NULL, IID_IShellFolder, (PVOID*)ppshf, NULL, FALSE); }
return hReturn; }
/*++
Hook GetDisplayName of and when it returns a unicode string convert it over to an ANSI string.
--*/
HRESULT COMHOOK(IShellFolder, GetDisplayNameOf)( PVOID pThis, LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName ) { HRESULT hrReturn = E_FAIL;
_pfn_IShellFolder_GetDisplayNameOf pfnOld = ORIGINAL_COM(IShellFolder, GetDisplayNameOf, pThis);
if (pfnOld) { hrReturn = (*pfnOld)(pThis, pidl, uFlags, lpName);
// Check for unicode string and validity
if ((S_OK == hrReturn) && (lpName->uType == STRRET_WSTR) && lpName->pOleStr) { LPMALLOC pMalloc; LPWSTR pTemp;
// Unicode found, convert it to ANSI and free the original unicode string.
if (SUCCEEDED(SHGetMalloc(&pMalloc))) { // Save OleStr ptr. The OleStr ptr and the cStr are unioned together
// so when we fill the cStr it will wipe out the OleStr ptr.
pTemp = lpName->pOleStr; WideCharToMultiByte(CP_ACP, 0, pTemp, -1, lpName->cStr, MAX_PATH, NULL, NULL);
// set the uType to CSTR and free the old unicode string.
lpName->uType = STRRET_CSTR; pMalloc->Free(pTemp);
LOGN( eDbgLevelError, "[IShellFolder_GetDisplayNameOf] Converted string from Unicode to ANSI: %s", lpName->cStr); } } }
return hrReturn; }
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY_COMSERVER(SHELL32) APIHOOK_ENTRY(SHELL32.DLL, SHGetDesktopFolder) COMHOOK_ENTRY(ShellDesktop, IShellFolder, GetDisplayNameOf, 11)
HOOK_END
IMPLEMENT_SHIM_END
|