|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
EmulateWriteFile.cpp
Abstract:
On NT, WriteFile requires the buffer passed in to be non-null. But Win9x assumes you want to write zeroes if the buffer is NULL. This shim emulates the Win9x behavior.
Notes:
This is a general purpose shim.
History:
01/21/2000 linstev Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(EmulateWriteFile) #include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN APIHOOK_ENUM_ENTRY(WriteFile) APIHOOK_ENUM_ENTRY(AVIStreamWrite) APIHOOK_ENUM_END
typedef HRESULT (*_pfn_AVIStreamWrite)(PAVISTREAM pavi, LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags, LONG * plSampWritten, LONG * plBytesWritten);
/*++
Allocate a buffer as required.
--*/
BOOL APIHOOK(WriteFile)( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ) { BOOL bRet;
if (!lpBuffer) { void* pBuf = malloc(nNumberOfBytesToWrite);
if (pBuf == NULL) { LOGN(eDbgLevelError, "[WriteFile] Failed to allocate %d bytes.", nNumberOfBytesToWrite); } else { ZeroMemory(pBuf, nNumberOfBytesToWrite); }
bRet = ORIGINAL_API(WriteFile)(hFile, pBuf, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
free(pBuf);
LOGN(eDbgLevelError, "[WriteFile] - null buffer of size %d.", nNumberOfBytesToWrite);
} else { bRet = ORIGINAL_API(WriteFile)(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped); }
return bRet; }
/*++
Allocate a buffer as required.
--*/
HRESULT APIHOOK(AVIStreamWrite)( PAVISTREAM pavi, LONG lStart, LONG lSamples, LPVOID lpBuffer, LONG cbBuffer, DWORD dwFlags, LONG * plSampWritten, LONG * plBytesWritten ) { HRESULT hRet;
if (!lpBuffer) { void* pBuf = malloc(cbBuffer);
if (pBuf == NULL) { LOGN(eDbgLevelError, "[AVIStreamWrite] Failed to allocate %d bytes.", cbBuffer); } else { ZeroMemory(pBuf, cbBuffer); }
hRet = ORIGINAL_API(AVIStreamWrite)(pavi, lStart, lSamples, pBuf, cbBuffer, dwFlags, plSampWritten, plBytesWritten);
free(pBuf);
LOGN(eDbgLevelError, "[AVIStreamWrite] - null buffer of size %d", cbBuffer);
} else { hRet = ORIGINAL_API(AVIStreamWrite)(pavi, lStart, lSamples, lpBuffer, cbBuffer, dwFlags, plSampWritten, plBytesWritten); }
return hRet; }
/*++
Register hooked functions
--*/
HOOK_BEGIN APIHOOK_ENTRY(KERNEL32.DLL, WriteFile) APIHOOK_ENTRY(AVIFIL32.DLL, AVIStreamWrite) HOOK_END
IMPLEMENT_SHIM_END
|