134 lines
2.8 KiB
C++
134 lines
2.8 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
|
|
|
|
--*/
|
|
|
|
#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
|
|
|