2015-01-24 11:40:16 -05:00
|
|
|
#define _CRT_SECURE_NO_WARNINGS
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "dxwnd.h"
|
|
|
|
#include "dxwcore.hpp"
|
|
|
|
//#include "syslibs.h"
|
|
|
|
#include "dxhook.h"
|
|
|
|
#include "dxhelper.h"
|
|
|
|
#include <Vfw.h>
|
|
|
|
|
|
|
|
typedef LONG (WINAPI *AVIFileRelease_Type)(PAVIFILE);
|
|
|
|
typedef LONG (WINAPI *AVIStreamRelease_Type)(PAVISTREAM);
|
2015-06-22 12:40:59 -04:00
|
|
|
typedef PGETFRAME (WINAPI *AVIStreamGetFrameOpen_Type)(PAVISTREAM, LPBITMAPINFOHEADER);
|
2015-01-24 11:40:16 -05:00
|
|
|
|
|
|
|
AVIFileRelease_Type pAVIFileRelease = NULL;
|
|
|
|
AVIStreamRelease_Type pAVIStreamRelease = NULL;
|
2015-06-22 12:40:59 -04:00
|
|
|
AVIStreamGetFrameOpen_Type pAVIStreamGetFrameOpen = NULL;
|
2015-01-24 11:40:16 -05:00
|
|
|
|
|
|
|
LONG WINAPI extAVIFileRelease(PAVIFILE);
|
|
|
|
LONG WINAPI extAVIStreamRelease(PAVISTREAM);
|
2015-06-22 12:40:59 -04:00
|
|
|
PGETFRAME WINAPI extAVIStreamGetFrameOpen(PAVISTREAM, LPBITMAPINFOHEADER);
|
2015-01-24 11:40:16 -05:00
|
|
|
|
2016-12-03 11:45:15 -05:00
|
|
|
static HookEntryEx_Type Hooks[]={
|
|
|
|
//{HOOK_IAT_CANDIDATE, 0, "AVIFileClose", NULL, (FARPROC *)&pAVIFileClose, (FARPROC)extAVIFileClose},
|
|
|
|
//{HOOK_IAT_CANDIDATE, 0, "AVIFileRelease", NULL, (FARPROC *)&pAVIFileRelease, (FARPROC)extAVIFileRelease},
|
|
|
|
//{HOOK_IAT_CANDIDATE, 0, "AVIStreamRelease", NULL, (FARPROC *)&pAVIStreamRelease, (FARPROC)extAVIStreamRelease},
|
|
|
|
{HOOK_IAT_CANDIDATE, 0, "AVIStreamGetFrameOpen", NULL, (FARPROC *)&pAVIStreamGetFrameOpen, (FARPROC)extAVIStreamGetFrameOpen},
|
|
|
|
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
|
2015-01-24 11:40:16 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
void HookAVIFil32(HMODULE module)
|
|
|
|
{
|
2016-12-03 11:45:15 -05:00
|
|
|
HookLibraryEx(module, Hooks, "AVIFIL32.dll");
|
2015-01-24 11:40:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
FARPROC Remap_AVIFil32_ProcAddress(LPCSTR proc, HMODULE hModule)
|
|
|
|
{
|
|
|
|
FARPROC addr;
|
2016-12-03 11:45:15 -05:00
|
|
|
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
|
2015-01-24 11:40:16 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
LONG WINAPI extAVIFileRelease(PAVIFILE pavi)
|
|
|
|
{
|
|
|
|
if(pavi==NULL) {
|
|
|
|
OutTraceE("AVIFileRelease: pavi=NULL condition - returns OK\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return (*pAVIFileRelease)(pavi);
|
|
|
|
}
|
|
|
|
|
|
|
|
LONG WINAPI extAVIStreamRelease(PAVISTREAM pavi)
|
|
|
|
{
|
|
|
|
if(pavi==NULL) {
|
|
|
|
OutTraceE("AVIFileRelease: pavi=NULL condition - returns OK\n");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return (*pAVIStreamRelease)(pavi);
|
|
|
|
}
|
|
|
|
|
2015-06-22 12:40:59 -04:00
|
|
|
PGETFRAME WINAPI extAVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted)
|
|
|
|
{
|
|
|
|
if(IsTraceDW){
|
|
|
|
char sColor[12];
|
|
|
|
switch ((DWORD)lpbiWanted){
|
|
|
|
case 0: strcpy(sColor, "DEFAULT"); break;
|
|
|
|
case AVIGETFRAMEF_BESTDISPLAYFMT: strcpy(sColor, "BEST"); break;
|
|
|
|
default: sprintf(sColor,"%d", lpbiWanted->biBitCount);
|
|
|
|
}
|
|
|
|
OutTrace("AVIStreamGetFrameOpen: pavi=%x lpbiwanted=%x bitcount=%s\n", pavi, lpbiWanted, sColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
if((dxw.dwFlags6 & FIXMOVIESCOLOR) && (((DWORD)lpbiWanted == 0) || ((DWORD)lpbiWanted == AVIGETFRAMEF_BESTDISPLAYFMT))){
|
|
|
|
BITMAPINFOHEADER biWanted;
|
|
|
|
memset(&biWanted, 0, sizeof(BITMAPINFOHEADER));
|
|
|
|
biWanted.biSize = sizeof(BITMAPINFOHEADER);
|
|
|
|
biWanted.biBitCount = (WORD)dxw.VirtualPixelFormat.dwRGBBitCount;
|
|
|
|
biWanted.biPlanes = 1;
|
2016-07-01 12:42:42 -04:00
|
|
|
if(biWanted.biBitCount < 32)
|
2015-06-22 12:40:59 -04:00
|
|
|
biWanted.biClrUsed = (0x1 << biWanted.biBitCount); // 8 -> 256;
|
2016-07-01 12:42:42 -04:00
|
|
|
else
|
|
|
|
biWanted.biClrUsed = 0;
|
2015-06-22 12:40:59 -04:00
|
|
|
biWanted.biClrImportant = biWanted.biClrUsed;
|
|
|
|
return (*pAVIStreamGetFrameOpen)(pavi, &biWanted);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (*pAVIStreamGetFrameOpen)(pavi, lpbiWanted);
|
|
|
|
}
|
2015-01-24 11:40:16 -05:00
|
|
|
|
|
|
|
|