aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <emulator@emulace.cz>2025-03-19 15:14:55 +0100
committerJaroslav Hensl <emulator@emulace.cz>2025-03-19 15:14:55 +0100
commit9f18830a51a54b4068538a216fcbc8f3a782127e (patch)
treedd3012edeeb8ce1c08fc7f7abb797c31233fc6c0
parent0ab2cc0e698e41ffc30350f4c7e2a980f57192f0 (diff)
downloadvmdisp9x-9f18830a51a54b4068538a216fcbc8f3a782127e.tar.gz
wine: dynamic patching instead of DLL replace
-rw-r--r--3d_accel.h7
-rw-r--r--vmdisp9x.inf36
-rw-r--r--vxd_lib.c5
-rw-r--r--vxd_lib.h1
-rw-r--r--vxd_main.c20
5 files changed, 39 insertions, 30 deletions
diff --git a/3d_accel.h b/3d_accel.h
index 5e7298a..5cfc7ca 100644
--- a/3d_accel.h
+++ b/3d_accel.h
@@ -33,7 +33,7 @@ THE SOFTWARE.
#endif
#endif
-#define API_3DACCEL_VER 20240808
+#define API_3DACCEL_VER 20250316
#define ESCAPE_DRV_NT 0x1103 /* (4355) */
@@ -53,6 +53,8 @@ THE SOFTWARE.
#define OP_FBHDA_GAMMA_SET 0x1116 /* VXD, DRV, ESCAPE_DRV_NT */
#define OP_FBHDA_GAMMA_GET 0x1117 /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_PAGE_MOD 0x1118 /* VXD */
+
#define OP_SVGA_VALID 0x2000 /* VXD, DRV, ESCAPE_DRV_NT */
#define OP_SVGA_SETMODE 0x2001 /* DRV */
#define OP_SVGA_VALIDMODE 0x2002 /* DRV */
@@ -214,6 +216,9 @@ void mouse_erase();
#define MOUSE_BUFFER_SIZE 65535
+/* helper for some hacks */
+BOOL FBHDA_page_modify(DWORD flat_address, DWORD size, BYTE *new_data);
+
/*
* VMWare SVGA-II API
*/
diff --git a/vmdisp9x.inf b/vmdisp9x.inf
index 2aee926..1550597 100644
--- a/vmdisp9x.inf
+++ b/vmdisp9x.inf
@@ -19,7 +19,6 @@ VBox.Copy=11
VMSvga.Copy=11
DX.Copy=11
Voodoo.Copy=11
-DX.CopyBackup=10,SYSBCKUP
[SourceDisksNames]
; BOXV9X is the driver disk volume label
@@ -42,20 +41,12 @@ qxlmini.vxd=1
;wined3d:winedd.dll=1
;wined3d:wined8.dll=1
;wined3d:wined9.dll=1
-;wined3d:ddraw.dll=1
-;wined3d:ddrawme.dll=1
-;wined3d:d3d8.dll=1
-;wined3d:d3d9.dll=1
-;wined3d:ddr95.dll=1,dx
-;wined3d:ddr98.dll=1,dx
+;wined3d:winetray.exe=1
;3dfx:3dfxSpl2.dll=1,3dfx
;3dfx:3dfxSpl3.dll=1,3dfx
;3dfx:3dfxVGL.dll=1,3dfx
;nine:mesa89.dll=1
;nine:mesa99.dll=1
-;syscopy:ddsys.dll=1,sys
-;syscopy:msd3d8.dll=1,sys
-;syscopy:msd3d9.dll=1,sys
;vmhal:vmhal9x.dll=1
;vmhal:vmdisp9x.dll=1
@@ -71,27 +62,27 @@ qxlmini.vxd=1
;qxl;%QemuQXL.DeviceDesc%=QXL, PCI\VEN_1B36&DEV_0100
[VBox]
-CopyFiles=VBox.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
+CopyFiles=VBox.Copy,Dx.Copy,Voodoo.Copy
DelReg=VM.DelReg
AddReg=VBox.AddReg,VM.AddReg,DX.addReg,VM.regextra
[Qemu]
-CopyFiles=Qemu.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
+CopyFiles=Qemu.Copy,Dx.Copy,Voodoo.Copy
DelReg=VM.DelReg
AddReg=Qemu.AddReg,VM.AddReg,DX.addReg,VM.regextra
[QXL]
-CopyFiles=QXL.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
+CopyFiles=QXL.Copy,Dx.Copy,Voodoo.Copy
DelReg=VM.DelReg
AddReg=QXL.AddReg,VM.AddReg,DX.addReg,VM.regextra
[VBoxSvga]
-CopyFiles=VMSvga.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
+CopyFiles=VMSvga.Copy,Dx.Copy,Voodoo.Copy
DelReg=VM.DelReg
AddReg=VMSvga.AddReg,VM.AddReg,DX.addReg,VM.regextra
[VMSvga]
-CopyFiles=VMSvga.Copy,Dx.Copy,DX.CopyBackup,Voodoo.Copy
+CopyFiles=VMSvga.Copy,Dx.Copy,Voodoo.Copy
DelReg=VM.DelReg
AddReg=VMSvga.AddReg,VM.AddReg,DX.addReg,VM.regextra
@@ -136,22 +127,9 @@ vmwsmini.vxd,,,0x00000004
;wined3d:winedd.dll,,,0x00000004
;wined3d:wined8.dll,,,0x00000004
;wined3d:wined9.dll,,,0x00000004
-;wined3d:ddraw.dll,,,0x00000004
-;wined3d:ddrawme.dll,,,0x00000004
-;wined3d:d3d8.dll,,,0x00000004
-;wined3d:d3d9.dll,,,0x00000004
-;wined3d:ddr95.dll,,,0x00000004
-;wined3d:ddr98.dll,,,0x00000004
+;wined3d:winetray.exe,,,0x00000004
;nine:mesa89.dll,,,0x00000004
;nine:mesa99.dll,,,0x00000004
-;syscopy:ddsys.dll,,,0x00000004
-;syscopy:msd3d8.dll,,,0x00000004
-;syscopy:msd3d9.dll,,,0x00000004
-
-[DX.CopyBackup]
-;wined3d:ddraw.dll,,,0x00000004
-;wined3d:d3d8.dll,,,0x00000004
-;wined3d:d3d9.dll,,,0x00000004
[Qemu.AddReg]
HKR,DEFAULT,drv,,qemumini.drv
diff --git a/vxd_lib.c b/vxd_lib.c
index dfbe552..e5130c6 100644
--- a/vxd_lib.c
+++ b/vxd_lib.c
@@ -484,6 +484,11 @@ DWORD __declspec(naked) __cdecl _RegQueryValueEx(DWORD hKey, char *lpszValueName
VMMJmp(_RegQueryValueEx);
}
+DWORD __declspec(naked) __cdecl _PageModifyPermissions(ULONG page, ULONG npages, ULONG permand, ULONG permor)
+{
+ VMMJmp(_PageModifyPermissions);
+}
+
void Enable_Global_Trapping(DWORD port)
{
_asm push edx
diff --git a/vxd_lib.h b/vxd_lib.h
index 363dada..6e8ecef 100644
--- a/vxd_lib.h
+++ b/vxd_lib.h
@@ -44,6 +44,7 @@ ULONG __cdecl _PhysIntoV86(ULONG PhysPage, ULONG VM, ULONG VMLinPgNum, ULONG nPa
DWORD __cdecl _RegOpenKey(DWORD hKey, char *lpszSubKey, DWORD *lphKey);
DWORD __cdecl _RegCloseKey(DWORD hKey);
DWORD __cdecl _RegQueryValueEx(DWORD hKey, char *lpszValueName, DWORD *lpdwReserved, DWORD *lpdwType, BYTE *lpbData, DWORD *lpcbData);
+DWORD __cdecl _PageModifyPermissions(ULONG page, ULONG npages, ULONG permand, ULONG permor);
volatile void __cdecl Begin_Critical_Section(ULONG Flags);
volatile void __cdecl End_Critical_Section();
ULONG __cdecl Create_Semaphore(ULONG TokenCount);
diff --git a/vxd_main.c b/vxd_main.c
index dc06fed..567214e 100644
--- a/vxd_main.c
+++ b/vxd_main.c
@@ -580,6 +580,22 @@ void Device_Init_proc(DWORD VM)
static DWORD io_open_cnt = 0;
+BOOL FBHDA_page_modify(DWORD flat_address, DWORD size, BYTE *new_data)
+{
+ DWORD page = _PAGE(flat_address);
+ DWORD pages = 1;
+ if(_PAGE(flat_address+size) != page)
+ {
+ pages++;
+ }
+
+ _PageModifyPermissions(page, pages, PC_USER | PC_WRITEABLE, PC_WRITEABLE);
+
+ memcpy((void*)flat_address, new_data, size);
+
+ return TRUE;
+}
+
/* process user space (PM32, RING-3) call */
DWORD __stdcall Device_IO_Control_proc(DWORD vmhandle, struct DIOCParams *params)
{
@@ -753,6 +769,10 @@ DWORD __stdcall Device_IO_Control_proc(DWORD vmhandle, struct DIOCParams *params
break;
#endif /*DBGPRINT */
#endif /* SVGA */
+ case OP_FBHDA_PAGE_MOD:
+ FBHDA_page_modify(inBuf[0], inBuf[1], (BYTE *)&inBuf[2]);
+ rc = 0;
+ break;
default:
dbg_printf("DeviceIOControl: Unknown: %d\n", params->dwIoControlCode);
break;