/*++ Copyright (c) 2000 Microsoft Corporation Module Name: BoeingFix.cpp Abstract: This modified version of kernel32!CreateFile* adds the FILE_FLAG_NO_BUFFERING flag if the app is openning a specific name that is a UNIX pipe advertised as a file. Notes: This is an app specific shim. History: 10/16/2000 garretb Created --*/ #include "precomp.h" IMPLEMENT_SHIM_BEGIN(BoeingFix) #include "ShimHookMacro.h" APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(CreateFileA) APIHOOK_ENUM_ENTRY(CreateFileW) APIHOOK_ENUM_END static const WCHAR g_lpszPipeName[] = L"msg_in\\message.pip"; static const int g_lpszPipeNameLen = (sizeof(g_lpszPipeName) / sizeof(g_lpszPipeName[0])) - sizeof(g_lpszPipeName[0]); // Return FILE_FLAG_NO_BUFFERING if this filename is the special pipe. DWORD NoBufferFlag(const CString & csFileName) { if (csFileName.GetLength() >= g_lpszPipeNameLen) { CString csRight; csFileName.Right(g_lpszPipeNameLen, csRight); if (csRight.CompareNoCase(g_lpszPipeName)) { return FILE_FLAG_NO_BUFFERING; } } return 0; } /*++ Conditionally add FILE_FLAG_NO_BUFFERING --*/ HANDLE APIHOOK(CreateFileA)( LPSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { CString csFileName(lpFileName); dwFlagsAndAttributes |= NoBufferFlag(csFileName); return ORIGINAL_API(CreateFileA)( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } /*++ Conditionally add FILE_FLAG_NO_BUFFERING --*/ HANDLE APIHOOK(CreateFileW)( LPWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { CString csFileName(lpFileName); dwFlagsAndAttributes |= NoBufferFlag(csFileName); 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