/*++

 Copyright (c) 2000 Microsoft Corporation

 Module Name:

    EmulateGetStdHandle.cpp

 Abstract:
 
    Normally, when a process is created, members hStdInput, hStdOutput, and 
    hStdError of STARTUPINFO struct are set to NULL. Some apps like 
    Baby-Sitters Club Activity Center and Baby-Sitters Club 3-rd Grade Disk 2
    may check these handles and send Error messages.
    
    This shim can be used in this case to send appropriate handles and prevent 
    program terminate.

 History:

 06/14/2000 a-vales  created
 11/29/2000 andyseti Converted into AppSpecific shim.

--*/

#include "precomp.h"

IMPLEMENT_SHIM_BEGIN(EmulateGetStdHandle)
#include "ShimHookMacro.h"

APIHOOK_ENUM_BEGIN
    APIHOOK_ENUM_ENTRY(GetStdHandle) 
APIHOOK_ENUM_END

HANDLE 
APIHOOK(GetStdHandle)(
    DWORD nStdHandle)
{
    HANDLE hStd = ORIGINAL_API(GetStdHandle)(nStdHandle);

    if (hStd == 0)
    {
        switch (nStdHandle)
        {
            case STD_INPUT_HANDLE:
                LOGN( eDbgLevelError, "Correcting GetStdHandle(STD_INPUT_HANDLE). Returning handle = 1.");
                hStd = (HANDLE) 1;
                break;
            case STD_OUTPUT_HANDLE:
                LOGN( eDbgLevelError, "Correcting GetStdHandle(STD_OUTPUT_HANDLE). Returning handle = 2.");
                hStd = (HANDLE) 2;
                break;

            case STD_ERROR_HANDLE:
                LOGN( eDbgLevelError, "Correcting GetStdHandle(STD_ERROR_HANDLE). Returning handle = 3.");
                hStd = (HANDLE) 3;
                break;
        }
    }

    return hStd;
}

/*++

 Register hooked functions

--*/

HOOK_BEGIN

    APIHOOK_ENTRY(KERNEL32.DLL, GetStdHandle)

HOOK_END

IMPLEMENT_SHIM_END