mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_03_43_src
Former-commit-id: 0c803637a7ab97963738d27af966c40851b0cb19
This commit is contained in:
parent
cad6787a93
commit
d9a1b51681
@ -208,6 +208,7 @@
|
||||
#define CREATEDESKTOP 0x01000000 // creates a virtual desktop window to replace the real one
|
||||
#define NOWINDOWHOOKS 0x02000000 // do not intercept window callback routines
|
||||
#define SYNCPALETTE 0x04000000 // Syncronize GDI to DDRAW palette
|
||||
#define VIRTUALJOYSTICK 0x08000000 // Enables the DxWnd virtual joystick
|
||||
|
||||
// logging Tflags DWORD:
|
||||
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aea2bada6a8f9329392fea5ab8975c3751d32c6a84c8f02924cdef0f42854dca
|
||||
size 595456
|
||||
oid sha256:367c504db6f66d3f5c9e40e1a3e3aeb94f3c5a3df7b7bd9134a649379a40c8fa
|
||||
size 612864
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d242c24095ab0e76e32fe9d98821ab993f406512317a733859b531f466d160f7
|
||||
oid sha256:4b44208fd7eef222ff0861d95418c3aabb46481b83198c1b40d769bc52f6a8b4
|
||||
size 545792
|
||||
|
143
build/dxwnd.ini
143
build/dxwnd.ini
@ -1,26 +1,26 @@
|
||||
[window]
|
||||
exportpath=D:\DxWnd\exports\
|
||||
posx=1231
|
||||
posy=493
|
||||
exportpath=D:\DxWnd\v2_03_43_src\build\exports\
|
||||
exepath=D:\Games\Arx Fatalis demo\
|
||||
posx=1946
|
||||
posy=567
|
||||
sizx=320
|
||||
sizy=200
|
||||
exepath=D:\Games\Men in Black\
|
||||
[target]
|
||||
title0=Fin-Fin
|
||||
path0=D:\Games\Fin-Fin\v90seger\teoboot.exe
|
||||
launchpath0=D:\Games\Fin-Fin\v90seger\FinFin.exe
|
||||
module0=
|
||||
title0=Arx Fatalis demo
|
||||
path0=D:\Games\Arx Fatalis demo\ARX.exe
|
||||
launchpath0=
|
||||
module0=Athena
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=-1465909214
|
||||
flag0=136314918
|
||||
flagg0=1207959552
|
||||
flagh0=20
|
||||
flagi0=205520900
|
||||
flagh0=65552
|
||||
flagi0=138412036
|
||||
flagj0=4224
|
||||
flagk0=327680
|
||||
flagk0=65536
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
@ -28,7 +28,7 @@ minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=50
|
||||
posx0=150
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
@ -37,28 +37,28 @@ initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
||||
title1=Men in Black
|
||||
path1=D:\Games\Men in Black\MiBd.exe
|
||||
title1=TieFighter 95
|
||||
path1=D:\Games\TIE95\TIE95.EXE
|
||||
launchpath1=
|
||||
module1=RWL21
|
||||
module1=
|
||||
opengllib1=
|
||||
notes1=
|
||||
notes1=The game can be played also with no joystick using the DxWnd virtual one.\nIf you have a real joystick, the "Use DLL injection" flag is not necessary.\nUse "Unlock Z order" to avoid losing control of the window.
|
||||
registry1=
|
||||
ver1=0
|
||||
ver1=1
|
||||
coord1=0
|
||||
flag1=136314914
|
||||
flagg1=1209008128
|
||||
flag1=681574514
|
||||
flagg1=1744830464
|
||||
flagh1=20
|
||||
flagi1=138412036
|
||||
flagj1=4224
|
||||
flagk1=327680
|
||||
tflag1=-2147477245
|
||||
flagj1=1073746048
|
||||
flagk1=136642560
|
||||
tflag1=0
|
||||
initx1=0
|
||||
inity1=0
|
||||
minx1=0
|
||||
miny1=0
|
||||
maxx1=0
|
||||
maxy1=0
|
||||
maxx1=800
|
||||
maxy1=600
|
||||
posx1=50
|
||||
posy1=50
|
||||
sizx1=800
|
||||
@ -68,96 +68,3 @@ initts1=0
|
||||
winver1=0
|
||||
maxres1=-1
|
||||
swapeffect1=0
|
||||
title2=STCC Swedish TouringCar Championship
|
||||
path2=D:\Games\STCC\STCC.exe
|
||||
launchpath2=
|
||||
module2=
|
||||
opengllib2=
|
||||
notes2=Still slow and choppy in emulation mode
|
||||
registry2=
|
||||
ver2=0
|
||||
coord2=0
|
||||
flag2=136314914
|
||||
flagg2=1207959552
|
||||
flagh2=-2147483628
|
||||
flagi2=138412036
|
||||
flagj2=268439680
|
||||
flagk2=69632
|
||||
tflag2=-2147477245
|
||||
initx2=0
|
||||
inity2=0
|
||||
minx2=0
|
||||
miny2=0
|
||||
maxx2=0
|
||||
maxy2=0
|
||||
posx2=50
|
||||
posy2=50
|
||||
sizx2=800
|
||||
sizy2=600
|
||||
maxfps2=0
|
||||
initts2=0
|
||||
winver2=0
|
||||
maxres2=-1
|
||||
swapeffect2=0
|
||||
title3=DOSBox.exe
|
||||
path3=D:\Program Files (x86)\DOSBox-0.74\DOSBox.exe
|
||||
launchpath3=
|
||||
module3=
|
||||
opengllib3=
|
||||
notes3=
|
||||
registry3=
|
||||
ver3=0
|
||||
coord3=0
|
||||
flag3=681574434
|
||||
flagg3=1744830464
|
||||
flagh3=20
|
||||
flagi3=138412036
|
||||
flagj3=4224
|
||||
flagk3=327680
|
||||
tflag3=0
|
||||
initx3=0
|
||||
inity3=0
|
||||
minx3=0
|
||||
miny3=0
|
||||
maxx3=0
|
||||
maxy3=0
|
||||
posx3=50
|
||||
posy3=50
|
||||
sizx3=800
|
||||
sizy3=600
|
||||
maxfps3=0
|
||||
initts3=0
|
||||
winver3=0
|
||||
maxres3=-1
|
||||
swapeffect3=0
|
||||
title4=Imperialism
|
||||
path4=D:\Games\Imperialism\Imperialism.exe
|
||||
launchpath4=
|
||||
module4=
|
||||
opengllib4=
|
||||
notes4=Note:\nMap zooming is currently not workind. Do not click on the magnifying glass, \nor the game will crash.
|
||||
registry4=
|
||||
ver4=0
|
||||
coord4=0
|
||||
flag4=1746935843
|
||||
flagg4=1209008128
|
||||
flagh4=20
|
||||
flagi4=4194308
|
||||
flagj4=128
|
||||
flagk4=0
|
||||
tflag4=0
|
||||
initx4=0
|
||||
inity4=0
|
||||
minx4=0
|
||||
miny4=0
|
||||
maxx4=0
|
||||
maxy4=0
|
||||
posx4=50
|
||||
posy4=50
|
||||
sizx4=800
|
||||
sizy4=600
|
||||
maxfps4=0
|
||||
initts4=0
|
||||
winver4=0
|
||||
maxres4=-1
|
||||
swapeffect4=0
|
||||
|
32
build/exports/Arx Fatalis.dxw
Normal file
32
build/exports/Arx Fatalis.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=Arx Fatalis
|
||||
path0=D:\Games\Arx Fatalis\arx.exe
|
||||
launchpath0=
|
||||
module0=Athena
|
||||
opengllib0=
|
||||
notes0=
|
||||
registry0=
|
||||
ver0=0
|
||||
coord0=0
|
||||
flag0=136314918
|
||||
flagg0=1207959552
|
||||
flagh0=65552
|
||||
flagi0=138412036
|
||||
flagj0=4224
|
||||
flagk0=65536
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=0
|
||||
maxy0=0
|
||||
posx0=150
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
32
build/exports/TieFighter 95.dxw
Normal file
32
build/exports/TieFighter 95.dxw
Normal file
@ -0,0 +1,32 @@
|
||||
[target]
|
||||
title0=TieFighter 95
|
||||
path0=D:\Games\TIE95\TIE95.EXE
|
||||
launchpath0=
|
||||
module0=
|
||||
opengllib0=
|
||||
notes0=The game can be played also with no joystick using the DxWnd virtual one.\nIf you have a real joystick, the "Use DLL injection" flag is not necessary.\nUse "Unlock Z order" to avoid losing control of the window.
|
||||
registry0=
|
||||
ver0=1
|
||||
coord0=0
|
||||
flag0=681574514
|
||||
flagg0=1744830464
|
||||
flagh0=20
|
||||
flagi0=138412036
|
||||
flagj0=1073746048
|
||||
flagk0=136642560
|
||||
tflag0=0
|
||||
initx0=0
|
||||
inity0=0
|
||||
minx0=0
|
||||
miny0=0
|
||||
maxx0=800
|
||||
maxy0=600
|
||||
posx0=50
|
||||
posy0=50
|
||||
sizx0=800
|
||||
sizy0=600
|
||||
maxfps0=0
|
||||
initts0=0
|
||||
winver0=0
|
||||
maxres0=-1
|
||||
swapeffect0=0
|
@ -939,3 +939,16 @@ add: added debug flag NOWINDOWHOOKS to avoid WindowProc hook.
|
||||
fix: GetPaletteEntries hook returns 256 value against hpal=NULL. Let "M.I.B." run, though palette is still not ok.
|
||||
fix: StretchDIBits hook no longer can return an unassigned value
|
||||
fix: anti-recursion check in DialogBox WindowProc call
|
||||
|
||||
v2.03.42
|
||||
add: option "Syncronize GDI and DDRAW palette" - fixes "Man in Black" palette problems
|
||||
add: apply "Remap MCI coordinates" options also to movies rendered through MCIWndCreate: fixes "Man in Black" movie problems
|
||||
fix: fixed InvalidateRect hooker logic - fixes "Imperialism" graphic.
|
||||
|
||||
v2.03.43
|
||||
fix: eliminated SYSTEMMEMORY usage on DDSCAPS_3DDEVICE surfaces. Needed for "Arx Fatalis"
|
||||
fix: deleted emulation of ZBUFFER attach. Needed for "Arx Fatalis"
|
||||
fix: added emulation of PixelFormat in getPixelFormat hooker. Needed for "Arx Fatalis"
|
||||
add: added virtual joystick feature. Required to play "Tie Fighter 95" with no real joystick
|
||||
v2.03.43.fix1
|
||||
fix: recovered virtual joystick buttons
|
BIN
dll/cross.bmp
Normal file
BIN
dll/cross.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
@ -17,6 +17,8 @@
|
||||
#include "dxhelper.h"
|
||||
#include "syslibs.h"
|
||||
|
||||
#define EMULATEZBUFFERATTACH FALSE
|
||||
|
||||
extern BOOL IsChangeDisplaySettingsHotPatched;
|
||||
DWORD dwBackBufferCaps;
|
||||
extern void TextureHandling(LPDIRECTDRAWSURFACE);
|
||||
@ -2177,7 +2179,7 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion)
|
||||
}
|
||||
|
||||
if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER);
|
||||
lpddsd->ddsCaps.dwCaps = DDSCAPS_ZBUFFER;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2185,7 +2187,7 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion)
|
||||
(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) // v2.02.90: added for "Zoo Tycoon" textures
|
||||
{ // 3DDEVICE no TEXTURE: enforce PIXELFORMAT on MEMORY
|
||||
lpddsd->dwFlags |= DDSD_PIXELFORMAT;
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE);
|
||||
lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE);
|
||||
GetPixFmt(lpddsd);
|
||||
return;
|
||||
}
|
||||
@ -2703,7 +2705,6 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
|
||||
// For "Risk II" it is necessary that both the primary surface and the offscreen surfaces are generated
|
||||
// with the same type, so that assuming an identical lPitch and memcopy-ing from one buffer to the
|
||||
// other is a legitimate operation.
|
||||
if(ddsd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // v2.03.03 !!
|
||||
|
||||
if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode
|
||||
if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) &&
|
||||
@ -3103,10 +3104,14 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
|
||||
}
|
||||
}
|
||||
// arguable utility ....
|
||||
if ((IsPrim || IsBack) && lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){
|
||||
*lplpddas = lpDDZBuffer;
|
||||
OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds);
|
||||
return DD_OK;
|
||||
// commented out: causes "Arx Fatalis" crash assigning ZBUFFER to the wrong surface?
|
||||
// would that be necessary on some game?
|
||||
if(EMULATEZBUFFERATTACH){
|
||||
if ((IsPrim || IsBack) && lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){
|
||||
*lplpddas = lpDDZBuffer;
|
||||
OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds);
|
||||
return DD_OK;
|
||||
}
|
||||
}
|
||||
OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__);
|
||||
}
|
||||
@ -4487,7 +4492,9 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p)
|
||||
p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask );
|
||||
}
|
||||
|
||||
if ((dxw.dwFlags1 & EMULATESURFACE) && IsPrim){
|
||||
// fix: virtual pixel definition is helpful not only on promary surfaces, but more in general
|
||||
// on every surface that returns an error. It fixes "Arx Fatalis" crash.
|
||||
if ((dxw.dwFlags1 & EMULATESURFACE) && res){
|
||||
p->dwFlags = dxw.VirtualPixelFormat.dwFlags;
|
||||
p->dwRGBBitCount= dxw.VirtualPixelFormat.dwRGBBitCount;
|
||||
p->dwRBitMask = dxw.VirtualPixelFormat.dwRBitMask;
|
||||
@ -4496,6 +4503,7 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p)
|
||||
p->dwRGBAlphaBitMask = dxw.VirtualPixelFormat.dwRGBAlphaBitMask;
|
||||
OutTraceDW("GetPixelFormat: EMULATED BitCount=%d RGBA=(%x,%x,%x,%x)\n",
|
||||
p->dwRGBBitCount, p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask );
|
||||
res = DD_OK;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
@ -45,7 +45,7 @@ void HookDirectSoundInit()
|
||||
HookLibInit(Hooks);
|
||||
}
|
||||
|
||||
void HookDirectSound(LPDIRECTSOUND *lpds)
|
||||
void HookDirectSoundObj(LPDIRECTSOUND *lpds)
|
||||
{
|
||||
// IDIrectSound::SetCooperativeLevel
|
||||
SetHook((void *)(**(DWORD **)lpds + 24), extDSSetCooperativeLevel, (void **)&pDSSetCooperativeLevel, "SetCooperativeLevel(DSound)");
|
||||
@ -62,9 +62,10 @@ HRESULT WINAPI extDirectSoundCreate(LPGUID guid, LPDIRECTSOUND *lpds, LPUNKNOWN
|
||||
return res;
|
||||
}
|
||||
|
||||
HookDirectSound(lpds);
|
||||
HookDirectSoundObj(lpds);
|
||||
return res;
|
||||
}
|
||||
|
||||
#define DSSCL_NORMAL 0x00000001
|
||||
#define DSSCL_PRIORITY 0x00000002
|
||||
#define DSSCL_EXCLUSIVE 0x00000003
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "MinHook.h"
|
||||
|
||||
#define SKIPIMEWINDOW TRUE
|
||||
#define HOOKDIRECTSOUND FALSE
|
||||
|
||||
dxwCore dxw;
|
||||
dxwSStack dxwss;
|
||||
@ -863,7 +864,7 @@ void HookModule(HMODULE base, int dxversion)
|
||||
HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for?
|
||||
HookAVIFil32(base);
|
||||
//HookSmackW32(base);
|
||||
//HookDirectSound(base);
|
||||
//if (HOOKDIRECTSOUND) HookDirectSound(base);
|
||||
//HookComDlg32(base);
|
||||
}
|
||||
|
||||
|
BIN
dll/dxwnd.aps
BIN
dll/dxwnd.aps
Binary file not shown.
@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "TlHelp32.h"
|
||||
|
||||
#define VERSION "2.03.42"
|
||||
#define VERSION "2.03.43.fix1"
|
||||
|
||||
#define DDTHREADLOCK 1
|
||||
//#define LOCKTHREADS
|
||||
|
@ -53,6 +53,10 @@ END
|
||||
//
|
||||
|
||||
IDB_BANNER BITMAP "dxwbanner.bmp"
|
||||
IDB_CROSS BITMAP "cross.bmp"
|
||||
IDB_FIRE1 BITMAP "fire1.bmp"
|
||||
IDB_FIRE2 BITMAP "fire2.bmp"
|
||||
IDB_FIRE3 BITMAP "fire3.bmp"
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
Binary file not shown.
@ -539,10 +539,38 @@
|
||||
Name="Resource Files"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\bitmap1.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\bitmap2.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\bmp00001.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\bmp00002.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\cross.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\dxwbanner.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\fire1.bmp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\fire2.bmp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
BIN
dll/fire1.bmp
Normal file
BIN
dll/fire1.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
BIN
dll/fire2.bmp
Normal file
BIN
dll/fire2.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
BIN
dll/fire3.bmp
Normal file
BIN
dll/fire3.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
@ -3,12 +3,17 @@
|
||||
// Used by dxwnd.rc
|
||||
//
|
||||
#define IDB_BANNER 101
|
||||
#define IDB_CROSS 102
|
||||
#define IDB_FIRE1 103
|
||||
#define IDB_FIRE2 104
|
||||
#define IDB_BITMAP2 105
|
||||
#define IDB_FIRE3 105
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_RESOURCE_VALUE 106
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
|
198
dll/winmm.cpp
198
dll/winmm.cpp
@ -6,11 +6,14 @@
|
||||
#include "syslibs.h"
|
||||
#include "dxhook.h"
|
||||
#include "dxhelper.h"
|
||||
#include "resource.h"
|
||||
|
||||
#include "MMSystem.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#define SUPPRESSMCIERRORS FALSE
|
||||
#define EMULATEJOY TRUE
|
||||
#define INVERTJOYAXIS TRUE
|
||||
|
||||
BOOL IsWithinMCICall = FALSE;
|
||||
|
||||
@ -20,10 +23,19 @@ MCIDEVICEID WINAPI extmciGetDeviceIDA(LPCTSTR);
|
||||
typedef MCIDEVICEID (WINAPI *mciGetDeviceIDW_Type)(LPCWSTR);
|
||||
mciGetDeviceIDW_Type pmciGetDeviceIDW = NULL;
|
||||
MCIDEVICEID WINAPI extmciGetDeviceIDW(LPCWSTR);
|
||||
typedef DWORD (WINAPI *joyGetNumDevs_Type)(void);
|
||||
joyGetNumDevs_Type pjoyGetNumDevs = NULL;
|
||||
DWORD WINAPI extjoyGetNumDevs(void);
|
||||
typedef MMRESULT (WINAPI *joyGetDevCapsA_Type)(DWORD, LPJOYCAPS, UINT);
|
||||
joyGetDevCapsA_Type pjoyGetDevCapsA = NULL;
|
||||
MMRESULT WINAPI extjoyGetDevCapsA(DWORD, LPJOYCAPS, UINT);
|
||||
typedef MMRESULT (WINAPI *joyGetPosEx_Type)(DWORD, LPJOYINFOEX);
|
||||
joyGetPosEx_Type pjoyGetPosEx = NULL;
|
||||
MMRESULT WINAPI extjoyGetPosEx(DWORD, LPJOYINFOEX);
|
||||
|
||||
static HookEntry_Type Hooks[]={
|
||||
{HOOK_HOT_CANDIDATE, "mciSendCommandA", NULL, (FARPROC *)&pmciSendCommandA, (FARPROC)extmciSendCommandA},
|
||||
{HOOK_HOT_CANDIDATE, "mciSendCommandW", NULL, (FARPROC *)&pmciSendCommandW, (FARPROC)extmciSendCommandW},
|
||||
{HOOK_IAT_CANDIDATE, "mciSendCommandA", NULL, (FARPROC *)&pmciSendCommandA, (FARPROC)extmciSendCommandA},
|
||||
{HOOK_IAT_CANDIDATE, "mciSendCommandW", NULL, (FARPROC *)&pmciSendCommandW, (FARPROC)extmciSendCommandW},
|
||||
{HOOK_HOT_CANDIDATE, "mciGetDeviceIDA", NULL, (FARPROC *)&pmciGetDeviceIDA, (FARPROC)extmciGetDeviceIDA},
|
||||
{HOOK_HOT_CANDIDATE, "mciGetDeviceIDW", NULL, (FARPROC *)&pmciGetDeviceIDW, (FARPROC)extmciGetDeviceIDW},
|
||||
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
|
||||
@ -42,11 +54,19 @@ static HookEntry_Type RemapHooks[]={
|
||||
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
|
||||
};
|
||||
|
||||
static HookEntry_Type JoyHooks[]={
|
||||
{HOOK_IAT_CANDIDATE, "joyGetNumDevs", NULL, (FARPROC *)&pjoyGetNumDevs, (FARPROC)extjoyGetNumDevs},
|
||||
{HOOK_IAT_CANDIDATE, "joyGetDevCapsA", NULL, (FARPROC *)&pjoyGetDevCapsA, (FARPROC)extjoyGetDevCapsA},
|
||||
{HOOK_IAT_CANDIDATE, "joyGetPosEx", NULL, (FARPROC *)&pjoyGetPosEx, (FARPROC)extjoyGetPosEx},
|
||||
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
|
||||
};
|
||||
|
||||
void HookWinMM(HMODULE module)
|
||||
{
|
||||
HookLibrary(module, Hooks, "winmm.dll");
|
||||
if(dxw.dwFlags2 & TIMESTRETCH) HookLibrary(module, TimeHooks, "winmm.dll");
|
||||
if(dxw.dwFlags5 & REMAPMCI) HookLibrary(module, RemapHooks, "winmm.dll");
|
||||
if(dxw.dwFlags6 & VIRTUALJOYSTICK) HookLibrary(module, JoyHooks, "winmm.dll");
|
||||
}
|
||||
|
||||
FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule)
|
||||
@ -58,6 +78,8 @@ FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule)
|
||||
if (addr=RemapLibrary(proc, hModule, TimeHooks)) return addr;
|
||||
if(dxw.dwFlags5 & REMAPMCI)
|
||||
if (addr=RemapLibrary(proc, hModule, RemapHooks)) return addr;
|
||||
if(dxw.dwFlags6 & VIRTUALJOYSTICK)
|
||||
if (addr=RemapLibrary(proc, hModule, JoyHooks)) return addr;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -115,7 +137,22 @@ MCIERROR WINAPI extmciSendCommand(mciSendCommand_Type pmciSendCommand, MCIDEVICE
|
||||
OutTraceDW("mciSendCommand: IDDevice=%x msg=%x(%s) Command=%x(%s)\n",
|
||||
IDDevice, uMsg, ExplainMCICommands(uMsg), fdwCommand, ExplainMCIFlags(uMsg, fdwCommand));
|
||||
|
||||
if(dxw.dwFlags6 && BYPASSMCI) return 0;
|
||||
if(dxw.dwFlags6 & BYPASSMCI){
|
||||
if((uMsg == MCI_STATUS) && (fdwCommand == MCI_STATUS_ITEM)){
|
||||
// fix for Tie Fighter 95: when bypassing, let the caller know you have no CD tracks
|
||||
// otherwise you risk an almost endless loop going through the unassigned returned
|
||||
// number of ghost tracks
|
||||
MCI_STATUS_PARMS *p = (MCI_STATUS_PARMS *)dwParam;
|
||||
p->dwItem = 0;
|
||||
p->dwTrack = 0;
|
||||
p->dwReturn = 0;
|
||||
OutTraceDW("mciSendCommand: BYPASS fixing MCI_STATUS\n");
|
||||
}
|
||||
else{
|
||||
OutTraceDW("mciSendCommand: BYPASS\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(dxw.IsFullScreen()){
|
||||
switch(uMsg){
|
||||
@ -157,6 +194,15 @@ MCIERROR WINAPI extmciSendCommand(mciSendCommand_Type pmciSendCommand, MCIDEVICE
|
||||
|
||||
ret=(*pmciSendCommand)(IDDevice, uMsg, fdwCommand, dwParam);
|
||||
|
||||
if(ret == 0){
|
||||
switch(uMsg){
|
||||
case MCI_STATUS:
|
||||
MCI_STATUS_PARMS *p = (MCI_STATUS_PARMS *)dwParam;
|
||||
OutTrace("mciSendCommand: Item=%d Track=%d return=%x\n", p->dwItem, p->dwTrack, p->dwReturn);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(dxw.IsFullScreen() && uMsg==MCI_PUT) pr->rc=saverect;
|
||||
if (ret) OutTraceE("mciSendCommand: ERROR res=%d\n", ret);
|
||||
return ret;
|
||||
@ -245,4 +291,148 @@ MCIDEVICEID WINAPI extmciGetDeviceIDW(LPCWSTR lpszDevice)
|
||||
ret = (*pmciGetDeviceIDW)(lpszDevice);
|
||||
OutTraceDW("mciGetDeviceIDW: device=\"%ls\" ret=%x\n", lpszDevice, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD WINAPI extjoyGetNumDevs(void)
|
||||
{
|
||||
OutTraceDW("joyGetNumDevs: emulate joystick ret=1\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define XSPAN 128
|
||||
#define YSPAN 128
|
||||
static void ShowJoystick(LONG, LONG, DWORD);
|
||||
|
||||
MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc)
|
||||
{
|
||||
OutTraceDW("joyGetDevCaps: joyid=%d size=%d\n", uJoyID, cbjc);
|
||||
if((uJoyID != -1) && (uJoyID != 0)) return MMSYSERR_NODRIVER;
|
||||
if(cbjc != sizeof(JOYCAPS)) return MMSYSERR_INVALPARAM;
|
||||
uJoyID = 0; // always first (unique) one ...
|
||||
|
||||
// set Joystick capability structure
|
||||
memset(pjc, 0, sizeof(JOYCAPS));
|
||||
strncpy(pjc->szPname, "DxWnd Joystick Emulator", MAXPNAMELEN);
|
||||
pjc->wXmin = 0;
|
||||
pjc->wXmax = XSPAN;
|
||||
pjc->wYmin = 0;
|
||||
pjc->wYmax = YSPAN;
|
||||
pjc->wNumButtons = 2;
|
||||
pjc->wMaxButtons = 2;
|
||||
pjc->wPeriodMin = 60;
|
||||
pjc->wPeriodMax = 600;
|
||||
pjc->wCaps = 0;
|
||||
pjc->wMaxAxes = 2;
|
||||
pjc->wNumAxes = 2;
|
||||
|
||||
return JOYERR_NOERROR;
|
||||
}
|
||||
|
||||
MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji)
|
||||
{
|
||||
OutTraceDW("joyGetPosEx: joyid=%d\n", uJoyID);
|
||||
if(uJoyID != 0) return JOYERR_PARMS;
|
||||
LONG x, y;
|
||||
HWND hwnd;
|
||||
DWORD dwButtons;
|
||||
|
||||
dwButtons = 0;
|
||||
if (GetKeyState(VK_LBUTTON) < 0) dwButtons |= JOY_BUTTON1;
|
||||
if (GetKeyState(VK_RBUTTON) < 0) dwButtons |= JOY_BUTTON2;
|
||||
POINT pt;
|
||||
if(hwnd=dxw.GethWnd()){
|
||||
RECT client;
|
||||
POINT upleft = {0,0};
|
||||
(*pGetClientRect)(hwnd, &client);
|
||||
(*pClientToScreen)(hwnd, &upleft);
|
||||
(*pGetCursorPos)(&pt);
|
||||
pt.x -= upleft.x;
|
||||
pt.y -= upleft.y;
|
||||
if(pt.x < client.left) pt.x = client.left;
|
||||
if(pt.x > client.right) pt.x = client.right;
|
||||
if(pt.y < client.top) pt.y = client.top;
|
||||
if(pt.y > client.bottom) pt.y = client.bottom;
|
||||
x = (pt.x * XSPAN) / client.right;
|
||||
if(INVERTJOYAXIS)
|
||||
y = ((client.bottom - pt.y) * YSPAN) / client.bottom; // inverted y axis
|
||||
else
|
||||
pt.y = (pt.y * YSPAN) / dxw.GetScreenHeight();
|
||||
ShowJoystick(pt.x, pt.y, dwButtons);
|
||||
}
|
||||
else {
|
||||
x=(XSPAN>>1);
|
||||
y=(YSPAN>>1);
|
||||
}
|
||||
|
||||
// set Joystick info structure
|
||||
memset(pji, 0, sizeof(JOYINFOEX));
|
||||
pji->dwSize = sizeof(JOYINFOEX);
|
||||
pji->dwFlags = 0;
|
||||
pji->dwXpos = x;
|
||||
pji->dwYpos = y;
|
||||
pji->dwButtons = dwButtons;
|
||||
pji->dwFlags = JOY_RETURNX|JOY_RETURNY|JOY_RETURNBUTTONS;
|
||||
|
||||
OutTraceDW("joyGetPosEx: joyid=%d pos=(%d,%d)\n", uJoyID, pji->dwXpos, pji->dwYpos);
|
||||
return JOYERR_NOERROR;
|
||||
}
|
||||
|
||||
static void ShowJoystick(LONG x, LONG y, DWORD dwButtons)
|
||||
{
|
||||
static BOOL JustOnce=FALSE;
|
||||
extern HMODULE hInst;
|
||||
BITMAP bm;
|
||||
HDC hClientDC;
|
||||
static HBITMAP g_hbmJoyCross;
|
||||
static HBITMAP g_hbmJoyFire1;
|
||||
static HBITMAP g_hbmJoyFire2;
|
||||
static HBITMAP g_hbmJoyFire3;
|
||||
HBITMAP g_hbmJoy;
|
||||
RECT client;
|
||||
RECT win;
|
||||
POINT PrevViewPort;
|
||||
int StretchMode;
|
||||
|
||||
// don't show when system cursor is visible
|
||||
CURSORINFO ci;
|
||||
ci.cbSize = sizeof(CURSORINFO);
|
||||
GetCursorInfo(&ci);
|
||||
if(ci.flags == CURSOR_SHOWING) return;
|
||||
|
||||
hClientDC=(*pGDIGetDC)(dxw.GethWnd());
|
||||
(*pGetClientRect)(dxw.GethWnd(), &client);
|
||||
|
||||
if(!JustOnce){
|
||||
g_hbmJoyCross = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CROSS));
|
||||
g_hbmJoyFire1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE1));
|
||||
g_hbmJoyFire2 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE2));
|
||||
g_hbmJoyFire3 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE3));
|
||||
JustOnce=TRUE;
|
||||
}
|
||||
|
||||
HDC hdcMem = CreateCompatibleDC(hClientDC);
|
||||
switch(dwButtons){
|
||||
case 0: g_hbmJoy = g_hbmJoyCross; break;
|
||||
case JOY_BUTTON1: g_hbmJoy = g_hbmJoyFire1; break;
|
||||
case JOY_BUTTON2: g_hbmJoy = g_hbmJoyFire2; break;
|
||||
default: g_hbmJoy = g_hbmJoyFire3; break;
|
||||
}
|
||||
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmJoy);
|
||||
GetObject(g_hbmJoy, sizeof(bm), &bm);
|
||||
|
||||
(*pGetWindowRect)(dxw.GethWnd(), &win);
|
||||
|
||||
//if(!pSetViewportOrgEx) pSetViewportOrgEx=SetViewportOrgEx;
|
||||
(*pSetViewportOrgEx)(hClientDC, 0, 0, &PrevViewPort);
|
||||
StretchMode=GetStretchBltMode(hClientDC);
|
||||
SetStretchBltMode(hClientDC, HALFTONE);
|
||||
int w, h;
|
||||
w=36;
|
||||
h=36;
|
||||
(*pGDIStretchBlt)(hClientDC, x-(w>>1), y-(h>>1), w, h, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
|
||||
|
||||
SetStretchBltMode(hClientDC, StretchMode);
|
||||
(*pSetViewportOrgEx)(hClientDC, PrevViewPort.x, PrevViewPort.y, NULL);
|
||||
SelectObject(hdcMem, hbmOld);
|
||||
DeleteDC(hdcMem);
|
||||
}
|
||||
|
@ -40,6 +40,7 @@ void CTabInput::DoDataExchange(CDataExchange* pDX)
|
||||
DDX_Check(pDX, IDC_FIXNCHITTEST, cTarget->m_FixNCHITTEST);
|
||||
DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown);
|
||||
DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse);
|
||||
DDX_Check(pDX, IDC_VIRTUALJOYSTICK, cTarget->m_VirtualJoystick);
|
||||
//DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation);
|
||||
// DirectInput
|
||||
DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI);
|
||||
|
@ -29,6 +29,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
|
||||
m_TextureHandling = 0;
|
||||
m_HookDI = FALSE;
|
||||
m_ModifyMouse = TRUE; // default true !!
|
||||
m_VirtualJoystick = FALSE;
|
||||
m_LogEnabled = FALSE;
|
||||
m_OutProxyTrace = FALSE;
|
||||
m_OutDebug = FALSE;
|
||||
|
@ -34,6 +34,7 @@ public:
|
||||
int m_SonProcessMode;
|
||||
BOOL m_HookDI;
|
||||
BOOL m_ModifyMouse;
|
||||
BOOL m_VirtualJoystick;
|
||||
BOOL m_OutProxyTrace;
|
||||
BOOL m_OutDebug;
|
||||
BOOL m_CursorTrace;
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -248,6 +248,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
|
||||
|
||||
if(dlg->m_HookDI) t->flags |= HOOKDI;
|
||||
if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE;
|
||||
if(dlg->m_VirtualJoystick) t->flags6 |= VIRTUALJOYSTICK;
|
||||
if(dlg->m_OutProxyTrace) t->tflags |= OUTPROXYTRACE;
|
||||
if(dlg->m_OutDebug) t->tflags |= OUTDEBUG;
|
||||
if(dlg->m_CursorTrace) t->tflags |= OUTCURSORTRACE;
|
||||
@ -488,6 +489,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
|
||||
|
||||
dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0;
|
||||
dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0;
|
||||
dlg->m_VirtualJoystick = t->flags6 & VIRTUALJOYSTICK ? 1 : 0;
|
||||
dlg->m_OutProxyTrace = t->tflags & OUTPROXYTRACE ? 1 : 0;
|
||||
dlg->m_OutDebug = t->tflags & OUTDEBUG ? 1 : 0;
|
||||
dlg->m_CursorTrace = t->tflags & OUTCURSORTRACE ? 1 : 0;
|
||||
|
BIN
host/host.aps
BIN
host/host.aps
Binary file not shown.
BIN
host/resource
BIN
host/resource
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user