153 lines
3.4 KiB
C++
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
|
||
|
|