mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_04_04_src
Former-commit-id: a950f895d2ca9fd1335d0e115037148169648cf0
This commit is contained in:
parent
e2b83b2dda
commit
ab27610145
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:1db64cc2ff8db11e460be5c81efc1a0da01f7393b14471b0d3fb158105ed4523
|
oid sha256:a5cf1c69e785fd49a000d8d45799f9cc319a62bbade9c8fece0a48fc1860c4c1
|
||||||
size 774656
|
size 774656
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:cac62feee622d3aecce7d6529ebd4f0460d97e9eb20edf79b3a03d935610cc1f
|
oid sha256:faa2086fcb25e8c4f488ce6c9a216819960a29cc365be1debe325635fef886e8
|
||||||
size 669696
|
size 669696
|
||||||
|
@ -1423,3 +1423,14 @@ add: D3D8 16bpp backbuffer emulation on 32bpp color depth. Fixes "Dangerous Wate
|
|||||||
add: more OpenGL wgl* hooks, used by "StarSiege 2014".
|
add: more OpenGL wgl* hooks, used by "StarSiege 2014".
|
||||||
fix: using correct version method pointers in bilinear blit, avoids crash in "Daytona USA" using bilinear filtering
|
fix: using correct version method pointers in bilinear blit, avoids crash in "Daytona USA" using bilinear filtering
|
||||||
fix: do not try to CloseHandle the handle returned by GetMenu, avoids debugger exceptions.
|
fix: do not try to CloseHandle the handle returned by GetMenu, avoids debugger exceptions.
|
||||||
|
|
||||||
|
v2.04.04
|
||||||
|
GUI:
|
||||||
|
add: run unhooked command
|
||||||
|
fix: improved logic to propose config save only when virtual registry string is potentially updated
|
||||||
|
fix: when hooking is disabled, STARTDEBUG and INJECTSUSPENDED processing don't take place
|
||||||
|
DLL:
|
||||||
|
fix: crashing condition on "hide desktop background" option - fixes M&MVI crash
|
||||||
|
fix: mouse loop coordinate fix when main window is not set
|
||||||
|
fix: eliminated log of dmDeviceName field in ChangeDisplaySettings* calls because the field may be not initialized
|
||||||
|
fix: NOMOVIES option now stops also SmackW32 movies (making movie length only 1 photogram).
|
||||||
|
@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#include "TlHelp32.h"
|
#include "TlHelp32.h"
|
||||||
|
|
||||||
#define VERSION "2.04.03.fx1"
|
#define VERSION "2.04.04"
|
||||||
|
|
||||||
#define DDTHREADLOCK 1
|
#define DDTHREADLOCK 1
|
||||||
|
|
||||||
|
Binary file not shown.
@ -509,9 +509,6 @@ void HookD3DDevice8(void** ppD3Ddev8)
|
|||||||
if((dxw.dwFlags5 & TEXTUREMASK) || (dxw.dwFlags4 & NOTEXTURES)){
|
if((dxw.dwFlags5 & TEXTUREMASK) || (dxw.dwFlags4 & NOTEXTURES)){
|
||||||
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 244), extSetTexture8, (void **)&pSetTexture8, "SetTexture(D8)");
|
SetHook((void *)(**(DWORD **)ppD3Ddev8 + 244), extSetTexture8, (void **)&pSetTexture8, "SetTexture(D8)");
|
||||||
}
|
}
|
||||||
//if (!(dxw.dwTFlags & OUTPROXYTRACE)) return;
|
|
||||||
//SetHook((void *)(**(DWORD **)ppD3Ddev8 + 4), extAddRef8, (void **)&pAddRef8, "AddRef(D8)");
|
|
||||||
//SetHook((void *)(**(DWORD **)ppD3Ddev8 + 8), extRelease8, (void **)&pRelease8, "Release(D8)");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HookD3DDevice9(void** ppD3Ddev9)
|
void HookD3DDevice9(void** ppD3Ddev9)
|
||||||
|
@ -155,14 +155,14 @@ void *IATPatchSequential(HMODULE module, DWORD ordinal, char *dll, void *apiproc
|
|||||||
pidesc ++;
|
pidesc ++;
|
||||||
}
|
}
|
||||||
pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva);
|
pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva);
|
||||||
OutTraceB("IATPatch: first call=%s\n", fname);
|
//OutTraceB("IATPatch: first call=%s\n", fname);
|
||||||
|
|
||||||
while(pidesc->FirstThunk){
|
while(pidesc->FirstThunk){
|
||||||
impmodule = (PSTR)(base + pidesc->Name);
|
impmodule = (PSTR)(base + pidesc->Name);
|
||||||
|
|
||||||
if(!lstrcmpi(dll, impmodule)) {
|
if(!lstrcmpi(dll, impmodule)) {
|
||||||
OutTraceH("IATPatch: dll=%s found at %x\n", dll, impmodule);
|
OutTraceH("IATPatch: dll=%s found at %x\n", dll, impmodule);
|
||||||
OutTraceH("IATPatch: first call=%s\n", fname);
|
//OutTraceH("IATPatch: first call=%s\n", fname);
|
||||||
|
|
||||||
ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk);
|
ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk);
|
||||||
ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
|
ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
|
||||||
@ -228,7 +228,7 @@ void *IATPatchSequential(HMODULE module, DWORD ordinal, char *dll, void *apiproc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
OutTraceDW("IATPatch: skip dll=%s first call=%s\n", impmodule, fname);
|
//OutTraceDW("IATPatch: skip dll=%s first call=%s\n", impmodule, fname);
|
||||||
// skip dll fnames ...
|
// skip dll fnames ...
|
||||||
ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk);
|
ptaddr = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->FirstThunk);
|
||||||
//ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
|
//ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
|
||||||
|
@ -6,26 +6,13 @@
|
|||||||
#include "syslibs.h"
|
#include "syslibs.h"
|
||||||
#include "dxhook.h"
|
#include "dxhook.h"
|
||||||
|
|
||||||
#if 0
|
|
||||||
#pragma pack(1)
|
|
||||||
typedef struct {
|
|
||||||
UINT32 Version;
|
|
||||||
UINT32 Width;
|
|
||||||
UINT32 Height;
|
|
||||||
UINT32 Frame;
|
|
||||||
UINT32 mspf;
|
|
||||||
char unknown[864];
|
|
||||||
UINT32 FrameNum;
|
|
||||||
} Smack;
|
|
||||||
#else
|
|
||||||
#include "smack.h"
|
#include "smack.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef Smack * (WINAPI *SmackOpen_Type)(HANDLE, UINT32, INT32);
|
typedef Smack * (WINAPI *SmackOpen_Type)(HANDLE, UINT32, INT32);
|
||||||
typedef Smack * (WINAPI *Smacker_Type)(HANDLE);
|
typedef Smack * (WINAPI *Smacker_Type)(Smack *);
|
||||||
typedef Smack * (WINAPI *Smacker2_Type)(HANDLE, UINT32);
|
typedef Smack * (WINAPI *Smacker2_Type)(Smack *, UINT32);
|
||||||
typedef Smack * (WINAPI *SmackColorRemap_Type)(HANDLE, const void PTR4 *, u32, u32);
|
typedef Smack * (WINAPI *SmackColorRemap_Type)(Smack *, const void PTR4 *, u32, u32);
|
||||||
typedef Smack * (WINAPI *SmackColorRemapWithTrans_Type)(HANDLE, const void PTR4 *, u32, u32, u32);
|
typedef Smack * (WINAPI *SmackColorRemapWithTrans_Type)(Smack *, const void PTR4 *, u32, u32, u32);
|
||||||
typedef u32 (RADEXPLINK *SmackSetSystemRes_Type)(u32);
|
typedef u32 (RADEXPLINK *SmackSetSystemRes_Type)(u32);
|
||||||
|
|
||||||
SmackOpen_Type pSmackOpen;
|
SmackOpen_Type pSmackOpen;
|
||||||
@ -36,16 +23,16 @@ SmackColorRemapWithTrans_Type pSmackColorRemapWithTrans;
|
|||||||
SmackSetSystemRes_Type pSmackSetSystemRes;
|
SmackSetSystemRes_Type pSmackSetSystemRes;
|
||||||
|
|
||||||
Smack * WINAPI extSmackOpen(HANDLE, UINT32, INT32);
|
Smack * WINAPI extSmackOpen(HANDLE, UINT32, INT32);
|
||||||
Smack * WINAPI extSmackClose(HANDLE);
|
Smack * WINAPI extSmackClose(Smack *);
|
||||||
Smack * WINAPI extSmackWait(HANDLE);
|
Smack * WINAPI extSmackWait(Smack *);
|
||||||
Smack * WINAPI extSmackDoFrame(HANDLE);
|
Smack * WINAPI extSmackDoFrame(Smack *);
|
||||||
Smack * WINAPI extSmackNextFrame(HANDLE);
|
Smack * WINAPI extSmackNextFrame(Smack *);
|
||||||
Smack * WINAPI extSmackSoundUseMSS(HANDLE);
|
Smack * WINAPI extSmackSoundUseMSS(Smack *);
|
||||||
Smack * WINAPI extSmackSoundUseDirectSound(HANDLE);
|
Smack * WINAPI extSmackSoundUseDirectSound(Smack *);
|
||||||
Smack * WINAPI extSmackSoundOnOff(HANDLE, UINT32);
|
Smack * WINAPI extSmackSoundOnOff(Smack *, UINT32);
|
||||||
Smack * WINAPI extSmackGoto(HANDLE, UINT32);
|
Smack * WINAPI extSmackGoto(Smack *, UINT32);
|
||||||
Smack * WINAPI extSmackColorRemap(HANDLE, const void PTR4 *, u32, u32);
|
Smack * WINAPI extSmackColorRemap(Smack *, const void PTR4 *, u32, u32);
|
||||||
Smack * WINAPI extSmackColorRemapWithTrans(HANDLE, const void PTR4 *, u32, u32, u32);
|
Smack * WINAPI extSmackColorRemapWithTrans(Smack *, const void PTR4 *, u32, u32, u32);
|
||||||
u32 RADEXPLINK extSmackSetSystemRes(u32 mode);
|
u32 RADEXPLINK extSmackSetSystemRes(u32 mode);
|
||||||
|
|
||||||
static HookEntryEx_Type Hooks[]={
|
static HookEntryEx_Type Hooks[]={
|
||||||
@ -124,32 +111,36 @@ static void DumpSmack(Smack *s)
|
|||||||
|
|
||||||
Smack * WINAPI extSmackOpen(HANDLE SmackFile, UINT32 flags, INT32 extrabuf)
|
Smack * WINAPI extSmackOpen(HANDLE SmackFile, UINT32 flags, INT32 extrabuf)
|
||||||
{
|
{
|
||||||
Smack *ret;
|
Smack *h;
|
||||||
OutTraceDW("SmackOpen: SmackFile=%x flags=%x(%s) extrabuf=%x\n", SmackFile, flags, ExplainSmackFlags(flags), extrabuf);
|
OutTraceDW("SmackOpen: SmackFile=%x flags=%x(%s) extrabuf=%x\n", SmackFile, flags, ExplainSmackFlags(flags), extrabuf);
|
||||||
if(!pSmackOpen) OutTraceE("ASSERT: NULL pSmackOpen\n");
|
if(!pSmackOpen) OutTraceE("ASSERT: NULL pSmackOpen\n");
|
||||||
ret=(*pSmackOpen)(SmackFile, flags, extrabuf);
|
h=(*pSmackOpen)(SmackFile, flags, extrabuf);
|
||||||
OutTraceDW("SmackOpen: ret=%x\n", ret);
|
OutTraceDW("SmackOpen: ret=%x\n", h);
|
||||||
if (ret) {
|
if (!h) return NULL;
|
||||||
OutTraceDW("SmackOpen: version=\"%4.4s\" screen=(%dx%d) frame_count=%d frame_number=%d\n",
|
|
||||||
(char *)&(ret->Version), ret->Width, ret->Height, ret->Frames, ret->FrameNum);
|
DumpSmack(h);
|
||||||
|
if(dxw.dwFlags6 & NOMOVIES) {
|
||||||
|
OutTraceDW("SmackOpen: NOMOVIES\n");
|
||||||
|
h->Frames = 1; // returning NULL or a frame counter below 1 is risky!
|
||||||
|
return h;
|
||||||
}
|
}
|
||||||
return ret;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackClose(HANDLE h)
|
Smack * WINAPI extSmackClose(Smack *h)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackClose: h=%x\n", h);
|
OutTraceDW("SmackClose: h=%x\n", h);
|
||||||
return (*pSmackClose)(h);
|
return (*pSmackClose)(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackWait(HANDLE h)
|
Smack * WINAPI extSmackWait(Smack *h)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackWait: h=%x\n", h);
|
OutTraceDW("SmackWait: h=%x\n", h);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack((Smack *)h);
|
||||||
return (*pSmackWait)(h);
|
return (*pSmackWait)(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackDoFrame(HANDLE h)
|
Smack * WINAPI extSmackDoFrame(Smack *h)
|
||||||
{
|
{
|
||||||
Smack *ret;
|
Smack *ret;
|
||||||
OutTraceDW("SmackDoFrame: h=%x\n", h);
|
OutTraceDW("SmackDoFrame: h=%x\n", h);
|
||||||
@ -162,57 +153,57 @@ Smack * WINAPI extSmackDoFrame(HANDLE h)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackNextFrame(HANDLE h)
|
Smack * WINAPI extSmackNextFrame(Smack *h)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackNextFrame: h=%x\n", h);
|
OutTraceDW("SmackNextFrame: h=%x\n", h);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
return (*pSmackNextFrame)(h);
|
return (*pSmackNextFrame)(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackSoundUseMSS(HANDLE h)
|
Smack * WINAPI extSmackSoundUseMSS(Smack *h)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackSoundUseMSS: h=%x\n", h);
|
OutTraceDW("SmackSoundUseMSS: h=%x\n", h);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
return (*pSmackSoundUseMSS)(h);
|
return (*pSmackSoundUseMSS)(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackSoundUseDirectSound(HANDLE h)
|
Smack * WINAPI extSmackSoundUseDirectSound(Smack *h)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackSoundUseDirectSound: h=%x\n", h);
|
OutTraceDW("SmackSoundUseDirectSound: h=%x\n", h);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
return (*pSmackSoundUseDirectSound)(h);
|
return (*pSmackSoundUseDirectSound)(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackSoundOnOff(HANDLE h, UINT32 flag)
|
Smack * WINAPI extSmackSoundOnOff(Smack *h, UINT32 flag)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackSoundOnOff: h=%x flag=%x\n", h, flag);
|
OutTraceDW("SmackSoundOnOff: h=%x flag=%x\n", h, flag);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
return (*pSmackSoundOnOff)(h, flag);
|
return (*pSmackSoundOnOff)(h, flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackGoto(HANDLE h, UINT32 flag)
|
Smack * WINAPI extSmackGoto(Smack *h, UINT32 flag)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackGoto: h=%x flag=%x\n", h, flag);
|
OutTraceDW("SmackGoto: h=%x flag=%x\n", h, flag);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
return (*pSmackGoto)(h, flag);
|
return (*pSmackGoto)(h, flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackColorRemap(HANDLE h, const void PTR4 *remappal, u32 numcolors, u32 paltype)
|
Smack * WINAPI extSmackColorRemap(Smack *h, const void PTR4 *remappal, u32 numcolors, u32 paltype)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackColorRemap: h=%x numcolors=%d paltype=%d\n", h, numcolors, paltype);
|
OutTraceDW("SmackColorRemap: h=%x numcolors=%d paltype=%d\n", h, numcolors, paltype);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
// BYPASS the call to avoid resolution changes
|
// BYPASS the call to avoid resolution changes
|
||||||
//return (*pSmackColorRemap)(h, remappal, numcolors, paltype);
|
//return (*pSmackColorRemap)(h, remappal, numcolors, paltype);
|
||||||
return (Smack *)h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
Smack * WINAPI extSmackColorRemapWithTrans(HANDLE h, const void PTR4 *remappal, u32 numcolors, u32 paltype, u32 transindex)
|
Smack * WINAPI extSmackColorRemapWithTrans(Smack *h, const void PTR4 *remappal, u32 numcolors, u32 paltype, u32 transindex)
|
||||||
{
|
{
|
||||||
OutTraceDW("SmackColorRemapWithTrans: h=%x numcolors=%d paltype=%d transindex=%d\n", h, numcolors, paltype, transindex);
|
OutTraceDW("SmackColorRemapWithTrans: h=%x numcolors=%d paltype=%d transindex=%d\n", h, numcolors, paltype, transindex);
|
||||||
DumpSmack((Smack *)h);
|
DumpSmack(h);
|
||||||
// BYPASS the call to avoid resolution changes
|
// BYPASS the call to avoid resolution changes
|
||||||
//return (*pSmackColorRemapWithTrans)(h, remappal, numcolors, paltype);
|
//return (*pSmackColorRemapWithTrans)(h, remappal, numcolors, paltype);
|
||||||
return (Smack *)h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------
|
/* ---------------------------------------------------------------
|
||||||
|
@ -165,7 +165,7 @@ static HookEntryEx_Type Hooks[]={
|
|||||||
|
|
||||||
//{HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage},
|
//{HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage},
|
||||||
|
|
||||||
{HOOK_IAT_CANDIDATE, 0, "UpdateWindow", (FARPROC)NULL, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow},
|
{HOOK_IAT_CANDIDATE, 0, "UpdateWindow", (FARPROC)UpdateWindow, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow}, // v2.04.04: needed for "Hide Desktop" option
|
||||||
//{HOOK_IAT_CANDIDATE, 0, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement},
|
//{HOOK_IAT_CANDIDATE, 0, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement},
|
||||||
//{HOOK_IAT_CANDIDATE, 0, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement},
|
//{HOOK_IAT_CANDIDATE, 0, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement},
|
||||||
{HOOK_HOT_CANDIDATE, 0x25, "ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA},
|
{HOOK_HOT_CANDIDATE, 0x25, "ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA},
|
||||||
@ -777,6 +777,7 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow)
|
|||||||
BOOL res;
|
BOOL res;
|
||||||
extern HWND hTrayWnd;
|
extern HWND hTrayWnd;
|
||||||
static long iLastSizX, iLastSizY;
|
static long iLastSizX, iLastSizY;
|
||||||
|
int nOrigCmd;
|
||||||
//static long iLastPosX, iLastPosY;
|
//static long iLastPosX, iLastPosY;
|
||||||
|
|
||||||
OutTraceDW("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow));
|
OutTraceDW("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow));
|
||||||
@ -787,6 +788,7 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nOrigCmd = nCmdShow;
|
||||||
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
|
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
|
||||||
if(nCmdShow==SW_MAXIMIZE){
|
if(nCmdShow==SW_MAXIMIZE){
|
||||||
OutTraceDW("ShowWindow: suppress SW_MAXIMIZE maximize\n");
|
OutTraceDW("ShowWindow: suppress SW_MAXIMIZE maximize\n");
|
||||||
@ -804,14 +806,12 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow)
|
|||||||
}
|
}
|
||||||
|
|
||||||
res=(*pShowWindow)(hwnd, nCmdShow);
|
res=(*pShowWindow)(hwnd, nCmdShow);
|
||||||
// v2.03.95: force zero size when minimize and drefresh window coordinates
|
// v2.03.95: force zero size when minimize and refresh window coordinates
|
||||||
if(hwnd == dxw.GethWnd()){
|
if(hwnd == dxw.GethWnd()){
|
||||||
if(nCmdShow==SW_MINIMIZE) {
|
if(nCmdShow==SW_MINIMIZE) {
|
||||||
dxw.IsVisible = FALSE;
|
dxw.IsVisible = FALSE;
|
||||||
iLastSizX = dxw.iSizX;
|
iLastSizX = dxw.iSizX;
|
||||||
iLastSizY = dxw.iSizY;
|
iLastSizY = dxw.iSizY;
|
||||||
//iLastPosX = dxw.iPosX;
|
|
||||||
//iLastPosY = dxw.iPosY;
|
|
||||||
dxw.iSizX = dxw.iSizY = 0;
|
dxw.iSizX = dxw.iSizY = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -819,11 +819,10 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow)
|
|||||||
if((dxw.iSizX == 0) && (dxw.iSizY == 0)){
|
if((dxw.iSizX == 0) && (dxw.iSizY == 0)){
|
||||||
dxw.iSizX = iLastSizX;
|
dxw.iSizX = iLastSizX;
|
||||||
dxw.iSizY = iLastSizY;
|
dxw.iSizY = iLastSizY;
|
||||||
//dxw.iPosX = iLastPosX;
|
|
||||||
//dxw.iPosY = iLastPosY;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//dxw.UpdateDesktopCoordinates();
|
//dxw.UpdateDesktopCoordinates();
|
||||||
OutTraceDW("ShowWindow: res=%x\n", res);
|
OutTraceDW("ShowWindow: res=%x\n", res);
|
||||||
|
|
||||||
@ -1269,8 +1268,14 @@ static BOOL WINAPI extPeekMessage(PeekMessage_Type pPeekMessage, LPMSG lpMsg, HW
|
|||||||
lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res);
|
lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dxw.dwFlags1 & MODIFYMOUSE){
|
if((dxw.dwFlags1 & MODIFYMOUSE) && dxw.GethWnd()){
|
||||||
extGetCursorPos(&(lpMsg->pt));
|
POINT point;
|
||||||
|
//res=(*pGetCursorPos)(&point); // can't do this. Why?
|
||||||
|
point = lpMsg->pt;
|
||||||
|
point=dxw.ScreenToClient(point);
|
||||||
|
point=dxw.FixCursorPos(point);
|
||||||
|
OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", lpMsg->pt.x, lpMsg->pt.y, point.x, point.y);
|
||||||
|
lpMsg->pt = point;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dxw.dwFlags1 & SLOWDOWN) (*pSleep)(1);
|
if(dxw.dwFlags1 & SLOWDOWN) (*pSleep)(1);
|
||||||
@ -2340,8 +2345,9 @@ LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags)
|
|||||||
if(IsTraceDDRAW){
|
if(IsTraceDDRAW){
|
||||||
char sInfo[1024];
|
char sInfo[1024];
|
||||||
strcpy(sInfo, "");
|
strcpy(sInfo, "");
|
||||||
if (lpDevMode) sprintf(sInfo, " DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d",
|
// v2.04.04: dmDeviceName not printed since it could be not initialized (Warhammer SOTHR)
|
||||||
lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
|
if (lpDevMode) sprintf(sInfo, " fields=%x(%s) size=(%d x %d) bpp=%d",
|
||||||
|
lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
|
||||||
lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
|
lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
|
||||||
OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x(%s)%s\n",
|
OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x(%s)%s\n",
|
||||||
lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
|
lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
|
||||||
@ -2358,8 +2364,9 @@ LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags)
|
|||||||
if(IsTraceDDRAW){
|
if(IsTraceDDRAW){
|
||||||
char sInfo[1024];
|
char sInfo[1024];
|
||||||
strcpy(sInfo, "");
|
strcpy(sInfo, "");
|
||||||
if (lpDevMode) sprintf(sInfo, " DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d",
|
// v2.04.04: dmDeviceName not printed since it could be not initialized (Warhammer SOTHR)
|
||||||
lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
|
if (lpDevMode) sprintf(sInfo, "fields=%x(%s) size=(%d x %d) bpp=%d",
|
||||||
|
lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields),
|
||||||
lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
|
lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel);
|
||||||
OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x(%s)%s\n",
|
OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x(%s)%s\n",
|
||||||
lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
|
lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo);
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -95,7 +95,6 @@ static char *Unescape(char *s, char **dest)
|
|||||||
return *dest;
|
return *dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void GetFolderFromPath(char *path)
|
void GetFolderFromPath(char *path)
|
||||||
{
|
{
|
||||||
for(char *c=&path[strlen(path)-1]; (c>path) && (*c!='\\'); c--) *c=0;
|
for(char *c=&path[strlen(path)-1]; (c>path) && (*c!='\\'); c--) *c=0;
|
||||||
@ -1230,6 +1229,7 @@ void CDxwndhostView::SaveConfigFile()
|
|||||||
}
|
}
|
||||||
for(; i < MAXTARGETS; i ++) ClearTarget(i, gInitPath);
|
for(; i < MAXTARGETS; i ++) ClearTarget(i, gInitPath);
|
||||||
this->isUpdated=FALSE;
|
this->isUpdated=FALSE;
|
||||||
|
this->isRegistryUpdated=FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
CDxwndhostView::~CDxwndhostView()
|
CDxwndhostView::~CDxwndhostView()
|
||||||
@ -1384,6 +1384,7 @@ void CDxwndhostView::OnInitialUpdate()
|
|||||||
this->OnHookStop();
|
this->OnHookStop();
|
||||||
if(m_StartToTray) this->OnGoToTrayIcon();
|
if(m_StartToTray) this->OnGoToTrayIcon();
|
||||||
this->isUpdated=FALSE;
|
this->isUpdated=FALSE;
|
||||||
|
this->isRegistryUpdated=FALSE;
|
||||||
pTitles = &PrivateMaps[0];
|
pTitles = &PrivateMaps[0];
|
||||||
pTargets= &TargetMaps[0];
|
pTargets= &TargetMaps[0];
|
||||||
|
|
||||||
@ -1488,6 +1489,7 @@ BOOL CDxwndhostView::OnImport(CString sFilePath)
|
|||||||
Resize();
|
Resize();
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1567,6 +1569,7 @@ void CDxwndhostView::OnImport()
|
|||||||
Resize();
|
Resize();
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1591,6 +1594,7 @@ void CDxwndhostView::OnModify()
|
|||||||
strnncpy(PrivateMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE);
|
strnncpy(PrivateMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE);
|
||||||
PrivateMaps[i].notes = (char *)realloc(PrivateMaps[i].notes, strlen(dlg.m_Notes.GetString())+1);
|
PrivateMaps[i].notes = (char *)realloc(PrivateMaps[i].notes, strlen(dlg.m_Notes.GetString())+1);
|
||||||
strcpy(PrivateMaps[i].notes, (char *)dlg.m_Notes.GetString());
|
strcpy(PrivateMaps[i].notes, (char *)dlg.m_Notes.GetString());
|
||||||
|
if(strcmp((char *)dlg.m_Registry.GetString(), PrivateMaps[i].registry)) this->isRegistryUpdated=TRUE;
|
||||||
PrivateMaps[i].registry = (char *)realloc(PrivateMaps[i].registry, strlen(dlg.m_Registry.GetString())+1);
|
PrivateMaps[i].registry = (char *)realloc(PrivateMaps[i].registry, strlen(dlg.m_Registry.GetString())+1);
|
||||||
strcpy(PrivateMaps[i].registry, (char *)dlg.m_Registry.GetString());
|
strcpy(PrivateMaps[i].registry, (char *)dlg.m_Registry.GetString());
|
||||||
strnncpy(PrivateMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH);
|
strnncpy(PrivateMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH);
|
||||||
@ -1829,6 +1833,7 @@ void CDxwndhostView::OnSort()
|
|||||||
|
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL PauseResumeThreadList(DWORD dwOwnerPID, bool bResumeThread)
|
BOOL PauseResumeThreadList(DWORD dwOwnerPID, bool bResumeThread)
|
||||||
@ -2071,6 +2076,7 @@ void CDxwndhostView::OnAdd(char *sInitialPath)
|
|||||||
Resize();
|
Resize();
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2105,6 +2111,7 @@ void CDxwndhostView::OnDuplicate()
|
|||||||
}
|
}
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDxwndhostView::OnMoveTop()
|
void CDxwndhostView::OnMoveTop()
|
||||||
@ -2141,6 +2148,7 @@ void CDxwndhostView::OnMoveTop()
|
|||||||
}
|
}
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDxwndhostView::OnMoveUp()
|
void CDxwndhostView::OnMoveUp()
|
||||||
@ -2175,6 +2183,7 @@ void CDxwndhostView::OnMoveUp()
|
|||||||
}
|
}
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDxwndhostView::OnMoveDown()
|
void CDxwndhostView::OnMoveDown()
|
||||||
@ -2209,6 +2218,7 @@ void CDxwndhostView::OnMoveDown()
|
|||||||
}
|
}
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDxwndhostView::OnMoveBottom()
|
void CDxwndhostView::OnMoveBottom()
|
||||||
@ -2246,6 +2256,7 @@ void CDxwndhostView::OnMoveBottom()
|
|||||||
}
|
}
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDxwndhostView::OnDelete()
|
void CDxwndhostView::OnDelete()
|
||||||
@ -2281,6 +2292,7 @@ void CDxwndhostView::OnDelete()
|
|||||||
Resize();
|
Resize();
|
||||||
SetTarget(TargetMaps);
|
SetTarget(TargetMaps);
|
||||||
this->isUpdated=TRUE;
|
this->isUpdated=TRUE;
|
||||||
|
this->isRegistryUpdated=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDxwndhostView::OnHookStart()
|
void CDxwndhostView::OnHookStart()
|
||||||
@ -2545,6 +2557,9 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point)
|
|||||||
case ID_PRUN:
|
case ID_PRUN:
|
||||||
OnRun();
|
OnRun();
|
||||||
break;
|
break;
|
||||||
|
case ID_RUNUNHOOKED:
|
||||||
|
OnRun(TRUE);
|
||||||
|
break;
|
||||||
case ID_PMODIFY:
|
case ID_PMODIFY:
|
||||||
OnModify();
|
OnModify();
|
||||||
break;
|
break;
|
||||||
@ -3230,6 +3245,11 @@ static void MakeHiddenFile(char *sTargetPath)
|
|||||||
PROCESSMAP pm;
|
PROCESSMAP pm;
|
||||||
|
|
||||||
void CDxwndhostView::OnRun()
|
void CDxwndhostView::OnRun()
|
||||||
|
{
|
||||||
|
OnRun(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDxwndhostView::OnRun(BOOL bForceNoHook)
|
||||||
{
|
{
|
||||||
CListCtrl& listctrl = GetListCtrl();
|
CListCtrl& listctrl = GetListCtrl();
|
||||||
POSITION pos;
|
POSITION pos;
|
||||||
@ -3268,8 +3288,9 @@ void CDxwndhostView::OnRun()
|
|||||||
MakeHiddenFile(exepath);
|
MakeHiddenFile(exepath);
|
||||||
strncpy(RestrictedMaps[0].path, exepath, MAX_PATH);
|
strncpy(RestrictedMaps[0].path, exepath, MAX_PATH);
|
||||||
}
|
}
|
||||||
|
if(bForceNoHook) RestrictedMaps[0].flags3 &= ~HOOKENABLED;
|
||||||
SetTarget(RestrictedMaps);
|
SetTarget(RestrictedMaps);
|
||||||
OutTrace("OnRun idx=%d prog=\"%s\"\n", i, TargetMaps[i].path);
|
OutTrace("OnRun idx=%d prog=\"%s\" unhooked=%x\n", i, TargetMaps[i].path, bForceNoHook);
|
||||||
|
|
||||||
if(TargetMaps[i].flags7 & HOOKNORUN){
|
if(TargetMaps[i].flags7 & HOOKNORUN){
|
||||||
MessageBoxLang(DXW_STRING_CANT_RUN, DXW_STRING_WARNING, MB_ICONERROR|MB_OK);
|
MessageBoxLang(DXW_STRING_CANT_RUN, DXW_STRING_WARNING, MB_ICONERROR|MB_OK);
|
||||||
@ -3287,7 +3308,7 @@ void CDxwndhostView::OnRun()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((TargetMaps[i].flags3 & EMULATEREGISTRY) || (TargetMaps[i].flags4 & OVERRIDEREGISTRY)){
|
if((TargetMaps[i].flags3 & EMULATEREGISTRY) || (TargetMaps[i].flags4 & OVERRIDEREGISTRY)){
|
||||||
if(this->isUpdated){
|
if(this->isRegistryUpdated){
|
||||||
if(MessageBoxLang(DXW_STRING_VREG_UPDATE,DXW_STRING_WARNING, MB_OKCANCEL|MB_ICONINFORMATION)==IDOK)
|
if(MessageBoxLang(DXW_STRING_VREG_UPDATE,DXW_STRING_WARNING, MB_OKCANCEL|MB_ICONINFORMATION)==IDOK)
|
||||||
this->SaveConfigFile();
|
this->SaveConfigFile();
|
||||||
}
|
}
|
||||||
@ -3307,7 +3328,9 @@ void CDxwndhostView::OnRun()
|
|||||||
CheckSafeDiscVersion(TargetMaps[i].path);
|
CheckSafeDiscVersion(TargetMaps[i].path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(TargetMaps[i].flags2 & STARTDEBUG){
|
// v2.04.04: fix - STARTDEBUG and INJECTSUSPENDED must take place only when HOOKENABLED
|
||||||
|
if ((TargetMaps[i].flags2 & STARTDEBUG) &&
|
||||||
|
(TargetMaps[i].flags3 & HOOKENABLED)){
|
||||||
OutTrace("debugger mode\n");
|
OutTrace("debugger mode\n");
|
||||||
ThreadInfo_Type ThreadInfo;
|
ThreadInfo_Type ThreadInfo;
|
||||||
ThreadInfo.TM=&TargetMaps[i];
|
ThreadInfo.TM=&TargetMaps[i];
|
||||||
@ -3316,7 +3339,8 @@ void CDxwndhostView::OnRun()
|
|||||||
CloseHandle(CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL));
|
CloseHandle(CreateThread( NULL, 0, StartDebug, &ThreadInfo, 0, NULL));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if(TargetMaps[i].flags7 & INJECTSUSPENDED){
|
if ((TargetMaps[i].flags7 & INJECTSUSPENDED) &&
|
||||||
|
(TargetMaps[i].flags3 & HOOKENABLED)){
|
||||||
OutTrace("injectsuspended mode\n");
|
OutTrace("injectsuspended mode\n");
|
||||||
InjectSuspended(exepath, folderpath);
|
InjectSuspended(exepath, folderpath);
|
||||||
}
|
}
|
||||||
@ -3337,7 +3361,9 @@ void CDxwndhostView::OnRun()
|
|||||||
|
|
||||||
// wait & recover
|
// wait & recover
|
||||||
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecoverTargetMaps, (LPVOID)TargetMaps, 0, NULL);
|
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecoverTargetMaps, (LPVOID)TargetMaps, 0, NULL);
|
||||||
if(gAutoHideMode) this->OnGoToTrayIcon();
|
// go to tray icon mode when autohide is set, but only if hooking is enabled. If not enable it
|
||||||
|
// is not possible to monitor the process status, so the window will never show automatically!
|
||||||
|
if(gAutoHideMode && !bForceNoHook) this->OnGoToTrayIcon();
|
||||||
|
|
||||||
// not working: the file is opened, can't be deleted
|
// not working: the file is opened, can't be deleted
|
||||||
//if(TargetMaps[i].flags7 & COPYNOSHIMS){
|
//if(TargetMaps[i].flags7 & COPYNOSHIMS){
|
||||||
|
@ -18,6 +18,7 @@ protected: // Create from serialization only features.
|
|||||||
afx_msg void OnHotKey(UINT, UINT, UINT);
|
afx_msg void OnHotKey(UINT, UINT, UINT);
|
||||||
DECLARE_DYNCREATE(CDxwndhostView)
|
DECLARE_DYNCREATE(CDxwndhostView)
|
||||||
BOOL isUpdated;
|
BOOL isUpdated;
|
||||||
|
BOOL isRegistryUpdated;
|
||||||
void SaveConfigFile();
|
void SaveConfigFile();
|
||||||
BOOL OnInitDialog();
|
BOOL OnInitDialog();
|
||||||
|
|
||||||
@ -89,6 +90,7 @@ protected:
|
|||||||
afx_msg void OnSetPath();
|
afx_msg void OnSetPath();
|
||||||
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
|
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
|
||||||
afx_msg void OnRun();
|
afx_msg void OnRun();
|
||||||
|
afx_msg void OnRun(BOOL);
|
||||||
afx_msg void OnClearAllLogs();
|
afx_msg void OnClearAllLogs();
|
||||||
afx_msg void OnGoToTrayIcon();
|
afx_msg void OnGoToTrayIcon();
|
||||||
afx_msg void OnSaveFile();
|
afx_msg void OnSaveFile();
|
||||||
|
BIN
host/resource
BIN
host/resource
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user