139 lines
2.9 KiB
C++
139 lines
2.9 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000-2001 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
HandleDBCSUserName.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
ShFolder.Exe is failing installation when its app path has Hi Ascii characters (typically DBCS).
|
||
|
When app path is double quoted, the bug code is not processed and install will succeed.
|
||
|
This shim wrap the command line app path name with double quote at GetCommandLineA.
|
||
|
|
||
|
Example:
|
||
|
C:\DOCUME~1\DBCS\LOCALS~1\Temp\_ISTMP1.DIR\_ISTMP0.DIR\shfolder.exe /Q:a
|
||
|
"C:\DOCUME~1\DBCS\LOCALS~1\Temp\_ISTMP1.DIR\_ISTMP0.DIR\shfolder.exe" /Q:a
|
||
|
|
||
|
More info:
|
||
|
|
||
|
Self extractor ShFolder.Exe checks its app path name with space char 0x20 on signed char basis.
|
||
|
Hi Ascii character included in path treated below 0x20 and path is chopped at there.
|
||
|
When path has double quote at the top, the problem check is not proceeded.
|
||
|
|
||
|
History:
|
||
|
|
||
|
04/09/2001 hioh Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(HandleDBCSUserName)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
//
|
||
|
// Add APIs that you wish to hook to this macro construction.
|
||
|
//
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(GetCommandLineA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
char * g_lpszCommandLine = NULL;
|
||
|
|
||
|
CRITICAL_SECTION g_csCmdLine;
|
||
|
|
||
|
class CAutoLock
|
||
|
{
|
||
|
public:
|
||
|
CAutoLock()
|
||
|
{
|
||
|
EnterCriticalSection(&g_csCmdLine);
|
||
|
}
|
||
|
~CAutoLock()
|
||
|
{
|
||
|
LeaveCriticalSection(&g_csCmdLine);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Wrap the application path name with double quote.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
LPSTR
|
||
|
APIHOOK(GetCommandLineA)(
|
||
|
void
|
||
|
)
|
||
|
{
|
||
|
CAutoLock lock;
|
||
|
if (g_lpszCommandLine)
|
||
|
{
|
||
|
// Been here, done that
|
||
|
return g_lpszCommandLine;
|
||
|
}
|
||
|
|
||
|
g_lpszCommandLine = ORIGINAL_API(GetCommandLineA)();
|
||
|
CSTRING_TRY
|
||
|
{
|
||
|
AppAndCommandLine appCmdLine(NULL, g_lpszCommandLine);
|
||
|
|
||
|
// The command line is often only the arguments: no application name
|
||
|
// If the "application name" doesn't exist, don't bother to put quotes
|
||
|
// around it.
|
||
|
DWORD dwAttr = GetFileAttributesW(appCmdLine.GetApplicationName());
|
||
|
if (dwAttr != INVALID_FILE_ATTRIBUTES)
|
||
|
{
|
||
|
CString csDQ = L'"';
|
||
|
CString csCL = csDQ;
|
||
|
CString csNA = appCmdLine.GetCommandlineNoAppName();
|
||
|
|
||
|
csCL += appCmdLine.GetApplicationName();
|
||
|
csCL += csDQ;
|
||
|
|
||
|
if (!csNA.IsEmpty())
|
||
|
{ // Add the rest
|
||
|
csCL += L" ";
|
||
|
csCL += csNA;
|
||
|
}
|
||
|
|
||
|
g_lpszCommandLine = csCL.ReleaseAnsi();
|
||
|
}
|
||
|
}
|
||
|
CSTRING_CATCH
|
||
|
{
|
||
|
// Do nothing, g_lpszCommandLine is initialized with good value
|
||
|
}
|
||
|
|
||
|
return g_lpszCommandLine;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
NOTIFY_FUNCTION(
|
||
|
DWORD fdwReason)
|
||
|
{
|
||
|
if (fdwReason == DLL_PROCESS_ATTACH)
|
||
|
{
|
||
|
return InitializeCriticalSectionAndSpinCount(&g_csCmdLine, 0x80000000);
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
CALL_NOTIFY_FUNCTION
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineA)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|