Write version information to registry in installer.
2 * Copyright (C) 2008 Chris Porter
4 * See LICENSE.txt for licensing information.
7 #define WIN32_LEAN_AND_MEAN
15 static BOOL (WINAPI *TrueBitBlt)(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop) = BitBlt;
16 static HANDLE (WINAPI *TrueFindFirstFileA)(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) = FindFirstFileA;
17 static BOOL (WINAPI *TrueFindNextFileA)(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) = FindNextFileA;
18 static BOOL (WINAPI *TrueFindClose)(HANDLE hFindFile) = FindClose;
19 static BOOL (WINAPI *TrueHeapFree)(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) = HeapFree;
20 static HRESULT (WINAPI *TrueDirectDrawCreate)(GUID *lpGUID, LPDIRECTDRAW *lplpDD, IUnknown *pUnkOuter);
22 static HRESULT (STDMETHODCALLTYPE *TrueCreateSurface)(void *, LPDDSURFACEDESC, LPDIRECTDRAWSURFACE *, IUnknown *);
23 static HRESULT (STDMETHODCALLTYPE *TrueUnlock)(IDirectDrawSurface *, LPVOID);
25 static BOOL WINAPI FixedBitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop) {
26 BOOL b = TrueBitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop);
33 static HANDLE mechlab = INVALID_HANDLE_VALUE;
35 static void mutatefinddata(LPWIN32_FIND_DATA fd) {
36 memcpy(fd->cAlternateFileName, fd->cFileName, sizeof(fd->cAlternateFileName));
37 fd->cAlternateFileName[sizeof(fd->cAlternateFileName) - 1] = '\0';
40 static HANDLE WINAPI FixedFindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATA lpFindFileData) {
41 HANDLE h = TrueFindFirstFileA(lpFileName, lpFindFileData);
44 if(h == INVALID_HANDLE_VALUE)
47 if(sscanf_s(lpFileName, "mek\\%c%c%c??usr.mek", &a, &b, &c)) {
49 mutatefinddata(lpFindFileData);
55 static BOOL WINAPI FixedFindNextFileA(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData) {
56 BOOL b = TrueFindNextFileA(hFindFile, lpFindFileData);
58 if(b && (mechlab == lpFindFileData))
59 mutatefinddata(lpFindFileData);
64 static BOOL WINAPI FixedFindClose(HANDLE hFindFile) {
65 if(mechlab == hFindFile)
66 mechlab = INVALID_HANDLE_VALUE;
68 return TrueFindClose(hFindFile);
71 static BOOL WINAPI FixedHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) {
72 /* memory leaks ahoy */
77 static DWORD limitlasttime, limitavg;
78 static int fpscalls, fpslasttime, lastfps = -1;
79 static int LimitRate(int rate) {
80 DWORD t = GetTickCount();
87 if(t - fpslasttime > 1000) {
97 timetaken = t - limitlasttime;
101 limitavg = timetaken;
103 limitavg = (DWORD)((1 - ALPHA) * (double)limitavg + (ALPHA) * (double)timetaken);
105 delta = rate - limitavg;
111 while(GetTickCount() < t)
117 static HRESULT STDMETHODCALLTYPE FixedUnlock(IDirectDrawSurface *p, LPVOID a) {
120 return TrueUnlock(p, a);
123 static HRESULT STDMETHODCALLTYPE FixedCreateSurface(void *p, LPDDSURFACEDESC a, LPDIRECTDRAWSURFACE *b, IUnknown *c) {
124 IDirectDrawSurface *psurf;
125 HRESULT ret = TrueCreateSurface(p, a, b, c);
132 if(psurf->lpVtbl->Unlock != FixedUnlock)
133 TrueUnlock = psurf->lpVtbl->Unlock;
134 psurf->lpVtbl->Unlock = FixedUnlock;
139 static HRESULT WINAPI FixedDirectDrawCreate(GUID *lpGUID, LPDIRECTDRAW *lplpDD, IUnknown *pUnkOuter) {
141 HRESULT ret = TrueDirectDrawCreate(lpGUID, lplpDD, pUnkOuter);
148 if(pdd->lpVtbl->CreateSurface != FixedCreateSurface)
149 TrueCreateSurface = pdd->lpVtbl->CreateSurface;
150 pdd->lpVtbl->CreateSurface = FixedCreateSurface;
155 static hunk hstartup[] = {
156 { HUNK_FUNC, (void *)&FixedBitBlt, (void *)&TrueBitBlt, },
159 static hunk hmechlab[] = {
160 { HUNK_FUNC, (void *)&FixedFindFirstFileA, (void *)&TrueFindFirstFileA },
161 { HUNK_FUNC, (void *)&FixedFindNextFileA, (void *)&TrueFindNextFileA },
162 { HUNK_FUNC, (void *)&FixedFindClose, (void *)&TrueFindClose },
165 static hunk hheaphack[] = {
166 { HUNK_FUNC, (void *)&FixedHeapFree, (void *)&TrueHeapFree },
169 static hunk hframerate[] = {
170 { HUNK_NAME, (void *)&FixedDirectDrawCreate, NULL, "ddraw.dll", "DirectDrawCreate", &TrueDirectDrawCreate },
176 { "startup", "Fixes startup termination", 1, hstartup },
177 { "mechlab", "Fixes Mech Lab overweight issue", 3, hmechlab },
178 { "heaphack", "Fixes a lot of random crashes but will increase memory usage.", 1, hheaphack },
179 { "frameratelimit", "Fixes jumpjet and missile problems", 1, hframerate },