122 lines
2.9 KiB
C++
122 lines
2.9 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ExchangeServerSetup.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This is a non-reusable patch for Exchange Server Setup 5.5 for SP2 and SP3
|
||
|
to change the parameters passed to xcopy. The reason for that is that
|
||
|
Win2k's xcopy doesn't have the /y parameter a default parameter.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is an app specific shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
02/16/2000 clupu Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(ExchangeServerSetup)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(CreateProcessW)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Change the parameters passed to xcopy.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
BOOL
|
||
|
APIHOOK(CreateProcessW)(
|
||
|
LPWSTR lpApplicationName,
|
||
|
LPWSTR lpCommandLine,
|
||
|
LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
||
|
LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
||
|
BOOL bInheritHandles,
|
||
|
DWORD dwCreationFlags,
|
||
|
LPVOID lpEnvironment,
|
||
|
LPWSTR lpCurrentDirectory,
|
||
|
LPSTARTUPINFOW lpStartupInfo,
|
||
|
LPPROCESS_INFORMATION lpProcessInformation
|
||
|
)
|
||
|
{
|
||
|
BOOL bRet;
|
||
|
|
||
|
if (lpCommandLine != NULL) {
|
||
|
|
||
|
int cchSize = lstrlenW(lpCommandLine);
|
||
|
WCHAR ch;
|
||
|
|
||
|
if (cchSize > 12) {
|
||
|
|
||
|
DPFN(
|
||
|
eDbgLevelInfo,
|
||
|
"[CreateProcessW] for \"%ws\".\n",
|
||
|
lpCommandLine);
|
||
|
|
||
|
ch = lpCommandLine[11];
|
||
|
lpCommandLine[11] = 0;
|
||
|
|
||
|
if (CompareStringW(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT),
|
||
|
NORM_IGNORECASE,
|
||
|
lpCommandLine,
|
||
|
-1,
|
||
|
L"xcopy /s /e",
|
||
|
-1
|
||
|
) == CSTR_EQUAL) {
|
||
|
|
||
|
StringCchCopyW(lpCommandLine, cchSize + 1, L"xcopy /sye ");
|
||
|
lpCommandLine[11] = ch;
|
||
|
|
||
|
DPFN(
|
||
|
eDbgLevelInfo,
|
||
|
"[CreateProcessW] changed to \"%ws\".\n",
|
||
|
lpCommandLine);
|
||
|
|
||
|
} else {
|
||
|
lpCommandLine[11] = ch;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bRet = ORIGINAL_API(CreateProcessW)(
|
||
|
lpApplicationName,
|
||
|
lpCommandLine,
|
||
|
lpProcessAttributes,
|
||
|
lpThreadAttributes,
|
||
|
bInheritHandles,
|
||
|
dwCreationFlags,
|
||
|
lpEnvironment,
|
||
|
lpCurrentDirectory,
|
||
|
lpStartupInfo,
|
||
|
lpProcessInformation);
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
APIHOOK_ENTRY(KERNEL32.DLL, CreateProcessW)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|