/*++

 Copyright (c) 2000-2001 Microsoft Corporation

 Module Name:

   Ppo3svrScr.cpp

 Abstract:

   Power Plus screensaver bundled with Lotus Super Office 2000 Japanese could not launch
   Configure dialog on Whistler. But it works on Win 2000.
   The desk.cpl behavior of launching screensaver is changed a bit on Whistler.
   This screensaver's ScreenSaverConfigureDialog ID is not DLG_SCRNSAVECONFIGURE (2003=MSDN must) and unusual.
   Assuming unusual screensaver.
   This shim is applied to screensaver and hacks GetCommandLineW/A return text to change from
      "D:\WINDOWS\System32\ppo3svr.scr /c:1769646"
   to
      "D:\WINDOWS\System32\ppo3svr.scr"
   so that configure dialog appears.

   More Info:

      From desk.cpl (rundll32.exe), Screen Saver operation and CreateProcessW lpCommandLine argument:
      (1) Initial selection of screensaver
         "D:\WINDOWS\System32\ppo3svr.scr /p 721330" -> preview only
      (2) Preview button
         1st call "D:\WINDOWS\System32\ppo3svr.scr /s" -> screen saver
         2nd call "D:\WINDOWS\System32\ppo3svr.scr /p 721330" -> return to preview
      (3) Settings button
         1st call "D:\WINDOWS\System32\ppo3svr.scr /c:1769646" -> configure dialog (not working)
         2nd call "D:\WINDOWS\System32\ppo3svr.scr /p 721330" ->  return to preview

 History:

    06/11/2001  hioh        Created

--*/

#include "precomp.h"
// Using only strstr to find lower ascii text for GetCommandLineW/A. Operation is same between W & A.
#include "LegalStr.h"

IMPLEMENT_SHIM_BEGIN(Ppo3svrScr)
#include "ShimHookMacro.h"

//
// Add APIs that you wish to hook to this macro construction.
//
APIHOOK_ENUM_BEGIN
    APIHOOK_ENUM_ENTRY(GetCommandLineW) 
    APIHOOK_ENUM_ENTRY(GetCommandLineA) 
APIHOOK_ENUM_END

/*++

 Cut the /c:... string in CommandLine for ppo3svr.scr.
 
--*/

LPWSTR APIHOOK(GetCommandLineW)()
{
    WCHAR   szScreenSaverConfigure[] = L"ppo3svr.scr /c:";
    WCHAR   szConfigure[] = L" /c:";
    LPWSTR  lpCommandLine = ORIGINAL_API(GetCommandLineW)();
    LPWSTR  pw = wcsstr(lpCommandLine, szScreenSaverConfigure);

    if (pw != NULL)
    {
        if (pw = wcsstr(pw, szConfigure))
        {
            *pw = 0;    // cut from " /c:"
        }
    }

    return (lpCommandLine);
}

LPSTR APIHOOK(GetCommandLineA)()
{
    CHAR   szScreenSaverConfigure[] = "ppo3svr.scr /c:";
    CHAR   szConfigure[] = " /c:";
    LPSTR  lpCommandLine = ORIGINAL_API(GetCommandLineA)();
    LPSTR  pc = strstr(lpCommandLine, szScreenSaverConfigure);

    if (pc != NULL)
    {
        if (pc = strstr(pc, szConfigure))
        {
            *pc = 0;    // cut from " /c:"
        }
    }

    return (lpCommandLine);
}

/*++

 Register hooked functions

--*/

HOOK_BEGIN

    APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineW)
    APIHOOK_ENTRY(KERNEL32.DLL, GetCommandLineA)

HOOK_END

IMPLEMENT_SHIM_END