/*++ Copyright (c) 2000 Microsoft Corporation Module Name: NetObjectsFusion5.cpp Abstract: This shim hooks the CreateFile/WriteFile if the file is corpwiz_loader.html to write in the required javascript so as to make the appwork if the IE browser version is > 5. Notes: This is an app specific shim. History: 01/24/2001 a-leelat Created 03/13/2001 robkenny Converted to CString --*/ #include "precomp.h" // This module has been given an official blessing to use the str routines. #include "LegalStr.h" IMPLEMENT_SHIM_BEGIN(NetObjectsFusion5) #include "ShimHookMacro.h" APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(CloseHandle) APIHOOK_ENUM_ENTRY(WriteFile) APIHOOK_ENUM_ENTRY(CreateFileA) APIHOOK_ENUM_END volatile HANDLE g_Handle = NULL; HANDLE APIHOOK(CreateFileA)( LPSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { CHAR szNameToCheck[] = "corpwiz_loader.html"; HANDLE l_Handle = (HANDLE)ORIGINAL_API(CreateFileA)( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); if ( strstr(lpFileName,szNameToCheck) ) { if (l_Handle != INVALID_HANDLE_VALUE ) g_Handle = l_Handle; } else g_Handle = NULL; return l_Handle; } BOOL APIHOOK(WriteFile)( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) { BOOL bRet = FALSE; if ( g_Handle && (hFile == g_Handle) && lpBuffer) { CHAR szStringToWrite[] = "\r\n var IsIE6 = navigator.userAgent.indexOf(\"IE 6\") > -1;\r\n\r\n if ( IsIE6 == true ) { IsIE5 = true; }\r\n"; CHAR szStringToCheck[] = "var IsIE5 = navigator.userAgent.indexOf(\"IE 5\") > -1;"; CHAR *szPtr = NULL; if ((szPtr = strstr((LPCSTR)lpBuffer,szStringToCheck))) { int iSize = sizeof(CHAR) * (szPtr - (LPSTR)lpBuffer + _tcslenBytes(szStringToCheck)); DWORD dwTotalBytesWritten; bRet = ORIGINAL_API(WriteFile)( hFile, lpBuffer, (DWORD)iSize, lpNumberOfBytesWritten, lpOverlapped); dwTotalBytesWritten = *lpNumberOfBytesWritten; bRet = ORIGINAL_API(WriteFile)( hFile, (LPVOID)szStringToWrite, (DWORD)strlen(szStringToWrite), lpNumberOfBytesWritten, lpOverlapped); CHAR* szrBuf = (LPSTR)lpBuffer + iSize; bRet = ORIGINAL_API(WriteFile)( hFile, (LPVOID)szrBuf, (nNumberOfBytesToWrite - (DWORD)iSize), lpNumberOfBytesWritten, lpOverlapped); *lpNumberOfBytesWritten += dwTotalBytesWritten; return bRet; }//end of if } return ORIGINAL_API(WriteFile)( hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped); } BOOL APIHOOK(CloseHandle)( HANDLE hObject ) { if ( g_Handle && (hObject == g_Handle) ) { g_Handle = NULL; } return ORIGINAL_API(CloseHandle)(hObject); } /*++ Register hooked functions --*/ HOOK_BEGIN APIHOOK_ENTRY(KERNEL32.DLL, CreateFileA) APIHOOK_ENTRY(KERNEL32.DLL, WriteFile) APIHOOK_ENTRY(KERNEL32.DLL, CloseHandle) HOOK_END IMPLEMENT_SHIM_END