/*++

 Copyright (c) 2000 Microsoft Corporation

 Module Name:

    RemoveNoBufferingFlagFromCreateFile.cpp

 Abstract:

    This modified version of kernel32!CreateFile* prevents an app from using
    the FILE_FLAG_NO_BUFFERING flag if the app doesn't handle it correctly.

 Notes:

    This is a general shim.

 History:

    02/16/2000 clupu Created

--*/

#include "precomp.h"

IMPLEMENT_SHIM_BEGIN(RemoveNoBufferingFlagFromCreateFile)
#include "ShimHookMacro.h"

APIHOOK_ENUM_BEGIN
    APIHOOK_ENUM_ENTRY(CreateFileA)
    APIHOOK_ENUM_ENTRY(CreateFileW)
APIHOOK_ENUM_END


/*++

    Take out FILE_FLAG_NO_BUFFERING

--*/

HANDLE
APIHOOK(CreateFileA)(
    LPSTR                 lpFileName,
    DWORD                 dwDesiredAccess,
    DWORD                 dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD                 dwCreationDisposition,
    DWORD                 dwFlagsAndAttributes,
    HANDLE                hTemplateFile
    )
{
    //
    // Take out FILE_FLAG_NO_BUFFERING.
    //
    if (dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING) {
        DPFN(
            eDbgLevelInfo,
            "[CreateFileA] called with FILE_FLAG_NO_BUFFERING set.\n");
    }
    
    dwFlagsAndAttributes &= ~FILE_FLAG_NO_BUFFERING;

    return ORIGINAL_API(CreateFileA)(
                                lpFileName,
                                dwDesiredAccess,
                                dwShareMode,
                                lpSecurityAttributes,
                                dwCreationDisposition,
                                dwFlagsAndAttributes,
                                hTemplateFile);
}

/*++

    Take out FILE_FLAG_NO_BUFFERING

--*/

HANDLE
APIHOOK(CreateFileW)(
    LPWSTR                lpFileName,
    DWORD                 dwDesiredAccess,
    DWORD                 dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD                 dwCreationDisposition,
    DWORD                 dwFlagsAndAttributes,
    HANDLE                hTemplateFile
    )
{
    //
    // Take out FILE_FLAG_NO_BUFFERING.
    //
    if (dwFlagsAndAttributes & FILE_FLAG_NO_BUFFERING) {
        DPFN(
            eDbgLevelInfo,
            "[CreateFileW] called with FILE_FLAG_NO_BUFFERING set.\n");
    }
    
    dwFlagsAndAttributes &= ~FILE_FLAG_NO_BUFFERING;

    return ORIGINAL_API(CreateFileW)(
                                lpFileName,
                                dwDesiredAccess,
                                dwShareMode,
                                lpSecurityAttributes,
                                dwCreationDisposition,
                                dwFlagsAndAttributes,
                                hTemplateFile);
}

/*++

 Register hooked functions

--*/

HOOK_BEGIN

    APIHOOK_ENTRY(KERNEL32.DLL, CreateFileA)
    APIHOOK_ENTRY(KERNEL32.DLL, CreateFileW)

HOOK_END


IMPLEMENT_SHIM_END