windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/netobjectsfusion5.cpp
2020-09-26 16:20:57 +08:00

186 lines
4.3 KiB
C++

/*++
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