From 2bde039a5b0c4a556ee0e58f9e497af875f7f062 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 13 Mar 2016 12:45:18 -0400 Subject: [PATCH] v2_03_56_src_fix1 Former-commit-id: bce2d05ef78a1fea2347af161a4c0a7bfa04896d --- build/dxwnd.dll | 2 +- build/exports/Silver.dxw | 29 ++++++ build/readme-relnotes.txt | 6 +- dll/ddraw.cpp | 6 +- dll/dxwnd.vs2008.suo | Bin 283648 -> 283648 bytes dll/iatpatch - Copia.cpp | 202 -------------------------------------- dll/winproc.cpp | 7 ++ host/dxwndhost.vs2008.suo | Bin 83456 -> 83456 bytes 8 files changed, 45 insertions(+), 207 deletions(-) create mode 100644 build/exports/Silver.dxw delete mode 100644 dll/iatpatch - Copia.cpp diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 9848a56..d42b6f0 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e10c437ee0297bcbbc6189fc0cd86915b861a816b23c9c456a53d61cda8ae829 +oid sha256:cf21cb7f4efa14ec9c887287c8761ec1bc41387407bb79ad1e0a828389390503 size 625664 diff --git a/build/exports/Silver.dxw b/build/exports/Silver.dxw new file mode 100644 index 0000000..f753898 --- /dev/null +++ b/build/exports/Silver.dxw @@ -0,0 +1,29 @@ +[target] +title0=Silver +path0=D:\Games\Silver\silver.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=137363494 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +flagl0=0 +flagm0=0 +tflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 9e412b6..be9c9d4 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1036,8 +1036,10 @@ v2.03.55 fix: differentiated handling of blitting from memory to DC vs. from DC vs. memory. The second case is less frequent, but altered the correct rendering of "Battlezone 1998 edition", now working both in scaled, emulated DC shared DC and shared ddraw and GDI DC. The fix impacts both BitBlt and ScaledBlt GDI calls. fix: prevented InvalidateRect to return giving a scaled rect. Fixes "Deadlock 2"partial screen updates. -v2.03.56 +v2.03.56/fix1 add: capability to hook calls referenced by ordinal number add: "Acquire admin caps" flag to self elevate DxWnd if configured as necessary add: added third mode to handle potentially offending messages, that is process them by the Window default process routine WinDefaultProc. Good for "Red Alert 2". -add: "fix clipper area in shared DC", temporary solution to adapt the shared DC mode to the different situations (yet to finish). \ No newline at end of file +add: "fix clipper area in shared DC", temporary solution to adapt the shared DC mode to the different situations (yet to finish). +fix: fully integrated the patch for "Silver" game: returning backbuffer as a doublebuffer also when requested with DDSCAPS_VIDEOMEMORY caps. +add: FunkyFr3sh addition to process WM_SYSCOMMAND SC_CLOSE and force program termination when requested by "Terminate on window close" option. \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index aaeef80..cf3a665 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3110,7 +3110,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); - if(dxw.dwFlags6 & FLIPEMULATION){ + if(dxw.dwFlags1 & EMULATESURFACE){ // v2.1.81: fix to make "Silver" working: if the primary surface was created with // backbuffercount == 2, the game expects some more surface to be attached to @@ -3121,8 +3121,10 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet // v2.2.62 fix: a check to implement doublebuffer emulation only in case of DDSCAPS_BACKBUFFER // requests. A call to GetAttachedSurface can be made to retrieve DDSCAPS_ZBUFFER surfaces, and in // this case the BackBuffer surface can't be returned. + // v2.03.56.fix1: the double buffer trick for Silver works in generic EMULATESURFACE mode, but the + // surface is requested also as a DDSCAPS_VIDEOMEMORY one. - if (IsBack && (DDSD_Prim.dwBackBufferCount > 1) && (lpddsc->dwCaps & DDSCAPS_BACKBUFFER)){ + if (IsBack && (DDSD_Prim.dwBackBufferCount > 1) && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY))){ *lplpddas = lpdds; OutTraceDW("GetAttachedSurface(%d): DOUBLEBUFFER attached to BACK=%x\n", dxversion, lpdds); return DD_OK; diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index b1accb2918648637fa7f78ca91d8dd33abc98881..0321b65f93f412a87df2040e714fc2ed8525c553 100644 GIT binary patch delta 6242 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 YqZ9IAp*y;Aj~A|)gMZUbHc!a^08WVGF#rGn diff --git a/dll/iatpatch - Copia.cpp b/dll/iatpatch - Copia.cpp deleted file mode 100644 index 756d968..0000000 --- a/dll/iatpatch - Copia.cpp +++ /dev/null @@ -1,202 +0,0 @@ -#include -#include "dxwnd.h" -#include "dxwcore.hpp" - -void *IATPatch(HMODULE module, char *dll, void *apiproc, const char *apiname, void *hookproc) -{ - PIMAGE_NT_HEADERS pnth; - PIMAGE_IMPORT_DESCRIPTOR pidesc; - DWORD base, rva; - PSTR impmodule; - PIMAGE_THUNK_DATA ptaddr; - PIMAGE_THUNK_DATA ptname; - PIMAGE_IMPORT_BY_NAME piname; - DWORD oldprotect; - void *org; - - base = (DWORD)module; - org = 0; // by default, ret = 0 => API not found - - __try{ - pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew); - if(!pnth) { - OutTraceH("IATPatch: ERROR no PNTH at %d\n", __LINE__); - return 0; - } - rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if(!rva) { - OutTraceH("IATPatch: ERROR no RVA at %d\n", __LINE__); - return 0; - } - pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva); - - while(pidesc->FirstThunk){ - impmodule = (PSTR)(base + pidesc->Name); - if(!lstrcmpi(dll, impmodule)) { - //OutTraceH("IATPatch: dll=%s found at %x\n", dll, impmodule); - - ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk); - ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL; - - while(ptaddr->u1.Function){ - if (ptname){ - // examining by function name - if(!IMAGE_SNAP_BY_ORDINAL(ptname->u1.Ordinal)){ - piname = (PIMAGE_IMPORT_BY_NAME)(base + (DWORD)ptname->u1.AddressOfData); - if(!lstrcmpi(apiname, (char *)piname->Name)) break; - } - } - if (apiproc){ - // examining by function addr - if(ptaddr->u1.Function == (DWORD)apiproc) break; - } - ptaddr ++; - if (ptname) ptname ++; - } - - if(ptaddr->u1.Function) { - org = (void *)ptaddr->u1.Function; - if(org == hookproc) return 0; // already hooked - - if(!VirtualProtect(&ptaddr->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldprotect)) { - OutTraceDW("IATPatch: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); - return 0; - } - ptaddr->u1.Function = (DWORD)hookproc; - if(!VirtualProtect(&ptaddr->u1.Function, 4, oldprotect, &oldprotect)) { - OutTraceDW("IATPatch: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); - return 0; - } - if (!FlushInstructionCache(GetCurrentProcess(), &ptaddr->u1.Function, 4)) { - OutTraceDW("IATPatch: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); - return 0; - } - OutTraceH("IATPatch hook=%s address=%x->%x\n", apiname, org, hookproc); - - return org; - } - } - pidesc ++; - } - if(!pidesc->FirstThunk) { - OutTraceH("IATPatch: PE unreferenced function %s:%s\n", dll, apiname); - return 0; - } - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - OutTraceDW("IATPatch: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname); - } - return org; -} -#undef OutTraceH -#define OutTraceH OutTrace - -void *IATPatchEx(HMODULE module, DWORD ordinal, char *dll, void *apiproc, const char *apiname, void *hookproc) -{ - PIMAGE_NT_HEADERS pnth; - PIMAGE_IMPORT_DESCRIPTOR pidesc; - DWORD base, rva; - PSTR impmodule; - PIMAGE_THUNK_DATA ptaddr; - PIMAGE_THUNK_DATA ptname; - PIMAGE_IMPORT_BY_NAME piname; - DWORD oldprotect; - void *org; - OutTraceH("IATPatchEx: module=%x ordinal=%x dll=%s\n", module, ordinal, dll); - - base = (DWORD)module; - org = 0; // by default, ret = 0 => API not found - - __try{ - pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew); - if(!pnth) { - OutTraceH("IATPatch: ERROR no PNTH at %d\n", __LINE__); - return 0; - } - rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - if(!rva) { - OutTraceH("IATPatch: ERROR no RVA at %d\n", __LINE__); - return 0; - } - pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva); - - while(pidesc->FirstThunk){ - impmodule = (PSTR)(base + pidesc->Name); - OutTraceH("IATPatchEx: analyze impmodule=%s\n", impmodule); - if(!lstrcmpi(dll, impmodule)) { - OutTraceH("IATPatchEx: dll=%s found at %x\n", dll, impmodule); - - ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk); - ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL; - - while(ptaddr->u1.Function){ - OutTraceH("IATPatchEx: ordinal=%x address=%x\n", ptaddr->u1.Ordinal, ptaddr->u1.AddressOfData); - - //if (ptname){ - { - // examining by function name - if(!IMAGE_SNAP_BY_ORDINAL(ptname->u1.Ordinal)){ - piname = (PIMAGE_IMPORT_BY_NAME)(base + (DWORD)ptname->u1.AddressOfData); - OutTraceH("IATPatchEx: BYNAME ordinal=%x address=%x name=%s ord=%x\n", ptaddr->u1.Ordinal, ptaddr->u1.AddressOfData, (char *)piname->Name, piname->Hint); - if(!lstrcmpi(apiname, (char *)piname->Name)) break; - } - else{ - OutTraceH("IATPatchEx: BYORD ordinal=%x address=%x function=%x\n", ptname->u1.Ordinal, ptname->u1.AddressOfData, ptname->u1.Function ); - if((ptname->u1.Ordinal & 0x7FFFFFFF) == ordinal) break; - } - - } - - //if(ptaddr){ - // if(!IMAGE_SNAP_BY_ORDINAL(ptaddr->u1.Ordinal)){ - // piname = (PIMAGE_IMPORT_BY_NAME)(base + (DWORD)ptname->u1.AddressOfData); - // OutTraceH("IATPatchEx: ordinal=%x address=%x name=%s ord=%x\n", ptaddr->u1.Ordinal, ptaddr->u1.AddressOfData, (char *)piname->Name, piname->Hint); - // if(piname->Hint == ordinal) break; - // } - //} - - if (apiproc){ - // examining by function addr - if(ptaddr->u1.Function == (DWORD)apiproc) break; - } - ptaddr ++; - if (ptname) ptname ++; - } - - if(ptaddr->u1.Function) { - org = (void *)ptaddr->u1.Function; - if(org == hookproc) return 0; // already hooked - - if(!VirtualProtect(&ptaddr->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldprotect)) { - OutTraceDW("IATPatchEx: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); - return 0; - } - ptaddr->u1.Function = (DWORD)hookproc; - if(!VirtualProtect(&ptaddr->u1.Function, 4, oldprotect, &oldprotect)) { - OutTraceDW("IATPatchEx: VirtualProtect error %d at %d\n", GetLastError(), __LINE__); - return 0; - } - if (!FlushInstructionCache(GetCurrentProcess(), &ptaddr->u1.Function, 4)) { - OutTraceDW("IATPatchEx: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); - return 0; - } - OutTraceH("IATPatchEx hook=%s address=%x->%x\n", apiname, org, hookproc); - - return org; - } - } - pidesc ++; - } - if(!pidesc->FirstThunk) { - OutTraceH("IATPatchEx: PE unreferenced function %s:%s\n", dll, apiname); - return 0; - } - - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - OutTraceH("IATPatchEx: EXCEPTION hook=%s:%s Hook Failed.\n", dll, apiname); - } - return org; -} diff --git a/dll/winproc.cpp b/dll/winproc.cpp index 6212ada..412b8b0 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -473,6 +473,13 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor(); if (dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL); break; + case WM_SYSCOMMAND: + // v2.03.56.fix1 by FunkyFr3sh: ensure that "C&C Red Alert 2" receives the WM_SYSCOMMAND / SC_CLOSE message + // that likely is filtered by the application logic + if(dxw.Windowize && (wparam == SC_CLOSE) && (dxw.dwFlags6 & TERMINATEONCLOSE)) { + return (*pDefWindowProcA)(hwnd, message, wparam, lparam); + } + break; case WM_CLOSE: // Beware: closing main window does not always mean that the program is about to terminate!!! extern void gShowHideTaskBar(BOOL); diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index e9ab7d3ab3234096ca034354ece6452600ad28bb..0cedd53c9a906144d59b18c7d9a733f9076d7a78 100644 GIT binary patch delta 479 zcmZqZVQuJP-H^k=#_%pJvATA05li4?XKusE1}rR_f3SE&GR919tWf1IW+-AvW{77< zW5{HvU@)9~u}*RFxnd3$2g}&X$qRHu1UVTP7#M+=7l^rlSb4j>8Y4fWx)P9G2gD%o z9Ed?`K;Q+0Vt56lfnt;Y#=mC#H!)FM!V$>p0%B(%{`VgNCQBriOia|7yd%-Wk%8d@ zP@4o0e}rfU8~X*wmImVQP%%>={S$}WuIB*? zf=mEO@&oZ}5FZGbp<-e{HVa4+2)LkPMnE<itP1&R(fkU!=yP5w2(kI`egpcJF_=8}m4EUX|! XZV>*Lss2oCjE+EcVNeA#de#B}{RLi8 delta 393 zcmXZWu}Z^G6b9g%dJ`u_tB4ebu2s;qo1{$*YAFg)i-=vcRhwFkAQCzWEx2h0^&l1( zeSu&h_yE#H@i_!H7YB7{{IAV{@1Api&TyKp+;ru(&6T0ox2ktaCwz@MGf7f8_rH0* zNN4RhmCP|x8>19YMR}uj@kr|W3n}jthQ=84Bs{452xDU0h6l`|f-svFpFZ(0mO&SL zTcFctMY}G2s2Y+qWI%^3EPw&$Fb~}z2o}+IfyT>DVh=+FEU3ah)ZhRP!GS{kz`JhPrRv|R5GqC-;W