Windows2003-3790/windows/appcompat/shims/layer/forceansigetdisplaynameof.cpp
2020-09-30 16:53:55 +02:00

153 lines
3.4 KiB
C++

/*++
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
02/15/2002 mnikkel Modified to use strsafe.h
--*/
#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;
BOOL bNotConverted = TRUE;
_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 &&
(lpName->uType == STRRET_WSTR) && lpName->pOleStr)
{
LPMALLOC pMalloc;
LPWSTR pTemp = lpName->pOleStr;
// Get a pointer to the Shell's IMalloc interface.
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
CSTRING_TRY
{
// Copy the OleStr to Cstr
CString csOleStr(lpName->pOleStr);
if (StringCchCopyA(lpName->cStr, ARRAYSIZE(lpName->cStr), csOleStr.GetAnsi()) == S_OK)
{
// 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);
bNotConverted = FALSE;
}
}
CSTRING_CATCH
{
// do nothing
}
}
}
}
if (bNotConverted)
{
LOGN(
eDbgLevelError,
"[IShellFolder_GetDisplayNameOf] Unable to convert string from Unicode to ANSI");
}
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