From 16a5f20055ff87381471c0762728f7a2800aec5f Mon Sep 17 00:00:00 2001 From: gho tik Date: Thu, 24 Apr 2014 12:39:09 -0400 Subject: [PATCH] v2_02_72_src Former-commit-id: f7a0c8377f43b189e6800e0735c171ab13ca85f9 --- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/exports/dxwnd.ini | 5 --- build/readme-relnotes.txt | 5 +++ dll/ddraw.cpp | 4 +- dll/dxhook.cpp | 7 +-- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 288768 -> 288768 bytes host/dxwndhost.aps | Bin 172140 -> 148656 bytes host/dxwndhost.vs2008.suo | Bin 140800 -> 155136 bytes host/dxwndhostView.cpp | 91 ++++++++++++++++++++++++-------------- 11 files changed, 73 insertions(+), 47 deletions(-) delete mode 100644 build/exports/dxwnd.ini diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 3eacf8a..1da87e5 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd0cab2c1de012cafee122274a0f9f62529e667e5348f1d32f1a8a181339b3e7 -size 473600 +oid sha256:8c611f6cdccad0df1ba3b649511c7d2b439dae191fa2b7789306494873761540 +size 474112 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 673540f..1f9b9e7 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82bfb64a3a58d26ffe21d8e615fb147cb29a86875c3260cdd3fcbed9875b770c +oid sha256:1c883d8d4dfc5696176aa802dd69c0c32d1e682d0672bfb24609b39e2a581950 size 539136 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini deleted file mode 100644 index e030d80..0000000 --- a/build/exports/dxwnd.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window] -posx=1260 -posy=439 -sizx=320 -sizy=200 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index d63a843..9bcac3e 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -467,3 +467,8 @@ fix: hooked "FrameRect", "TabbedTextOutA", "DrawTextA", "DrawTextExA", "FillRect fix: FIXNCHITTEST mode fix: when main win is closed, blit area is made null to avoid messing with a wrong screen area added "Release mouse outside window" option. This option causes the get cursor position to detect a centered mouse position when the cursor is moved outside the window, allowing interaction with other windows without scrolling ot the windowed program. Mainly, this option is meant to help people with a physical disability to use other programs (e. g. the virtual keyboard) to play games. +added "Launch" field (optional) to start the program with arguments or a separate task + +v2.02.72 +fix: fixed Launch field used with "Use DLL injection" flag +fix: somehow improved "Use DLL injection" to avoid blocked tasks and allow exception handling diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index c2c1d6b..3d2758f 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1927,8 +1927,8 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) { HRESULT res; - OutTraceDDRAW("SetCooperativeLevel: hwnd=%x dwFlags=%x(%s)\n", - hwnd, dwflags,ExplainCoopFlags(dwflags)); + OutTraceDDRAW("SetCooperativeLevel: lpdd=%x hwnd=%x dwFlags=%x(%s)\n", + lpdd, hwnd, dwflags,ExplainCoopFlags(dwflags)); InitDDScreenParameters((LPDIRECTDRAW)lpdd); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 2acf486..03fd6e8 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -334,12 +334,10 @@ void SetHook(void *target, void *hookproc, void **hookedproc, char *hookname) OutTrace("SetHook: VirtualProtect ERROR target=%x, err=%x\n", target, GetLastError()); return; // error condition } -#if 0 if(!FlushInstructionCache(GetCurrentProcess(), target, 4)){ OutTrace("SetHook: FlushInstructionCache ERROR target=%x, err=%x\n", target, GetLastError()); return; // error condition } -#endif tmp=(void *)dwTmp; if (*hookedproc && *hookedproc!=tmp) { @@ -1164,8 +1162,9 @@ static HMODULE LoadDisasm() LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) { - OutTrace("UnhandledExceptionFilter: exception code=%x at=%x\n", + OutTrace("UnhandledExceptionFilter: exception code=%x flags=%x addr=%x\n", ExceptionInfo->ExceptionRecord->ExceptionCode, + ExceptionInfo->ExceptionRecord->ExceptionFlags, ExceptionInfo->ExceptionRecord->ExceptionAddress); DWORD oldprot; static HMODULE disasmlib = NULL; @@ -1187,6 +1186,8 @@ LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) OutTrace("UnhandledExceptionFilter: NOP opcode=%x len=%d\n", *(BYTE *)target, cmdlen); memset((BYTE *)target, 0x90, cmdlen); VirtualProtect(target, 10, oldprot, &oldprot); + if(!FlushInstructionCache(GetCurrentProcess(), target, cmdlen)) + OutTrace("UnhandledExceptionFilter: FlushInstructionCache ERROR target=%x, err=%x\n", target, GetLastError()); return EXCEPTION_CONTINUE_EXECUTION; break; default: diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 3b0c00a..1860046 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.71" +#define VERSION "2.02.72" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 32012c6e66c244f860d4e1529b39cc3b9dabb783..0a0527a0851e52848cb9e415786b90ca6802ed2b 100644 GIT binary patch delta 3908 zcmb`K3s6af~$pl2F zZJaowM_Gf`l1k9Tm`1L0?4+@1jSr#@Qm0L=Z3#&`)}W$M1jBFMCk zbRC84Aj=IgHj}`A4X!%`{&}^$F)^E+p zj#cG{Wr~$K)n&O}&Qty!GJ2#_kRY_Qxr-1xp@FF4%-%uWueDrlWp3a)0*d|@ei1!$ zI07y1OH$2!%J8ZW4#}RDH_FLlvDUc074S#-gB&A8R}o@S*2}7~ff7`6H^ZgUc2Ri1 zAGg+YitZ>JX}NPFlxsgl2lvJ0LP)6VMRG*xo76p!nK+mtGQ?7mC+3SKqOHER67(1) zD}RVI12uit%3yM$vmMXCu>nQ$0;`j2O>4~J0fGGfr{h)8K^YyFYhb+XY3NT*abMe# zcL#ezs#b^j+UBW#74M-ql`z*xQfHjz2+C44orbBpzmc`@Inn@T^KS zR86()mH3ERVT5oe${ubcCiv?{VuF>siF&JYx9q8E8fCauTQFEvHDPAZme1U~a*)q* zMMtW+9ywcij~c_x=qu*lvJ8S(e}s&I!cwr6kd6WjMA&*u|1pV zb5b|lcC8}p>XBjC?l2kGVU0z73`0t-XcF&*3Y?JJ4O|9&{gi(6)4|FBo2*N?a@3S07zf%M97u_8W3JRhrVN zs-({hJ}gBpK7@5?}f-5stl8+stT1^D(`hHWK2eso#v9oq>6rHcx`WY*|1nu zxjDbmm}XBal5?b0v=}+-WP?Lht(93;%?~in^|HdDib^DMN@N4=uJK4iRc+)OV<=KJ zZzWgh2S&7=u|=*#!7}Mp-ZHsMjoB^-sGDVSiuG%AfYX7|COB0=nM_jU+og~0ckU?a z=62~)$71DSReVy8RQ_7IYW6&lBUXxZk%R@dO23?MAYx)fEL5i1Zq4El_h@!dvqZ!z z5O0son#CYi3l;U2@n|8eNJWKQ=VU024brokv7fD3u4cT~m%!r{7M5oG66}N@k65l5 zw|xwr+diRL4*XnrPPHToJ9oK{H9VsW@?|LQWzX!cF8xHS* z=hR;_p0HHS{F-H;eKA_Y7d7MxSHpAf3p9HMevvNsqle0Ef**stt(rXz|6^V5mzt%3 zeW=-qhuBGG*8HB|P49~>y(=z~5xI5FD1p!50-7bj?}F!NS0U|tKb4+fBBl1qWL4iN zhb#ZjC`|qEZMjbFob{nP*J|{z6W)=rvMaBk=R{iD?+}&yIrYOgAGN65^>UaB`vU8? zcAp&FgCS4iXo!2kspC5zRQM{c7K_zlCcbSih+O>66N~Vrn1gUKO9iPx^~cSJi5eD`wYe0^D5$9o2SGG;yOL|h1(U$HMTzhZ+-!m|3zdTaNEA5b8 zX}{2`kB43lk5hyAoo2jBFT>+lD4HHB7ld9u2^NgV_aRI4fainRBbqVq10RprSF@S$ ze=&qL%HtTPNnyt{v@*_WDeJvTLTpaPy(Zlf#w7{ne9w9k+$kHQbXM}2fbUe`{}K=NtU z8$MaH5t?y+hGyTu&_9k{AlIU5zq=)UwayMw+13R2cF9d|tP4UN4un zaY>Fh)yX{iwp!67vz%n2Gu=9?cPjLE8~&axOQNAxeDCSb>&VY{>wk5jYU~v`lK=VH z&SrTpv^vaON%qS7GGv4*j;Gj;J(Tn#;rO3FEdS#kiaqh0_sKAxX`OhQ|I0qv{**gE Q6@~ delta 5822 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 diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index e1d6693514f1cfb70c06e94c7e1a700e12752fb9..b1cd8ccfb6fffd5357092a6686de66b3bd5c37a3 100644 GIT binary patch delta 5686 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 E1B8Cn?f?J) delta 20864 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 J9k=Ml{|`8Y+#LV_ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index fe7b07d67bcd84d3345101f849401432e1c2d930..2c43e37970a91f9091c6d373ed051ad0426cbbf1 100644 GIT binary patch delta 18687 zcmaK!37k#!|HjX`W@U^a%NT<@!;B@%7<-CAA~E)q>`}61t0cKoDUx+gx%su(QlW*> zj21$aY!%8@zoe3~`zf^fKhM3-9iP|l|9}0zuldgBIq&nF?|#1L+&e07S6tqQ@$by^ z#b-H=lYyM+E%03*T^*`X!DinoH!)|ce|yy6&)pJ0PC>zxs0+ThuUyCZ=jzp~-lW)^ zsE}A6o0<%8^&yx(L_UZ-9ht1)RO}t4OQ!1R>eYqw+{}VW6`J_G37so?8!OFnD|u;& z*98;jxyjzeYN_7*caPId`2qPCY?Kb>RZO{~9xt@B1U_&Pr~$DQgu)^K7%uG8CT z;Ecfe-y7y<<$3MeC3|<|*7hcR*S#RA(P%d+G%$JDo#NbT#bw8ghJTV%@W&0G_&i^Y zoc!oiFST{880R(c%EdOfruRVWT<_zkMgs#BUzZ-QB4fh6j?VrF2VP^8S zcWtq>r*Ccd>26ek4~CgNQd8f77==vJ+lnDKFWA(h_JUzaaRKl=E=YQdv07o|2vkK^2UvA;^p;E@&@*bE9laBog3^Ds9SYuK(= zN|bONZ%ARC{2?WavZLHR<$ZfPc>culb#6tMVvx~j=Q`w4$O+11JT8M=!TWw`)uR5D z-4V&ruj4qcco<4mfNv^h94XkgoLjM|Lbm%>bWCW?l`6IcFE)3lx!FY%Te!Q&E_~h1 z^S*eYi`P9P$xF%{=9TN^4=#S){V_Ow6=p8~aetA2rR#TtlUBJY!G4F_*(ETO!9j=I zN`!!zT*b(T$3cP`{Wp}d$%lhsmOoE9qjXZ-kce{C*F71+cE*YJnv4e zADQJ@nAz8mXCuFeJQq2#WEMc@^LW9KTETG_-0};CCC9%G@J1L`3edR*2WttS*CD=( zT!>tRydL>IiSU1M)`XkB~PZZ${pN{4w%Y7ZU-5u=a_sa3gO-~P=iNlg;aoL^eD=g*9af8Ro zx~WB}f4Qfk0~|h95RDjv9EV(AtR!M7k?SF|k^ih2a+|v_ z%6D@#$6$W(!U#@^@=f>ci7xsh%J-DJ_RbvF>)ES(aDS|?p4annf6$-k+f#HV&R5R8 zIeeSFua)=#BFc6Wkw28)rHIjXsF|)J)5qJ=af9`GxedBWKg-5d;zayz7OAn9m@9I+OKSn%H`-E`j#zF@o4ZtDO&e&pv_CKA^z z8J}7&iE){dr6F^?`S%B{4tFzbv+v4D~yN1%lgUOb7c+j9X!36n+u=Rg8@|DONoy z>_c#}@T&@9wpb3dpC^zyi&cXT+$MOJAbZkZY_u3F86!4VtR~nzv6W(M9R4k0pNcgE+b*`-usve?!YtmQaX$_gCi&XOxJz-g!feJ#zV6Y> z!Af3Z7n6Lwy-p?TC5*-{F%;*RaCNm3jhw9Dl7QPQ`9YA`As+s92<3B+3?`KGH3?3r z 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 Pv*D=0N^4|n77zanz1-}( diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 5c0f780..09eda0d 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -1539,25 +1539,36 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) // For thread messaging #define DEBUG_EVENT_MESSAGE WM_APP + 0x100 -HWND Ghwnd; +typedef struct { + TARGETMAP *TM; + PRIVATEMAP *PM; +} ThreadInfo_Type; +ThreadInfo_Type ThreadInfo; DWORD WINAPI StartDebug(void *p) { - TARGETMAP *TargetMap; + ThreadInfo_Type *ThInfo; STARTUPINFO sinfo; PROCESS_INFORMATION pinfo, *pi; CREATE_THREAD_DEBUG_INFO *ti; LOAD_DLL_DEBUG_INFO *li; + UNLOAD_DLL_DEBUG_INFO *ui; + EXCEPTION_DEBUG_INFO *ei; + EXIT_PROCESS_DEBUG_INFO *xpi; + EXIT_THREAD_DEBUG_INFO *xti; char path[MAX_PATH]; BOOL step=FALSE; // initialize to TRUE to enable + BOOL stepdll=FALSE; // initialize to TRUE to enable extern char *GetFileNameFromHandle(HANDLE); - TargetMap=(TARGETMAP *)p; + ThInfo = (ThreadInfo_Type *)p; ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); - strcpy_s(path, sizeof(path), TargetMap->path); + strcpy_s(path, sizeof(path), ThInfo->TM->path); PathRemoveFileSpec(path); - CreateProcess(NULL, TargetMap->path, 0, 0, false, DEBUG_ONLY_THIS_PROCESS, NULL, path, &sinfo, &pinfo); + CreateProcess(NULL, + (strlen(ThInfo->PM->launchpath)>0) ? ThInfo->PM->launchpath : ThInfo->TM->path, + 0, 0, false, DEBUG_ONLY_THIS_PROCESS, NULL, path, &sinfo, &pinfo); CString strEventMessage; DEBUG_EVENT debug_event ={0}; bool bContinueDebugging = true; @@ -1566,13 +1577,25 @@ DWORD WINAPI StartDebug(void *p) { int res; char DebugMessage[256+1]; + dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED; if (!WaitForDebugEvent(&debug_event, INFINITE)) return TRUE; switch(debug_event.dwDebugEventCode){ case EXIT_PROCESS_DEBUG_EVENT: - SetWindowText(Ghwnd, "EXIT PROCESS"); + if(step){ + xpi=(EXIT_PROCESS_DEBUG_INFO *)&debug_event.u; + sprintf(DebugMessage, "EXIT PROCESS RetCode=%x", xpi->dwExitCode); + res=MessageBoxEx(0, DebugMessage, "Continue stepping?", MB_YESNO | MB_ICONQUESTION, NULL); + if(res!=IDYES) step=FALSE; + } bContinueDebugging=false; break; case CREATE_PROCESS_DEBUG_EVENT: + // wait for process to stabilize .... + // ref: problems in setting default exception handler in Tomb Raider IV demo + if(ThInfo->TM->flags & HANDLEEXCEPTIONS) { + Sleep(500); + MessageBoxEx(0, "Wait for exception handler ...\nPress OK button", "Pause", MB_OK, NULL); + } if(step){ pi=(PROCESS_INFORMATION *)&debug_event.u; sprintf(DebugMessage, "CREATE PROCESS hProcess=%x dwProcessId=%x path=%s", @@ -1596,45 +1619,52 @@ DWORD WINAPI StartDebug(void *p) } break; case EXIT_THREAD_DEBUG_EVENT: - SetWindowText(Ghwnd, "EXIT THREAD"); + if(step){ + xti=(EXIT_THREAD_DEBUG_INFO *)&debug_event.u; + sprintf(DebugMessage, "EXIT THREAD RetCode=%x", xti->dwExitCode); + res=MessageBoxEx(0, DebugMessage, "Continue stepping?", MB_YESNO | MB_ICONQUESTION, NULL); + if(res!=IDYES) step=FALSE; + } break; case LOAD_DLL_DEBUG_EVENT: - if(step){ + if(stepdll){ li=(LOAD_DLL_DEBUG_INFO *)&debug_event.u; sprintf(DebugMessage, "LOAD DLL hFile=%x path=%s", li->hFile, GetFileNameFromHandle(li->hFile)); res=MessageBoxEx(0, DebugMessage, "Continue stepping?", MB_YESNO | MB_ICONQUESTION, NULL); - if(res!=IDYES) step=FALSE; - + if(res!=IDYES) stepdll=FALSE; } - //li=(LOAD_DLL_DEBUG_INFO *)&debug_event.u; - //if(strstr(GetFileNameFromHandle(li->hFile), "ddraw.dll")){ - // res=MessageBoxEx(0, GetFileNameFromHandle(li->hFile), "ddraw.dll intercepted", MB_OK, NULL); - // GetFullPathName("dxwnd.dll", MAX_PATH, path, NULL); - // if(!Inject(pinfo.dwProcessId, path)){ - // sprintf(DebugMessage,"Injection error: pid=%x dll=%s", pinfo.dwProcessId, path); - // MessageBoxEx(0, DebugMessage, "Injection", MB_ICONEXCLAMATION, NULL); - // } - //} break; case UNLOAD_DLL_DEBUG_EVENT: - SetWindowText(Ghwnd, "UNLOAD DLL"); + if(stepdll){ + ui=(UNLOAD_DLL_DEBUG_INFO *)&debug_event.u; + sprintf(DebugMessage, "UNLOAD DLL Base=%x", ui->lpBaseOfDll); + res=MessageBoxEx(0, DebugMessage, "Continue stepping?", MB_YESNO | MB_ICONQUESTION, NULL); + if(res!=IDYES) stepdll=FALSE; + } break; case OUTPUT_DEBUG_STRING_EVENT: - SetWindowText(Ghwnd, "OUT STRING"); break; case EXCEPTION_DEBUG_EVENT: - SetWindowText(Ghwnd, "EXCEPTION"); + ei=(EXCEPTION_DEBUG_INFO *)&debug_event.u; + if(step){ + sprintf(DebugMessage, "EXCEPTION code=%x flags=%x addr=%x firstchance=%x", + ei->ExceptionRecord.ExceptionCode, + ei->ExceptionRecord.ExceptionFlags, + ei->ExceptionRecord.ExceptionAddress, + debug_event.u.Exception.dwFirstChance); + res=MessageBoxEx(0, DebugMessage, "Continue stepping?", MB_YESNO | MB_ICONQUESTION, NULL); + if(res!=IDYES) step=FALSE; + } + //if(ei->ExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT) + // dwContinueStatus = DBG_CONTINUE; // skip initial breakpoint break; default: break; } - SendMessage(Ghwnd, DEBUG_EVENT_MESSAGE, (WPARAM) &strEventMessage, debug_event.dwDebugEventCode); ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, dwContinueStatus); - // Reset - dwContinueStatus = DBG_CONTINUE; } return TRUE; } @@ -1652,19 +1682,14 @@ void CDxwndhostView::OnRun() if(!listctrl.GetSelectedCount()) return; pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); - - //if(strlen(TitleMaps[i].launchpath)>0){ - // system(TitleMaps[i].launchpath); - // return; - //} - ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); strcpy_s(path, sizeof(path), TargetMaps[i].path); PathRemoveFileSpec(path); if(TargetMaps[i].flags2 & STARTDEBUG){ - Ghwnd=this->m_hWnd; - CreateThread( NULL, 0, StartDebug, &TargetMaps[i], 0, NULL); + ThreadInfo.TM=&TargetMaps[i]; + ThreadInfo.PM=&TitleMaps[i]; + CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL); } else{ CreateProcess(NULL,