diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 38fd1768..a56eca6c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,12 +13,18 @@ jobs:
       fail-fast: false
       matrix:
         toolchain:
-        - { name: 'MSVC',           shell: 'sh',        setup-cmake: true, setup-ninja: true, setup-msvc: true }
-        # TODO: Add back eventually, but exclude 3rdparty code from warnings as errors
-        - { name: 'msys2 mingw32',  shell: 'msys2 {0}', msystem: mingw32, msys-env: mingw-w64-i686,        clang-tidy: true, werror: true, no-dx5-libs: true }
-        # - { name: 'msys2 clang32',  shell: 'msys2 {0}', msystem: clang32, msys-env: mingw-w64-clang-i686,  clang-tidy: true, werror: true, no-dx5-libs: true }
+        - { name: 'MSVC (32-bit)',  shell: 'sh',  setup-cmake: true, setup-ninja: true, setup-msvc: true, vc-arch: 'amd64_x86', dx5-libs: true,   d3drm-from-wine: false }
+        - { name: 'MSVC (64-bit)',  shell: 'sh',  setup-cmake: true, setup-ninja: true, setup-msvc: true, vc-arch: 'amd64',     dx5-libs: false,  d3drm-from-wine: true }
+        - { name: 'msys2 mingw32',  shell: 'msys2 {0}', msystem: mingw32, msys-env: mingw-w64-i686,        clang-tidy: true, werror: true, dx5-libs: false, d3drm-from-wine: true }
+        - { name: 'msys2 mingw64',  shell: 'msys2 {0}', msystem: mingw64, msys-env: mingw-w64-x86_64,      clang-tidy: true, werror: true, dx5-libs: false, d3drm-from-wine: true }
+        # - { name: 'msys2 clang32',  shell: 'msys2 {0}', msystem: clang32, msys-env: mingw-w64-clang-i686,  clang-tidy: true, werror: true, dx5-libs: true, d3drm-from-wine: true }
 
     steps:
+      - name: Setup vcvars
+        if: matrix.toolchain.setup-msvc
+        uses: ilammy/msvc-dev-cmd@v1
+        with:
+          arch: ${{ matrix.toolchain.vc-arch }}
       # Figure out how to build for 32-bit arch
       # - name: Set up SDL
       #   id: sdl
@@ -45,12 +51,6 @@ jobs:
         if: matrix.toolchain.setup-ninja
         uses: ashutoshvarma/setup-ninja@master
 
-      - name: Setup vcvars
-        if: matrix.toolchain.setup-msvc
-        uses: ilammy/msvc-dev-cmd@v1
-        with:
-          arch: amd64_x86  # Use the 64-bit x64-native cross tools to build 32-bit x86 code
-
       - uses: actions/checkout@v4
         with:
           submodules: true
@@ -60,7 +60,8 @@ jobs:
         run: |
           cmake -S . -B build -GNinja \
             -DCMAKE_BUILD_TYPE=Debug \
-            -DISLE_USE_DX5_LIBS=${{ !matrix.toolchain.no-dx5-libs }} \
+            -DISLE_USE_DX5=${{ matrix.toolchain.dx5-libs }} \
+            -DISLE_D3DRM_FROM_WINE=${{ matrix.toolchain.d3drm-from-wine }} \
             -DENABLE_CLANG_TIDY=${{ !!matrix.toolchain.clang-tidy }} \
             -DISLE_WERROR=${{ !!matrix.toolchain.werror }} \
             -Werror=dev
diff --git a/3rdparty/d3drm/CMakeLists.txt b/3rdparty/d3drm/CMakeLists.txt
index 76cf1be3..3ef12866 100644
--- a/3rdparty/d3drm/CMakeLists.txt
+++ b/3rdparty/d3drm/CMakeLists.txt
@@ -2,7 +2,35 @@ project(wine_d3drm LANGUAGES C)
 
 set(CMAKE_C_CLANG_TIDY)
 
-add_library(d3drm-wine SHARED EXCLUDE_FROM_ALL
+if(MSVC)
+    # FIXME: this is wrong.
+    if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+        set(def "${CMAKE_CURRENT_SOURCE_DIR}/d3dxof32.def")
+    else()
+        set(def "${CMAKE_CURRENT_SOURCE_DIR}/d3dxof64.def")
+    endif()
+    set(imp "${CMAKE_CURRENT_BINARY_DIR}/d3dxof.lib")
+    set(exp "${CMAKE_CURRENT_BINARY_DIR}/d3dxof.exp")
+    add_custom_command(OUTPUT "${imp}" "${exp}"
+        COMMAND "${CMAKE_AR}" "${CMAKE_STATIC_LINKER_FLAGS}" "/NOLOGO" "/DEF:${def}" "/OUT:${imp}"
+        DEPENDS "${def}"
+    )
+    add_custom_target(d3dxof-implib DEPENDS "${imp}")
+    target_sources(d3dxof-implib PRIVATE "${def}")
+    add_library(d3dxof INTERFACE)
+    target_link_libraries(d3dxof INTERFACE "${imp}")
+    add_dependencies(d3dxof "d3dxof-implib")
+
+    add_library(d3drm_guid STATIC d3drm_guid.c)
+    target_include_directories(d3drm_guid PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include")
+else()
+    set(d3drm_guid)
+    add_library(d3drm_guid INTERFACE)
+endif()
+
+option(WINE_D3DRM_DYNAMIC_D3DXOF "Dynamic d3dxof" ON)
+
+add_library(d3drm-wine SHARED
     d3drm.c
     d3drm_main.c
     d3drm_private.h
@@ -17,11 +45,22 @@ add_library(d3drm-wine SHARED EXCLUDE_FROM_ALL
     texture.c
     version.rc
     viewport.c
-
-    d3drm.def
 )
-target_include_directories(d3drm-wine SYSTEM INTERFACE "${CMAKE_CURRENT_LIST_DIR}/include")
-target_link_libraries(d3drm-wine PRIVATE d3dxof ddraw)
+if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+    target_sources(d3drm-wine PRIVATE d3drm32.def)
+else()
+    target_sources(d3drm-wine PRIVATE d3drm64.def)
+endif()
+if(WINE_D3DRM_DYNAMIC_D3DXOF)
+    target_sources(d3drm-wine PRIVATE dyn_d3dxof.c dyn_d3dxof.h)
+    target_compile_definitions(d3drm-wine PRIVATE DYNAMIC_D3DXOF)
+endif()
+
+target_include_directories(d3drm-wine SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
+if(NOT WINE_D3DRM_DYNAMIC_D3DXOF)
+    target_link_libraries(d3drm-wine PRIVATE d3dxof)
+endif()
+target_link_libraries(d3drm-wine PRIVATE ddraw)
 set_property(TARGET d3drm-wine PROPERTY PREFIX "")
 set_property(TARGET d3drm-wine PROPERTY OUTPUT_NAME "d3drm")
 target_compile_definitions(d3drm-wine PRIVATE "__WINESRC__")
diff --git a/3rdparty/d3drm/d3drm.c b/3rdparty/d3drm/d3drm.c
index 393016a4..a8d08169 100644
--- a/3rdparty/d3drm/d3drm.c
+++ b/3rdparty/d3drm/d3drm.c
@@ -2145,7 +2145,11 @@ static HRESULT WINAPI d3drm3_Load(IDirect3DRM3 *iface, void *source, void *objec
         return E_NOTIMPL;
     }
 
+#ifdef DYNAMIC_D3DXOF
+    hr = DynamicDirectXFileCreate(&file);
+#else
     hr = DirectXFileCreate(&file);
+#endif
     if (hr != DXFILE_OK)
         goto end;
 
@@ -2328,9 +2332,21 @@ HRESULT WINAPI Direct3DRMCreate(IDirect3DRM **d3drm)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRM_iface.lpVtbl = &d3drm1_vtbl;
     object->IDirect3DRM2_iface.lpVtbl = &d3drm2_vtbl;
     object->IDirect3DRM3_iface.lpVtbl = &d3drm3_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref1 = 1;
     object->iface_count = 1;
 
diff --git a/3rdparty/d3drm/d3drm.def b/3rdparty/d3drm/d3drm32.def
similarity index 100%
rename from 3rdparty/d3drm/d3drm.def
rename to 3rdparty/d3drm/d3drm32.def
diff --git a/3rdparty/d3drm/d3drm64.def b/3rdparty/d3drm/d3drm64.def
new file mode 100644
index 00000000..31aec2dc
--- /dev/null
+++ b/3rdparty/d3drm/d3drm64.def
@@ -0,0 +1,22 @@
+EXPORTS
+    D3DRMColorGetAlpha
+    D3DRMColorGetBlue
+    D3DRMColorGetGreen
+    D3DRMColorGetRed
+    D3DRMCreateColorRGB
+    D3DRMCreateColorRGBA
+    D3DRMMatrixFromQuaternion
+    D3DRMQuaternionFromRotation
+    D3DRMQuaternionMultiply
+    D3DRMQuaternionSlerp
+    D3DRMVectorAdd
+    D3DRMVectorCrossProduct
+    D3DRMVectorDotProduct
+    D3DRMVectorModulus
+    D3DRMVectorNormalize
+    D3DRMVectorRandom
+    D3DRMVectorReflect
+    D3DRMVectorRotate
+    D3DRMVectorScale
+    D3DRMVectorSubtract
+    Direct3DRMCreate
diff --git a/3rdparty/d3drm/d3drm_guid.c b/3rdparty/d3drm/d3drm_guid.c
new file mode 100644
index 00000000..5ec9f82f
--- /dev/null
+++ b/3rdparty/d3drm/d3drm_guid.c
@@ -0,0 +1,3 @@
+#define INITGUID
+#include <d3drm.h>
+#include <d3drmwin.h>
diff --git a/3rdparty/d3drm/d3drm_private.h b/3rdparty/d3drm/d3drm_private.h
index e07efa1c..ee7c91c3 100644
--- a/3rdparty/d3drm/d3drm_private.h
+++ b/3rdparty/d3drm/d3drm_private.h
@@ -30,6 +30,10 @@
 #include "wine/debug.h"
 #include "wine/list.h"
 
+#ifdef DYNAMIC_D3DXOF
+#include "dyn_d3dxof.h"
+#endif
+
 struct d3drm_matrix
 {
     float _11, _12, _13, _14;
@@ -46,7 +50,7 @@ static inline struct d3drm_matrix *d3drm_matrix(D3DRMMATRIX4D m)
 struct d3drm_object
 {
     LONG ref;
-    DWORD appdata;
+    LPVOID appdata;
     struct list destroy_callbacks;
     const char *classname;
     char *name;
diff --git a/3rdparty/d3drm/d3drmwin.h b/3rdparty/d3drm/d3drmwin.h
index bd3a40d8..269420aa 100644
--- a/3rdparty/d3drm/d3drmwin.h
+++ b/3rdparty/d3drm/d3drmwin.h
@@ -49,8 +49,8 @@ DECLARE_INTERFACE_(IDirect3DRMWinDevice,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
diff --git a/3rdparty/d3drm/d3dxof32.def b/3rdparty/d3drm/d3dxof32.def
new file mode 100644
index 00000000..b377b3bf
--- /dev/null
+++ b/3rdparty/d3drm/d3dxof32.def
@@ -0,0 +1,4 @@
+LIBRARY d3dxof.dll
+
+EXPORTS
+    DirectXFileCreate@4
diff --git a/3rdparty/d3drm/d3dxof64.def b/3rdparty/d3drm/d3dxof64.def
new file mode 100644
index 00000000..35cb8e5f
--- /dev/null
+++ b/3rdparty/d3drm/d3dxof64.def
@@ -0,0 +1,4 @@
+LIBRARY d3dxof.dll
+
+EXPORTS
+    DirectXFileCreate
diff --git a/3rdparty/d3drm/device.c b/3rdparty/d3drm/device.c
index 1a433746..a8ef3c4e 100644
--- a/3rdparty/d3drm/device.c
+++ b/3rdparty/d3drm/device.c
@@ -471,7 +471,7 @@ static HRESULT WINAPI d3drm_device1_DeleteDestroyCallback(IDirect3DRMDevice *ifa
     return d3drm_device3_DeleteDestroyCallback(&device->IDirect3DRMDevice3_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_device3_SetAppData(IDirect3DRMDevice3 *iface, DWORD data)
+static HRESULT WINAPI d3drm_device3_SetAppData(IDirect3DRMDevice3 *iface, LPVOID data)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
 
@@ -482,7 +482,7 @@ static HRESULT WINAPI d3drm_device3_SetAppData(IDirect3DRMDevice3 *iface, DWORD
     return D3DRM_OK;
 }
 
-static HRESULT WINAPI d3drm_device2_SetAppData(IDirect3DRMDevice2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_device2_SetAppData(IDirect3DRMDevice2 *iface, LPVOID data)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
 
@@ -491,7 +491,7 @@ static HRESULT WINAPI d3drm_device2_SetAppData(IDirect3DRMDevice2 *iface, DWORD
     return d3drm_device3_SetAppData(&device->IDirect3DRMDevice3_iface, data);
 }
 
-static HRESULT WINAPI d3drm_device1_SetAppData(IDirect3DRMDevice *iface, DWORD data)
+static HRESULT WINAPI d3drm_device1_SetAppData(IDirect3DRMDevice *iface, LPVOID data)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
 
@@ -500,7 +500,7 @@ static HRESULT WINAPI d3drm_device1_SetAppData(IDirect3DRMDevice *iface, DWORD d
     return d3drm_device3_SetAppData(&device->IDirect3DRMDevice3_iface, data);
 }
 
-static DWORD WINAPI d3drm_device3_GetAppData(IDirect3DRMDevice3 *iface)
+static LPVOID WINAPI d3drm_device3_GetAppData(IDirect3DRMDevice3 *iface)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMDevice3(iface);
 
@@ -509,7 +509,7 @@ static DWORD WINAPI d3drm_device3_GetAppData(IDirect3DRMDevice3 *iface)
     return device->obj.appdata;
 }
 
-static DWORD WINAPI d3drm_device2_GetAppData(IDirect3DRMDevice2 *iface)
+static LPVOID WINAPI d3drm_device2_GetAppData(IDirect3DRMDevice2 *iface)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMDevice2(iface);
 
@@ -518,7 +518,7 @@ static DWORD WINAPI d3drm_device2_GetAppData(IDirect3DRMDevice2 *iface)
     return d3drm_device3_GetAppData(&device->IDirect3DRMDevice3_iface);
 }
 
-static DWORD WINAPI d3drm_device1_GetAppData(IDirect3DRMDevice *iface)
+static LPVOID WINAPI d3drm_device1_GetAppData(IDirect3DRMDevice *iface)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMDevice(iface);
 
@@ -1568,7 +1568,7 @@ static HRESULT WINAPI d3drm_device_win_DeleteDestroyCallback(IDirect3DRMWinDevic
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI d3drm_device_win_SetAppData(IDirect3DRMWinDevice *iface, DWORD data)
+static HRESULT WINAPI d3drm_device_win_SetAppData(IDirect3DRMWinDevice *iface, LPVOID data)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
 
@@ -1577,7 +1577,7 @@ static HRESULT WINAPI d3drm_device_win_SetAppData(IDirect3DRMWinDevice *iface, D
     return d3drm_device3_SetAppData(&device->IDirect3DRMDevice3_iface, data);
 }
 
-static DWORD WINAPI d3drm_device_win_GetAppData(IDirect3DRMWinDevice *iface)
+static LPVOID WINAPI d3drm_device_win_GetAppData(IDirect3DRMWinDevice *iface)
 {
     struct d3drm_device *device = impl_from_IDirect3DRMWinDevice(iface);
 
@@ -1663,10 +1663,22 @@ HRESULT d3drm_device_create(struct d3drm_device **device, IDirect3DRM *d3drm)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMDevice_iface.lpVtbl = &d3drm_device1_vtbl;
     object->IDirect3DRMDevice2_iface.lpVtbl = &d3drm_device2_vtbl;
     object->IDirect3DRMDevice3_iface.lpVtbl = &d3drm_device3_vtbl;
     object->IDirect3DRMWinDevice_iface.lpVtbl = &d3drm_device_win_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->d3drm = d3drm;
     d3drm_object_init(&object->obj, classname);
 
diff --git a/3rdparty/d3drm/dyn_d3dxof.c b/3rdparty/d3drm/dyn_d3dxof.c
new file mode 100644
index 00000000..375d81bd
--- /dev/null
+++ b/3rdparty/d3drm/dyn_d3dxof.c
@@ -0,0 +1,32 @@
+#include "dyn_d3dxof.h"
+
+static enum {
+  DYN_D3DXOF_INIT = 0,
+  DYN_D3DXOF_SUCCESS = 1,
+} g_dyn_d3dxof_state = DYN_D3DXOF_INIT;
+static HMODULE g_d3dxof;
+static HRESULT (STDAPICALLTYPE * g_DynamicDirectXFileCreate)(LPDIRECTXFILE *lplpDirectXFile);
+
+static void init_dyn_d3d(void) {
+    if (g_dyn_d3dxof_state == DYN_D3DXOF_SUCCESS) {
+        return;
+    }
+    g_d3dxof = LoadLibraryA("d3dxof.dll");
+    if (g_d3dxof == NULL) {
+        MessageBoxA(NULL, "Cannot find d3dxof.dll", "Cannot find d3dxof.dll", MB_ICONERROR);
+        abort();
+    }
+    g_DynamicDirectXFileCreate = (void*)GetProcAddress(g_d3dxof, "DirectXFileCreate");
+    if (g_d3dxof == NULL) {
+        MessageBoxA(NULL, "Missing symbols", "d3dxof.dll misses DirectXFileCreate", MB_ICONERROR);
+        abort();
+    }
+    g_dyn_d3dxof_state = DYN_D3DXOF_SUCCESS;
+}
+
+
+STDAPI DynamicDirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile)
+{
+    init_dyn_d3d();
+    return g_DynamicDirectXFileCreate(lplpDirectXFile);
+}
diff --git a/3rdparty/d3drm/dyn_d3dxof.h b/3rdparty/d3drm/dyn_d3dxof.h
new file mode 100644
index 00000000..2ed75e34
--- /dev/null
+++ b/3rdparty/d3drm/dyn_d3dxof.h
@@ -0,0 +1,8 @@
+#ifndef __DYN_D3DXOF_H__
+#define __DYN_D3DXOF_H__
+
+#include <dxfile.h>
+
+STDAPI DynamicDirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile);
+
+#endif /* __DYN_D3DXOF_H__ */
diff --git a/3rdparty/d3drm/face.c b/3rdparty/d3drm/face.c
index 34810894..72a03d82 100644
--- a/3rdparty/d3drm/face.c
+++ b/3rdparty/d3drm/face.c
@@ -113,7 +113,7 @@ static HRESULT WINAPI d3drm_face1_DeleteDestroyCallback(IDirect3DRMFace *iface,
     return IDirect3DRMFace2_DeleteDestroyCallback(&face->IDirect3DRMFace2_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_face2_SetAppData(IDirect3DRMFace2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_face2_SetAppData(IDirect3DRMFace2 *iface, LPVOID data)
 {
     struct d3drm_face *face = impl_from_IDirect3DRMFace2(iface);
 
@@ -124,7 +124,7 @@ static HRESULT WINAPI d3drm_face2_SetAppData(IDirect3DRMFace2 *iface, DWORD data
     return D3DRM_OK;
 }
 
-static HRESULT WINAPI d3drm_face1_SetAppData(IDirect3DRMFace *iface, DWORD data)
+static HRESULT WINAPI d3drm_face1_SetAppData(IDirect3DRMFace *iface, LPVOID data)
 {
     struct d3drm_face *face = impl_from_IDirect3DRMFace(iface);
 
@@ -133,7 +133,7 @@ static HRESULT WINAPI d3drm_face1_SetAppData(IDirect3DRMFace *iface, DWORD data)
     return d3drm_face2_SetAppData(&face->IDirect3DRMFace2_iface, data);
 }
 
-static DWORD WINAPI d3drm_face2_GetAppData(IDirect3DRMFace2 *iface)
+static LPVOID WINAPI d3drm_face2_GetAppData(IDirect3DRMFace2 *iface)
 {
     struct d3drm_face *face = impl_from_IDirect3DRMFace2(iface);
 
@@ -142,7 +142,7 @@ static DWORD WINAPI d3drm_face2_GetAppData(IDirect3DRMFace2 *iface)
     return face->obj.appdata;
 }
 
-static DWORD WINAPI d3drm_face1_GetAppData(IDirect3DRMFace *iface)
+static LPVOID WINAPI d3drm_face1_GetAppData(IDirect3DRMFace *iface)
 {
     struct d3drm_face *face = impl_from_IDirect3DRMFace(iface);
 
@@ -627,8 +627,20 @@ HRESULT d3drm_face_create(struct d3drm_face **face)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMFace_iface.lpVtbl = &d3drm_face1_vtbl;
     object->IDirect3DRMFace2_iface.lpVtbl = &d3drm_face2_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref = 1;
 
     d3drm_object_init(&object->obj, classname);
diff --git a/3rdparty/d3drm/frame.c b/3rdparty/d3drm/frame.c
index 7a5bd18c..2f6e0275 100644
--- a/3rdparty/d3drm/frame.c
+++ b/3rdparty/d3drm/frame.c
@@ -261,7 +261,19 @@ static struct d3drm_frame_array *d3drm_frame_array_create(unsigned int frame_cou
     if (!(array = calloc(1, sizeof(*array))))
         return NULL;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     array->IDirect3DRMFrameArray_iface.lpVtbl = &d3drm_frame_array_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     array->ref = 1;
     array->size = frame_count;
 
@@ -379,7 +391,19 @@ static struct d3drm_visual_array *d3drm_visual_array_create(unsigned int visual_
     if (!(array = calloc(1, sizeof(*array))))
         return NULL;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     array->IDirect3DRMVisualArray_iface.lpVtbl = &d3drm_visual_array_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     array->ref = 1;
     array->size = visual_count;
 
@@ -498,7 +522,19 @@ static struct d3drm_light_array *d3drm_light_array_create(unsigned int light_cou
     if (!(array = calloc(1, sizeof(*array))))
         return NULL;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     array->IDirect3DRMLightArray_iface.lpVtbl = &d3drm_light_array_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     array->ref = 1;
     array->size = light_count;
 
@@ -733,7 +769,7 @@ static HRESULT WINAPI d3drm_frame1_DeleteDestroyCallback(IDirect3DRMFrame *iface
     return IDirect3DRMFrame3_DeleteDestroyCallback(&frame->IDirect3DRMFrame3_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_frame3_SetAppData(IDirect3DRMFrame3 *iface, DWORD data)
+static HRESULT WINAPI d3drm_frame3_SetAppData(IDirect3DRMFrame3 *iface, LPVOID data)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
 
@@ -744,7 +780,7 @@ static HRESULT WINAPI d3drm_frame3_SetAppData(IDirect3DRMFrame3 *iface, DWORD da
     return D3DRM_OK;
 }
 
-static HRESULT WINAPI d3drm_frame2_SetAppData(IDirect3DRMFrame2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_frame2_SetAppData(IDirect3DRMFrame2 *iface, LPVOID data)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame2(iface);
 
@@ -753,7 +789,7 @@ static HRESULT WINAPI d3drm_frame2_SetAppData(IDirect3DRMFrame2 *iface, DWORD da
     return d3drm_frame3_SetAppData(&frame->IDirect3DRMFrame3_iface, data);
 }
 
-static HRESULT WINAPI d3drm_frame1_SetAppData(IDirect3DRMFrame *iface, DWORD data)
+static HRESULT WINAPI d3drm_frame1_SetAppData(IDirect3DRMFrame *iface, LPVOID data)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame(iface);
 
@@ -762,7 +798,7 @@ static HRESULT WINAPI d3drm_frame1_SetAppData(IDirect3DRMFrame *iface, DWORD dat
     return d3drm_frame3_SetAppData(&frame->IDirect3DRMFrame3_iface, data);
 }
 
-static DWORD WINAPI d3drm_frame3_GetAppData(IDirect3DRMFrame3 *iface)
+static LPVOID WINAPI d3drm_frame3_GetAppData(IDirect3DRMFrame3 *iface)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame3(iface);
 
@@ -771,7 +807,7 @@ static DWORD WINAPI d3drm_frame3_GetAppData(IDirect3DRMFrame3 *iface)
     return frame->obj.appdata;
 }
 
-static DWORD WINAPI d3drm_frame2_GetAppData(IDirect3DRMFrame2 *iface)
+static LPVOID WINAPI d3drm_frame2_GetAppData(IDirect3DRMFrame2 *iface)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame2(iface);
 
@@ -780,7 +816,7 @@ static DWORD WINAPI d3drm_frame2_GetAppData(IDirect3DRMFrame2 *iface)
     return d3drm_frame3_GetAppData(&frame->IDirect3DRMFrame3_iface);
 }
 
-static DWORD WINAPI d3drm_frame1_GetAppData(IDirect3DRMFrame *iface)
+static LPVOID WINAPI d3drm_frame1_GetAppData(IDirect3DRMFrame *iface)
 {
     struct d3drm_frame *frame = impl_from_IDirect3DRMFrame(iface);
 
@@ -3137,9 +3173,21 @@ HRESULT d3drm_frame_create(struct d3drm_frame **frame, IUnknown *parent_frame, I
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMFrame_iface.lpVtbl = &d3drm_frame1_vtbl;
     object->IDirect3DRMFrame2_iface.lpVtbl = &d3drm_frame2_vtbl;
     object->IDirect3DRMFrame3_iface.lpVtbl = &d3drm_frame3_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->d3drm = d3drm;
     object->ref = 1;
     d3drm_set_color(&object->scenebackground, 0.0f, 0.0f, 0.0f, 1.0f);
@@ -3302,7 +3350,7 @@ static HRESULT WINAPI d3drm_animation1_DeleteDestroyCallback(IDirect3DRMAnimatio
     return IDirect3DRMAnimation2_DeleteDestroyCallback(&animation->IDirect3DRMAnimation2_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_animation2_SetAppData(IDirect3DRMAnimation2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_animation2_SetAppData(IDirect3DRMAnimation2 *iface, LPVOID data)
 {
     struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation2(iface);
 
@@ -3313,7 +3361,7 @@ static HRESULT WINAPI d3drm_animation2_SetAppData(IDirect3DRMAnimation2 *iface,
     return D3DRM_OK;
 }
 
-static HRESULT WINAPI d3drm_animation1_SetAppData(IDirect3DRMAnimation *iface, DWORD data)
+static HRESULT WINAPI d3drm_animation1_SetAppData(IDirect3DRMAnimation *iface, LPVOID data)
 {
     struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation(iface);
 
@@ -3322,7 +3370,7 @@ static HRESULT WINAPI d3drm_animation1_SetAppData(IDirect3DRMAnimation *iface, D
     return d3drm_animation2_SetAppData(&animation->IDirect3DRMAnimation2_iface, data);
 }
 
-static DWORD WINAPI d3drm_animation2_GetAppData(IDirect3DRMAnimation2 *iface)
+static LPVOID WINAPI d3drm_animation2_GetAppData(IDirect3DRMAnimation2 *iface)
 {
     struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation2(iface);
 
@@ -3331,7 +3379,7 @@ static DWORD WINAPI d3drm_animation2_GetAppData(IDirect3DRMAnimation2 *iface)
     return animation->obj.appdata;
 }
 
-static DWORD WINAPI d3drm_animation1_GetAppData(IDirect3DRMAnimation *iface)
+static LPVOID WINAPI d3drm_animation1_GetAppData(IDirect3DRMAnimation *iface)
 {
     struct d3drm_animation *animation = impl_from_IDirect3DRMAnimation(iface);
 
@@ -3889,8 +3937,20 @@ HRESULT d3drm_animation_create(struct d3drm_animation **animation, IDirect3DRM *
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMAnimation_iface.lpVtbl = &d3drm_animation1_vtbl;
     object->IDirect3DRMAnimation2_iface.lpVtbl = &d3drm_animation2_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->d3drm = d3drm;
     object->ref = 1;
     object->options = D3DRMANIMATION_CLOSED | D3DRMANIMATION_LINEARPOSITION;
diff --git a/3rdparty/d3drm/include/d3drmdef.h b/3rdparty/d3drm/include/d3drmdef.h
index aa77c2c5..859df046 100644
--- a/3rdparty/d3drm/include/d3drmdef.h
+++ b/3rdparty/d3drm/include/d3drmdef.h
@@ -28,6 +28,10 @@
 extern "C" {
 #endif
 
+#ifndef __MSABI_LONG
+#define __MSABI_LONG(X) (X)
+#endif
+
 typedef struct _D3DRMVECTOR4D
 {
     D3DVALUE x;
diff --git a/3rdparty/d3drm/include/d3drmobj.h b/3rdparty/d3drm/include/d3drmobj.h
index 7e48d989..4ff8c853 100644
--- a/3rdparty/d3drm/include/d3drmobj.h
+++ b/3rdparty/d3drm/include/d3drmobj.h
@@ -29,6 +29,10 @@
 extern "C" {
 #endif
 
+#ifdef INTERFACE
+#undef INTERFACE
+#endif
+
 /* Direct3DRM object CLSIDs */
 
 DEFINE_GUID(CLSID_CDirect3DRMDevice,                    0x4fa3568e, 0x623f, 0x11cf, 0xac, 0x4a, 0x0, 0x0, 0xc0, 0x38, 0x25, 0xa1);
@@ -205,8 +209,8 @@ DECLARE_INTERFACE_(IDirect3DRMObject,IUnknown)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -315,8 +319,8 @@ DECLARE_INTERFACE_(IDirect3DRMVisual,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -370,8 +374,8 @@ DECLARE_INTERFACE_(IDirect3DRMDevice,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -497,8 +501,8 @@ DECLARE_INTERFACE_(IDirect3DRMDevice2,IDirect3DRMDevice)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -642,8 +646,8 @@ DECLARE_INTERFACE_(IDirect3DRMDevice3,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -802,8 +806,8 @@ DECLARE_INTERFACE_(IDirect3DRMViewport,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -942,8 +946,8 @@ DECLARE_INTERFACE_(IDirect3DRMViewport2,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -1090,8 +1094,8 @@ DECLARE_INTERFACE_(IDirect3DRMFrame,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -1323,8 +1327,8 @@ DECLARE_INTERFACE_(IDirect3DRMFrame2,IDirect3DRMFrame)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -1605,8 +1609,8 @@ DECLARE_INTERFACE_(IDirect3DRMFrame3,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -1903,8 +1907,8 @@ DECLARE_INTERFACE_(IDirect3DRMMesh,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2018,8 +2022,8 @@ DECLARE_INTERFACE_(IDirect3DRMProgressiveMesh,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2128,8 +2132,8 @@ DECLARE_INTERFACE_(IDirect3DRMShadow,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2187,8 +2191,8 @@ DECLARE_INTERFACE_(IDirect3DRMShadow2,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2275,8 +2279,8 @@ DECLARE_INTERFACE_(IDirect3DRMFace,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2385,8 +2389,8 @@ DECLARE_INTERFACE_(IDirect3DRMFace2,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2495,8 +2499,8 @@ DECLARE_INTERFACE_(IDirect3DRMMeshBuilder,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2667,8 +2671,8 @@ DECLARE_INTERFACE_(IDirect3DRMMeshBuilder2,IDirect3DRMMeshBuilder)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -2848,8 +2852,8 @@ DECLARE_INTERFACE_(IDirect3DRMMeshBuilder3,IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3085,8 +3089,8 @@ DECLARE_INTERFACE_(IDirect3DRMLight,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3197,8 +3201,8 @@ DECLARE_INTERFACE_(IDirect3DRMTexture, IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3309,8 +3313,8 @@ DECLARE_INTERFACE_(IDirect3DRMTexture2, IDirect3DRMTexture)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3433,8 +3437,8 @@ DECLARE_INTERFACE_(IDirect3DRMTexture3, IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3569,8 +3573,8 @@ DECLARE_INTERFACE_(IDirect3DRMWrap, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3635,8 +3639,8 @@ DECLARE_INTERFACE_(IDirect3DRMMaterial, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3708,8 +3712,8 @@ DECLARE_INTERFACE_(IDirect3DRMMaterial2, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3787,8 +3791,8 @@ DECLARE_INTERFACE_(IDirect3DRMAnimation, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3866,8 +3870,8 @@ DECLARE_INTERFACE_(IDirect3DRMAnimation2, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -3960,8 +3964,8 @@ DECLARE_INTERFACE_(IDirect3DRMAnimationSet, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -4028,8 +4032,8 @@ DECLARE_INTERFACE_(IDirect3DRMAnimationSet2, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -4099,8 +4103,8 @@ DECLARE_INTERFACE_(IDirect3DRMUserVisual, IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -4560,8 +4564,8 @@ DECLARE_INTERFACE_(IDirect3DRMInterpolator, IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
@@ -4633,8 +4637,8 @@ DECLARE_INTERFACE_(IDirect3DRMClippedVisual, IDirect3DRMVisual)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
diff --git a/3rdparty/d3drm/include/d3drmwin.h b/3rdparty/d3drm/include/d3drmwin.h
index bd3a40d8..269420aa 100644
--- a/3rdparty/d3drm/include/d3drmwin.h
+++ b/3rdparty/d3drm/include/d3drmwin.h
@@ -49,8 +49,8 @@ DECLARE_INTERFACE_(IDirect3DRMWinDevice,IDirect3DRMObject)
     STDMETHOD(Clone)(THIS_ IUnknown *outer, REFIID iid, void **out) PURE;
     STDMETHOD(AddDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
     STDMETHOD(DeleteDestroyCallback)(THIS_ D3DRMOBJECTCALLBACK cb, void *ctx) PURE;
-    STDMETHOD(SetAppData)(THIS_ DWORD data) PURE;
-    STDMETHOD_(DWORD, GetAppData)(THIS) PURE;
+    STDMETHOD(SetAppData)(THIS_ LPVOID data) PURE;
+    STDMETHOD_(LPVOID, GetAppData)(THIS) PURE;
     STDMETHOD(SetName)(THIS_ const char *name) PURE;
     STDMETHOD(GetName)(THIS_ DWORD *size, char *name) PURE;
     STDMETHOD(GetClassName)(THIS_ DWORD *size, char *name) PURE;
diff --git a/3rdparty/d3drm/include/dxfile.h b/3rdparty/d3drm/include/dxfile.h
new file mode 100644
index 00000000..57028756
--- /dev/null
+++ b/3rdparty/d3drm/include/dxfile.h
@@ -0,0 +1,303 @@
+/*
+ * Copyright 2004 Christian Costa
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_DXFILE_H
+#define __WINE_DXFILE_H
+
+#include <objbase.h>
+//#include <winnt.h>
+
+#ifdef INTERFACE
+#undef INTERFACE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* defined(__cplusplus) */
+
+typedef DWORD DXFILEFORMAT;
+
+#define DXFILEFORMAT_BINARY     0
+#define DXFILEFORMAT_TEXT       1
+#define DXFILEFORMAT_COMPRESSED 2
+
+typedef DWORD DXFILELOADOPTIONS;
+
+#define DXFILELOAD_FROMFILE     __MSABI_LONG(0x00)
+#define DXFILELOAD_FROMRESOURCE __MSABI_LONG(0x01)
+#define DXFILELOAD_FROMMEMORY   __MSABI_LONG(0x02)
+#define DXFILELOAD_FROMSTREAM   __MSABI_LONG(0x04)
+#define DXFILELOAD_FROMURL      __MSABI_LONG(0x08)
+
+typedef struct _DXFILELOADRESOURCE {
+    HMODULE hModule;
+    LPCSTR /*LPCTSTR*/ lpName;
+    LPCSTR /*LPCTSTR*/ lpType;
+} DXFILELOADRESOURCE, *LPDXFILELOADRESOURCE;
+
+typedef struct _DXFILELOADMEMORY {
+    LPVOID lpMemory;
+    DWORD dSize;
+} DXFILELOADMEMORY, *LPDXFILELOADMEMORY;
+
+typedef struct IDirectXFile *LPDIRECTXFILE;
+typedef struct IDirectXFileEnumObject *LPDIRECTXFILEENUMOBJECT;
+typedef struct IDirectXFileSaveObject *LPDIRECTXFILESAVEOBJECT;
+typedef struct IDirectXFileObject *LPDIRECTXFILEOBJECT;
+typedef struct IDirectXFileData *LPDIRECTXFILEDATA;
+typedef struct IDirectXFileDataReference *LPDIRECTXFILEDATAREFERENCE;
+typedef struct IDirectXFileBinary *LPDIRECTXFILEBINARY;
+
+STDAPI DirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile);
+
+#define INTERFACE IDirectXFile
+DECLARE_INTERFACE_(IDirectXFile,IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+    /*** IDirectXFile methods ***/
+    STDMETHOD(CreateEnumObject) (THIS_ LPVOID, DXFILELOADOPTIONS, LPDIRECTXFILEENUMOBJECT *) PURE;
+    STDMETHOD(CreateSaveObject) (THIS_ LPCSTR, DXFILEFORMAT, LPDIRECTXFILESAVEOBJECT *) PURE;
+    STDMETHOD(RegisterTemplates) (THIS_ LPVOID, DWORD) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFile_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFile_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFile_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFile methods ***/
+#define IDirectXFile_CreateEnumObject(p,a,b,c) (p)->lpVtbl->CreateEnumObject(p,a,b,c)
+#define IDirectXFile_CreateSaveObject(p,a,b,c) (p)->lpVtbl->CreateSaveObject(p,a,b,c)
+#define IDirectXFile_RegisterTemplates(p,a,b)  (p)->lpVtbl->RegisterTemplates(p,a,b)
+#endif
+
+#define INTERFACE IDirectXFileEnumObject
+DECLARE_INTERFACE_(IDirectXFileEnumObject,IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+    /*** IDirectXFileEnumObject methods ***/
+    STDMETHOD(GetNextDataObject)    (THIS_ LPDIRECTXFILEDATA *) PURE;
+    STDMETHOD(GetDataObjectById)    (THIS_ REFGUID, LPDIRECTXFILEDATA *) PURE;
+    STDMETHOD(GetDataObjectByName)  (THIS_ LPCSTR, LPDIRECTXFILEDATA *) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFileEnumObject_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFileEnumObject_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFileEnumObject_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFileEnumObject methods ***/
+#define IDirectXFileEnumObject_GetNextDataObject(p,a)     (p)->lpVtbl->GetNextDataObject(p,a)
+#define IDirectXFileEnumObject_GetDataObjectById(p,a,b)   (p)->lpVtbl->GetDataObjectById(p,a,b)
+#define IDirectXFileEnumObject_GetDataObjectByName(p,a,b) (p)->lpVtbl->GetDataObjectByName(p,a,b)
+#endif
+
+#define INTERFACE IDirectXFileSaveObject
+DECLARE_INTERFACE_(IDirectXFileSaveObject,IUnknown)
+{
+    /*** IUnknown methods ***/
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
+    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+    STDMETHOD_(ULONG,Release)(THIS) PURE;
+    /*** IDirectXFileSaveObject methods ***/
+    STDMETHOD(SaveTemplates) (THIS_ DWORD, const GUID **) PURE;
+    STDMETHOD(CreateDataObject) (THIS_ REFGUID, LPCSTR, const GUID *, DWORD, LPVOID, LPDIRECTXFILEDATA *) PURE;
+    STDMETHOD(SaveData) (THIS_ LPDIRECTXFILEDATA) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFileSaveObject_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFileSaveObject_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFileSaveObject_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFileSaveObject methods ***/
+#define IDirectXFileSaveObject_SaveTemplates(p,a,b)            (p)->lpVtbl->SaveTemplates(p,a,b)
+#define IDirectXFileSaveObject_CreateDataObject(p,a,b,c,d,e,f) (p)->lpVtbl->CreateDataObject(p,a,b,c,d,e,f)
+#define IDirectXFileSaveObject_SaveData(p,a)                   (p)->lpVtbl->SaveData(p,a)
+#endif
+
+#define IUNKNOWN_METHODS(kind) \
+    STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) kind; \
+    STDMETHOD_(ULONG,AddRef)(THIS) kind; \
+    STDMETHOD_(ULONG,Release)(THIS) kind
+
+#define IDIRECTXFILEOBJECT_METHODS(kind) \
+    STDMETHOD(GetName) (THIS_ LPSTR, LPDWORD) kind; \
+    STDMETHOD(GetId) (THIS_ LPGUID) kind
+
+#define INTERFACE IDirectXFileObject
+DECLARE_INTERFACE_(IDirectXFileObject,IUnknown)
+{
+    IUNKNOWN_METHODS(PURE);
+    IDIRECTXFILEOBJECT_METHODS(PURE);
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFileObject_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFileObject_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFileObject_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFileObject methods ***/
+#define IDirectXFileObject_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b)
+#define IDirectXFileObject_GetId(p,a)     (p)->lpVtbl->GetId(p,a)
+#endif
+
+#define INTERFACE IDirectXFileData
+DECLARE_INTERFACE_(IDirectXFileData,IDirectXFileObject)
+{
+    IUNKNOWN_METHODS(PURE);
+    IDIRECTXFILEOBJECT_METHODS(PURE);
+    /*** IDirectXFileData methods ***/
+    STDMETHOD(GetData) (THIS_ LPCSTR, DWORD *, void **) PURE;
+    STDMETHOD(GetType) (THIS_ const GUID **) PURE;
+    STDMETHOD(GetNextObject) (THIS_ LPDIRECTXFILEOBJECT *) PURE;
+    STDMETHOD(AddDataObject) (THIS_ LPDIRECTXFILEDATA) PURE;
+    STDMETHOD(AddDataReference) (THIS_ LPCSTR, const GUID *) PURE;
+    STDMETHOD(AddBinaryObject) (THIS_ LPCSTR, const GUID *, LPCSTR, LPVOID, DWORD) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFileData_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFileData_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFileData_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFileObject methods ***/
+#define IDirectXFileData_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b)
+#define IDirectXFileData_GetId(p,a)     (p)->lpVtbl->GetId(p,a)
+    /*** IDirectXFileData methods ***/
+#define IDirectXFileData_GetData(p,a,b,c)             (p)->lpVtbl->GetData(p,a,b,c)
+#define IDirectXFileData_GetType(p,a)                 (p)->lpVtbl->GetType(p,a)
+#define IDirectXFileData_GetNextObject(p,a)           (p)->lpVtbl->GetNextObject(p,a)
+#define IDirectXFileData_AddDataObject(p,a)           (p)->lpVtbl->AddDataObject(p,a)
+#define IDirectXFileData_AddDataReference(p,a,b)      (p)->lpVtbl->AddDataReference(p,a,b)
+#define IDirectXFileData_AddBinaryObject(p,a,b,c,d,e) (p)->lpVtbl->AddBinaryObject(p,a,b,c,d,e)
+#endif
+
+#define INTERFACE IDirectXFileDataReference
+DECLARE_INTERFACE_(IDirectXFileDataReference,IDirectXFileObject)
+{
+    IUNKNOWN_METHODS(PURE);
+    IDIRECTXFILEOBJECT_METHODS(PURE);
+    /*** IDirectXFileDataReference methods ***/
+    STDMETHOD(Resolve) (THIS_ LPDIRECTXFILEDATA *) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFileDataReference_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFileDataReference_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFileDataReference_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFileObject methods ***/
+#define IDirectXFileDataReference_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b)
+#define IDirectXFileDataReference_GetId(p,a)     (p)->lpVtbl->GetId(p,a)
+    /*** IDirectXFileDataReference methods ***/
+#define IDirectXFileDataReference_Resolve(p,a) (p)->lpVtbl->Resolve(p,a)
+#endif
+
+#define INTERFACE IDirectXFileBinary
+DECLARE_INTERFACE_(IDirectXFileBinary,IDirectXFileObject)
+{
+    IUNKNOWN_METHODS(PURE);
+    IDIRECTXFILEOBJECT_METHODS(PURE);
+    /*** IDirectXFileBinary methods ***/
+    STDMETHOD(GetSize)      (THIS_ DWORD *) PURE;
+    STDMETHOD(GetMimeType)  (THIS_ LPCSTR *) PURE;
+    STDMETHOD(Read)         (THIS_ LPVOID, DWORD, LPDWORD) PURE;
+};
+#undef INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+    /*** IUnknown methods ***/
+#define IDirectXFileBinary_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectXFileBinary_AddRef(p)             (p)->lpVtbl->AddRef(p)
+#define IDirectXFileBinary_Release(p)            (p)->lpVtbl->Release(p)
+    /*** IDirectXFileObject methods ***/
+#define IDirectXFileBinary_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b)
+#define IDirectXFileBinary_GetId(p,a)     (p)->lpVtbl->GetId(p,a)
+    /*** IDirectXFileBinary methods ***/
+#define IDirectXFileBinary_GetSize(p,a)     (p)->lpVtbl->GetSize(p,a)
+#define IDirectXFileBinary_GetMimeType(p,a) (p)->lpVtbl->GetMimeType(p,a)
+#define IDirectXFileBinary_Read(p,a,b,c)    (p)->lpVtbl->Read(p,a,b,c)
+#endif
+
+/* DirectXFile Object CLSID */
+DEFINE_GUID(CLSID_CDirectXFile,             0x4516ec43, 0x8f20, 0x11d0, 0x9b, 0x6d, 0x00, 0x00, 0xc0, 0x78, 0x1b, 0xc3);
+
+/* DirectX File Interface GUIDs */
+DEFINE_GUID(IID_IDirectXFile,               0x3d82ab40, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+DEFINE_GUID(IID_IDirectXFileEnumObject,     0x3d82ab41, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+DEFINE_GUID(IID_IDirectXFileSaveObject,     0x3d82ab42, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+DEFINE_GUID(IID_IDirectXFileObject,         0x3d82ab43, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+DEFINE_GUID(IID_IDirectXFileData,           0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+DEFINE_GUID(IID_IDirectXFileDataReference,  0x3d82ab45, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+DEFINE_GUID(IID_IDirectXFileBinary,         0x3d82ab46, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+
+/* DirectX File Header template's GUID */
+DEFINE_GUID(TID_DXFILEHeader,               0x3d82ab43, 0x62da, 0x11cf, 0xab, 0x39, 0x00, 0x20, 0xaf, 0x71, 0xe4, 0x33);
+
+/* DirectX File errors */
+#define _FACDD  0x876
+#define MAKE_DDHRESULT( code )  MAKE_HRESULT( 1, _FACDD, code )
+
+#define DXFILE_OK   0
+
+#define DXFILEERR_BADOBJECT                 MAKE_DDHRESULT(850)
+#define DXFILEERR_BADVALUE                  MAKE_DDHRESULT(851)
+#define DXFILEERR_BADTYPE                   MAKE_DDHRESULT(852)
+#define DXFILEERR_BADSTREAMHANDLE           MAKE_DDHRESULT(853)
+#define DXFILEERR_BADALLOC                  MAKE_DDHRESULT(854)
+#define DXFILEERR_NOTFOUND                  MAKE_DDHRESULT(855)
+#define DXFILEERR_NOTDONEYET                MAKE_DDHRESULT(856)
+#define DXFILEERR_FILENOTFOUND              MAKE_DDHRESULT(857)
+#define DXFILEERR_RESOURCENOTFOUND          MAKE_DDHRESULT(858)
+#define DXFILEERR_URLNOTFOUND               MAKE_DDHRESULT(859)
+#define DXFILEERR_BADRESOURCE               MAKE_DDHRESULT(860)
+#define DXFILEERR_BADFILETYPE               MAKE_DDHRESULT(861)
+#define DXFILEERR_BADFILEVERSION            MAKE_DDHRESULT(862)
+#define DXFILEERR_BADFILEFLOATSIZE          MAKE_DDHRESULT(863)
+#define DXFILEERR_BADFILECOMPRESSIONTYPE    MAKE_DDHRESULT(864)
+#define DXFILEERR_BADFILE                   MAKE_DDHRESULT(865)
+#define DXFILEERR_PARSEERROR                MAKE_DDHRESULT(866)
+#define DXFILEERR_NOTEMPLATE                MAKE_DDHRESULT(867)
+#define DXFILEERR_BADARRAYSIZE              MAKE_DDHRESULT(868)
+#define DXFILEERR_BADDATAREFERENCE          MAKE_DDHRESULT(869)
+#define DXFILEERR_INTERNALERROR             MAKE_DDHRESULT(870)
+#define DXFILEERR_NOMOREOBJECTS             MAKE_DDHRESULT(871)
+#define DXFILEERR_BADINTRINSICS             MAKE_DDHRESULT(872)
+#define DXFILEERR_NOMORESTREAMHANDLES       MAKE_DDHRESULT(873)
+#define DXFILEERR_NOMOREDATA                MAKE_DDHRESULT(874)
+#define DXFILEERR_BADCACHEFILE              MAKE_DDHRESULT(875)
+#define DXFILEERR_NOINTERNET                MAKE_DDHRESULT(876)
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* defined(__cplusplus) */
+
+#endif /* __WINE_DXFILE_H */
diff --git a/3rdparty/d3drm/light.c b/3rdparty/d3drm/light.c
index 704c11c0..66b255ce 100644
--- a/3rdparty/d3drm/light.c
+++ b/3rdparty/d3drm/light.c
@@ -101,7 +101,7 @@ static HRESULT WINAPI d3drm_light_DeleteDestroyCallback(IDirect3DRMLight *iface,
     return d3drm_object_delete_destroy_callback(&light->obj, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_light_SetAppData(IDirect3DRMLight *iface, DWORD data)
+static HRESULT WINAPI d3drm_light_SetAppData(IDirect3DRMLight *iface, LPVOID data)
 {
     struct d3drm_light *light = impl_from_IDirect3DRMLight(iface);
 
@@ -112,7 +112,7 @@ static HRESULT WINAPI d3drm_light_SetAppData(IDirect3DRMLight *iface, DWORD data
     return D3DRM_OK;
 }
 
-static DWORD WINAPI d3drm_light_GetAppData(IDirect3DRMLight *iface)
+static LPVOID WINAPI d3drm_light_GetAppData(IDirect3DRMLight *iface)
 {
     struct d3drm_light *light = impl_from_IDirect3DRMLight(iface);
 
@@ -378,7 +378,19 @@ HRESULT d3drm_light_create(struct d3drm_light **light, IDirect3DRM *d3drm)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMLight_iface.lpVtbl = &d3drm_light_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref = 1;
     object->d3drm = d3drm;
     IDirect3DRM_AddRef(object->d3drm);
diff --git a/3rdparty/d3drm/material.c b/3rdparty/d3drm/material.c
index 726768fa..ed2e40ca 100644
--- a/3rdparty/d3drm/material.c
+++ b/3rdparty/d3drm/material.c
@@ -102,7 +102,7 @@ static HRESULT WINAPI d3drm_material_DeleteDestroyCallback(IDirect3DRMMaterial2
     return d3drm_object_delete_destroy_callback(&material->obj, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_material_SetAppData(IDirect3DRMMaterial2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_material_SetAppData(IDirect3DRMMaterial2 *iface, LPVOID data)
 {
     struct d3drm_material *material = impl_from_IDirect3DRMMaterial2(iface);
 
@@ -113,7 +113,7 @@ static HRESULT WINAPI d3drm_material_SetAppData(IDirect3DRMMaterial2 *iface, DWO
     return D3DRM_OK;
 }
 
-static DWORD WINAPI d3drm_material_GetAppData(IDirect3DRMMaterial2 *iface)
+static LPVOID WINAPI d3drm_material_GetAppData(IDirect3DRMMaterial2 *iface)
 {
     struct d3drm_material *material = impl_from_IDirect3DRMMaterial2(iface);
 
@@ -286,7 +286,19 @@ HRESULT d3drm_material_create(struct d3drm_material **material, IDirect3DRM *d3d
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMMaterial2_iface.lpVtbl = &d3drm_material_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref = 1;
     object->d3drm = d3drm;
     IDirect3DRM_AddRef(object->d3drm);
diff --git a/3rdparty/d3drm/meshbuilder.c b/3rdparty/d3drm/meshbuilder.c
index 27e76c1c..45ddaa53 100644
--- a/3rdparty/d3drm/meshbuilder.c
+++ b/3rdparty/d3drm/meshbuilder.c
@@ -427,7 +427,7 @@ static HRESULT WINAPI d3drm_mesh_builder2_DeleteDestroyCallback(IDirect3DRMMeshB
     return IDirect3DRMMeshBuilder3_DeleteDestroyCallback(&mesh_builder->IDirect3DRMMeshBuilder3_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_mesh_builder3_SetAppData(IDirect3DRMMeshBuilder3 *iface, DWORD data)
+static HRESULT WINAPI d3drm_mesh_builder3_SetAppData(IDirect3DRMMeshBuilder3 *iface, LPVOID data)
 {
     struct d3drm_mesh_builder *mesh_builder = impl_from_IDirect3DRMMeshBuilder3(iface);
 
@@ -438,7 +438,7 @@ static HRESULT WINAPI d3drm_mesh_builder3_SetAppData(IDirect3DRMMeshBuilder3 *if
     return D3DRM_OK;
 }
 
-static HRESULT WINAPI d3drm_mesh_builder2_SetAppData(IDirect3DRMMeshBuilder2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_mesh_builder2_SetAppData(IDirect3DRMMeshBuilder2 *iface, LPVOID data)
 {
     struct d3drm_mesh_builder *mesh_builder = impl_from_IDirect3DRMMeshBuilder2(iface);
 
@@ -447,7 +447,7 @@ static HRESULT WINAPI d3drm_mesh_builder2_SetAppData(IDirect3DRMMeshBuilder2 *if
     return d3drm_mesh_builder3_SetAppData(&mesh_builder->IDirect3DRMMeshBuilder3_iface, data);
 }
 
-static DWORD WINAPI d3drm_mesh_builder3_GetAppData(IDirect3DRMMeshBuilder3 *iface)
+static LPVOID WINAPI d3drm_mesh_builder3_GetAppData(IDirect3DRMMeshBuilder3 *iface)
 {
     struct d3drm_mesh_builder *mesh_builder = impl_from_IDirect3DRMMeshBuilder3(iface);
 
@@ -456,7 +456,7 @@ static DWORD WINAPI d3drm_mesh_builder3_GetAppData(IDirect3DRMMeshBuilder3 *ifac
     return mesh_builder->obj.appdata;
 }
 
-static DWORD WINAPI d3drm_mesh_builder2_GetAppData(IDirect3DRMMeshBuilder2 *iface)
+static LPVOID WINAPI d3drm_mesh_builder2_GetAppData(IDirect3DRMMeshBuilder2 *iface)
 {
     struct d3drm_mesh_builder *mesh_builder = impl_from_IDirect3DRMMeshBuilder2(iface);
 
@@ -1483,7 +1483,11 @@ static HRESULT WINAPI d3drm_mesh_builder3_Load(IDirect3DRMMeshBuilder3 *iface, v
 
     clean_mesh_builder_data(mesh_builder);
 
+#ifdef DYNAMIC_D3DXOF
+    hr = DynamicDirectXFileCreate(&dxfile);
+#else
     hr = DirectXFileCreate(&dxfile);
+#endif
     if (hr != DXFILE_OK)
         goto end;
 
@@ -2343,8 +2347,20 @@ HRESULT d3drm_mesh_builder_create(struct d3drm_mesh_builder **mesh_builder, IDir
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMMeshBuilder2_iface.lpVtbl = &d3drm_mesh_builder2_vtbl;
     object->IDirect3DRMMeshBuilder3_iface.lpVtbl = &d3drm_mesh_builder3_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref = 1;
     object->d3drm = d3drm;
     object->quality = D3DRMRENDER_GOURAUD;
@@ -2444,7 +2460,7 @@ static HRESULT WINAPI d3drm_mesh_DeleteDestroyCallback(IDirect3DRMMesh *iface,
     return d3drm_object_delete_destroy_callback(&mesh->obj, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_mesh_SetAppData(IDirect3DRMMesh *iface, DWORD data)
+static HRESULT WINAPI d3drm_mesh_SetAppData(IDirect3DRMMesh *iface, LPVOID data)
 {
     struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
 
@@ -2455,7 +2471,7 @@ static HRESULT WINAPI d3drm_mesh_SetAppData(IDirect3DRMMesh *iface, DWORD data)
     return D3DRM_OK;
 }
 
-static DWORD WINAPI d3drm_mesh_GetAppData(IDirect3DRMMesh *iface)
+static LPVOID WINAPI d3drm_mesh_GetAppData(IDirect3DRMMesh *iface)
 {
     struct d3drm_mesh *mesh = impl_from_IDirect3DRMMesh(iface);
 
@@ -2843,7 +2859,19 @@ HRESULT d3drm_mesh_create(struct d3drm_mesh **mesh, IDirect3DRM *d3drm)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMMesh_iface.lpVtbl = &d3drm_mesh_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref = 1;
     object->d3drm = d3drm;
     IDirect3DRM_AddRef(object->d3drm);
@@ -2928,7 +2956,7 @@ static HRESULT WINAPI d3drm_wrap_DeleteDestroyCallback(IDirect3DRMWrap *iface,
     return d3drm_object_delete_destroy_callback(&wrap->obj, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, DWORD data)
+static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, LPVOID data)
 {
     struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
 
@@ -2939,7 +2967,7 @@ static HRESULT WINAPI d3drm_wrap_SetAppData(IDirect3DRMWrap *iface, DWORD data)
     return D3DRM_OK;
 }
 
-static DWORD WINAPI d3drm_wrap_GetAppData(IDirect3DRMWrap *iface)
+static LPVOID WINAPI d3drm_wrap_GetAppData(IDirect3DRMWrap *iface)
 {
     struct d3drm_wrap *wrap = impl_from_IDirect3DRMWrap(iface);
 
@@ -3029,7 +3057,19 @@ HRESULT d3drm_wrap_create(struct d3drm_wrap **wrap, IDirect3DRM *d3drm)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMWrap_iface.lpVtbl = &d3drm_wrap_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->ref = 1;
 
     d3drm_object_init(&object->obj, classname);
diff --git a/3rdparty/d3drm/texture.c b/3rdparty/d3drm/texture.c
index 09228372..f967dbae 100644
--- a/3rdparty/d3drm/texture.c
+++ b/3rdparty/d3drm/texture.c
@@ -421,7 +421,7 @@ static HRESULT WINAPI d3drm_texture1_DeleteDestroyCallback(IDirect3DRMTexture *i
     return IDirect3DRMTexture3_DeleteDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_texture1_SetAppData(IDirect3DRMTexture *iface, DWORD data)
+static HRESULT WINAPI d3drm_texture1_SetAppData(IDirect3DRMTexture *iface, LPVOID data)
 {
     struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
 
@@ -430,7 +430,7 @@ static HRESULT WINAPI d3drm_texture1_SetAppData(IDirect3DRMTexture *iface, DWORD
     return IDirect3DRMTexture3_SetAppData(&texture->IDirect3DRMTexture3_iface, data);
 }
 
-static DWORD WINAPI d3drm_texture1_GetAppData(IDirect3DRMTexture *iface)
+static LPVOID WINAPI d3drm_texture1_GetAppData(IDirect3DRMTexture *iface)
 {
     struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
 
@@ -730,7 +730,7 @@ static HRESULT WINAPI d3drm_texture2_DeleteDestroyCallback(IDirect3DRMTexture2 *
     return IDirect3DRMTexture3_DeleteDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_texture2_SetAppData(IDirect3DRMTexture2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_texture2_SetAppData(IDirect3DRMTexture2 *iface, LPVOID data)
 {
     struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
 
@@ -739,7 +739,7 @@ static HRESULT WINAPI d3drm_texture2_SetAppData(IDirect3DRMTexture2 *iface, DWOR
     return IDirect3DRMTexture3_SetAppData(&texture->IDirect3DRMTexture3_iface, data);
 }
 
-static DWORD WINAPI d3drm_texture2_GetAppData(IDirect3DRMTexture2 *iface)
+static LPVOID WINAPI d3drm_texture2_GetAppData(IDirect3DRMTexture2 *iface)
 {
     struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
 
@@ -1090,7 +1090,7 @@ static HRESULT WINAPI d3drm_texture3_DeleteDestroyCallback(IDirect3DRMTexture3 *
     return d3drm_object_delete_destroy_callback(&texture->obj, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_texture3_SetAppData(IDirect3DRMTexture3 *iface, DWORD data)
+static HRESULT WINAPI d3drm_texture3_SetAppData(IDirect3DRMTexture3 *iface, LPVOID data)
 {
     struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
 
@@ -1101,7 +1101,7 @@ static HRESULT WINAPI d3drm_texture3_SetAppData(IDirect3DRMTexture3 *iface, DWOR
     return D3DRM_OK;
 }
 
-static DWORD WINAPI d3drm_texture3_GetAppData(IDirect3DRMTexture3 *iface)
+static LPVOID WINAPI d3drm_texture3_GetAppData(IDirect3DRMTexture3 *iface)
 {
     struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
 
@@ -1467,9 +1467,21 @@ HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm)
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMTexture_iface.lpVtbl = &d3drm_texture1_vtbl;
     object->IDirect3DRMTexture2_iface.lpVtbl = &d3drm_texture2_vtbl;
     object->IDirect3DRMTexture3_iface.lpVtbl = &d3drm_texture3_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->d3drm = d3drm;
     object->max_colors = 8;
     object->max_shades = 16;
diff --git a/3rdparty/d3drm/viewport.c b/3rdparty/d3drm/viewport.c
index 821eb1ff..420e2f18 100644
--- a/3rdparty/d3drm/viewport.c
+++ b/3rdparty/d3drm/viewport.c
@@ -209,7 +209,7 @@ static HRESULT WINAPI d3drm_viewport1_DeleteDestroyCallback(IDirect3DRMViewport
     return d3drm_viewport2_DeleteDestroyCallback(&viewport->IDirect3DRMViewport2_iface, cb, ctx);
 }
 
-static HRESULT WINAPI d3drm_viewport2_SetAppData(IDirect3DRMViewport2 *iface, DWORD data)
+static HRESULT WINAPI d3drm_viewport2_SetAppData(IDirect3DRMViewport2 *iface, LPVOID data)
 {
     struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
 
@@ -219,7 +219,7 @@ static HRESULT WINAPI d3drm_viewport2_SetAppData(IDirect3DRMViewport2 *iface, DW
     return S_OK;
 }
 
-static HRESULT WINAPI d3drm_viewport1_SetAppData(IDirect3DRMViewport *iface, DWORD data)
+static HRESULT WINAPI d3drm_viewport1_SetAppData(IDirect3DRMViewport *iface, LPVOID data)
 {
     struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
 
@@ -228,7 +228,7 @@ static HRESULT WINAPI d3drm_viewport1_SetAppData(IDirect3DRMViewport *iface, DWO
     return d3drm_viewport2_SetAppData(&viewport->IDirect3DRMViewport2_iface, data);
 }
 
-static DWORD WINAPI d3drm_viewport2_GetAppData(IDirect3DRMViewport2 *iface)
+static LPVOID WINAPI d3drm_viewport2_GetAppData(IDirect3DRMViewport2 *iface)
 {
     struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport2(iface);
 
@@ -237,7 +237,7 @@ static DWORD WINAPI d3drm_viewport2_GetAppData(IDirect3DRMViewport2 *iface)
     return viewport->obj.appdata;
 }
 
-static DWORD WINAPI d3drm_viewport1_GetAppData(IDirect3DRMViewport *iface)
+static LPVOID WINAPI d3drm_viewport1_GetAppData(IDirect3DRMViewport *iface)
 {
     struct d3drm_viewport *viewport = impl_from_IDirect3DRMViewport(iface);
 
@@ -1136,8 +1136,20 @@ HRESULT d3drm_viewport_create(struct d3drm_viewport **viewport, IDirect3DRM *d3d
     if (!(object = calloc(1, sizeof(*object))))
         return E_OUTOFMEMORY;
 
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
+#elif defined(_MSC_VER)
+#pragma warning( push )
+#pragma warning( disable : 4090 )  /*  different 'const' qualifiers */
+#endif
     object->IDirect3DRMViewport_iface.lpVtbl = &d3drm_viewport1_vtbl;
     object->IDirect3DRMViewport2_iface.lpVtbl = &d3drm_viewport2_vtbl;
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning( pop )
+#endif
     object->d3drm = d3drm;
     d3drm_object_init(&object->obj, classname);
 
diff --git a/3rdparty/d3drm/wine/debug.h b/3rdparty/d3drm/wine/debug.h
index 910fab79..41cf8fb0 100644
--- a/3rdparty/d3drm/wine/debug.h
+++ b/3rdparty/d3drm/wine/debug.h
@@ -123,7 +123,7 @@ extern DECLSPEC_EXPORT int __cdecl __wine_dbg_header( enum __wine_debug_class cl
    quotes.  The string will be valid for some time, but not indefinitely
    as strings are re-used.  */
 
-#if (defined(__x86_64__) || (defined(__aarch64__) && __has_attribute(ms_abi))) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
+#if 0//(defined(__x86_64__) || (defined(__aarch64__) && __has_attribute(ms_abi))) && defined(__GNUC__) && defined(__WINE_USE_MSVCRT)
 # define __wine_dbg_cdecl __cdecl
 #else
 # define __wine_dbg_cdecl
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 16b416d7..9d2fd5c7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -42,7 +42,10 @@ else()
     # to add search paths.
     find_package(SDL3 CONFIG REQUIRED)
 
-    find_package(iniparser REQUIRED COMPONENTS static)
+    find_package(iniparser CONFIG COMPONENTS static)
+    if(NOT TARGET iniparser-static)
+        find_package(iniparser REQUIRED MODULE COMPONENTS static)
+    endif()
 endif()
 
 include(CheckCXXSourceCompiles)
@@ -57,12 +60,6 @@ if (ENABLE_CLANG_TIDY)
     set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_BIN}")
 endif()
 
-math(EXPR bits "8 * ${CMAKE_SIZEOF_VOID_P}")
-message(STATUS "Building ${bits}-bit LEGO Island")
-if (NOT bits EQUAL 32)
-    message(WARNING "Only 32-bit executables are supported")
-endif()
-
 set(MSVC_FOR_DECOMP FALSE)
 if (MSVC)
     # Visual C++ 4.2 -> cl version 10.2.0
@@ -122,11 +119,9 @@ add_cxx_warning(parentheses)
 
 add_library(DirectX5::DirectX5 INTERFACE IMPORTED)
 target_include_directories(DirectX5::DirectX5 INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/inc")
-if(ISLE_USE_DX5)
-    target_link_directories(DirectX5::DirectX5 INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/lib")
-endif()
+target_link_directories(DirectX5::DirectX5 INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/lib")
 
-add_subdirectory(3rdparty/d3drm)
+add_subdirectory(3rdparty/d3drm EXCLUDE_FROM_ALL)
 
 add_library(Vec::Vec INTERFACE IMPORTED)
 target_include_directories(Vec::Vec INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/vec")
@@ -452,7 +447,11 @@ if (MINGW)
 endif()
 
 if (MSVC)
-  target_sources(lego1 PRIVATE LEGO1/LegoOmni.def)
+  if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+    target_sources(lego1 PRIVATE LEGO1/LegoOmni.def)
+  else()
+    target_sources(lego1 PRIVATE LEGO1/LegoOmni64.def)
+  endif()
 else()
   target_sources(lego1 PRIVATE LEGO1/LegoOmni.mingw.def)
 endif()
@@ -465,9 +464,10 @@ target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/LEGO1/lego/legoomni
 target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/LEGO1/lego/legoomni/include/actions")
 
 # Link libraries
-target_link_libraries(lego1 PRIVATE tglrl viewmanager realtime mxdirectx roi geom anim Vec::Vec dxguid misc 3dmanager miniaudio omni)
+target_link_libraries(lego1 PRIVATE tglrl viewmanager realtime mxdirectx roi geom anim Vec::Vec dxguid d3drm_guid misc 3dmanager miniaudio omni)
 
 foreach(tgt IN LISTS lego1_targets)
+  target_include_directories(${tgt} PRIVATE $<$<BOOL:${ISLE_D3DRM_FROM_WINE}>:$<TARGET_PROPERTY:d3drm-wine,INTERFACE_INCLUDE_DIRECTORIES>>)
   target_link_libraries(${tgt} PRIVATE $<$<BOOL:${ISLE_USE_DX5}>:DirectX5::DirectX5> SDL3::SDL3)
   target_compile_definitions(${tgt} PRIVATE $<$<BOOL:${ISLE_USE_DX5}>:DIRECTX5_SDK>)
 endforeach()
@@ -494,6 +494,8 @@ if (ISLE_BUILD_APP)
   # Link DSOUND, WINMM, and LEGO1
   target_link_libraries(isle PRIVATE winmm lego1)
 
+  target_include_directories(isle PRIVATE $<$<BOOL:${ISLE_D3DRM_FROM_WINE}>:$<TARGET_PROPERTY:d3drm-wine,INTERFACE_INCLUDE_DIRECTORIES>>)
+
   # Make sure filenames are ALL CAPS
   set_property(TARGET isle PROPERTY OUTPUT_NAME ISLE)
   set_property(TARGET isle PROPERTY SUFFIX ".EXE")
diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp
index d70878ed..b6c62300 100644
--- a/ISLE/isleapp.cpp
+++ b/ISLE/isleapp.cpp
@@ -385,10 +385,11 @@ int SDL_AppEvent(void* appstate, const SDL_Event* event)
 		break;
 	}
 
+	// FIXME: use g_userEvent instead of SDL_EVENT_USER
 	if (event->type >= SDL_EVENT_USER && event->type <= SDL_EVENT_LAST - 1) {
 		switch (event->user.code) {
 		case WM_ISLE_SETCURSOR:
-			g_isle->SetupCursor((Cursor) (MxS32) event->user.data1);
+			g_isle->SetupCursor((Cursor) (uintptr_t) event->user.data1);
 			break;
 		}
 	}
diff --git a/LEGO1/LegoOmni.def b/LEGO1/LegoOmni.def
index 26c9e6b6..2807bea9 100644
--- a/LEGO1/LegoOmni.def
+++ b/LEGO1/LegoOmni.def
@@ -1,6 +1,6 @@
 ; LegoOmni.def : Declares the module paarameters for the LEGO1.DLL.
 
-DESCRIPTION  "Lego OMNI Windows Dynamic Link Library"
+; DESCRIPTION  "Lego OMNI Windows Dynamic Link Library"
 
 EXPORTS
 
diff --git a/LEGO1/LegoOmni64.def b/LEGO1/LegoOmni64.def
new file mode 100644
index 00000000..e0717e35
--- /dev/null
+++ b/LEGO1/LegoOmni64.def
@@ -0,0 +1,64 @@
+; LegoOmni64.def : Declares the module paarameters for the LEGO1.DLL.
+
+; DESCRIPTION  "Lego OMNI Windows Dynamic Link Library"
+
+EXPORTS
+
+; EXPORTs really required only.
+
+?SetCD@MxOmni@@SAXPEBD@Z
+?VariableTable@@YAPEAVMxVariableTable@@XZ
+?SetVariable@MxVariableTable@@QEAAXPEBD0@Z
+?CreateInstance@LegoOmni@@SAXXZ
+?TickleManager@@YAPEAVMxTickleManager@@XZ
+??1MxVideoParam@@QEAA@XZ
+?configureLegoModelPresenter@LegoModelPresenter@@SAXH@Z
+?SetHD@MxOmni@@SAXPEBD@Z
+?QueueEvent@LegoInputManager@@QEAAXW4NotificationId@@EJJE@Z
+?TransitionManager@@YAPEAVMxTransitionManager@@XZ
+??1MxString@@UEAA@XZ
+??0MxOmniCreateParam@@QEAA@PEBDPEAUHWND__@@AEAVMxVideoParam@@VMxOmniCreateFlags@@@Z
+?configureLegoAnimationManager@LegoAnimationManager@@SAXH@Z
+?GetCD@MxOmni@@SAPEBDXZ
+?configureLegoWorldPresenter@LegoWorldPresenter@@SAXH@Z
+?GameState@@YAPEAVLegoGameState@@XZ
+?Streamer@@YAPEAVMxStreamer@@XZ
+??1MxOmniCreateParam@@UEAA@XZ
+?configureLegoROI@LegoROI@@SAXH@Z
+?Lego@@YAPEAVLegoOmni@@XZ
+??0MxVideoParamFlags@@QEAA@XZ
+??0MxDSAction@@QEAA@XZ
+?VideoManager@@YAPEAVLegoVideoManager@@XZ
+?Timer@@YAPEAVMxTimer@@XZ
+?RemoveAll@ViewManager@@QEAAXPEAVViewROI@@@Z
+??4MxAtomId@@QEAAAEAV0@AEBV0@@Z
+?Enable@MxBackgroundAudioManager@@QEAAXE@Z
+?SetDeviceName@MxVideoParam@@QEAAXPEAD@Z
+??0MxVideoParam@@QEAA@XZ
+?SetSavePath@LegoGameState@@QEAAXPEAD@Z
+?MoveCursor@LegoVideoManager@@QEAAXHH@Z
+?SetWaitIndicator@MxTransitionManager@@QEAAXPEAVMxVideoPresenter@@@Z
+?Save@LegoGameState@@QEAAJK@Z
+??1MxDSAction@@UEAA@XZ
+?RemoveWorld@LegoOmni@@QEAAXAEBVMxAtomId@@J@Z
+?GetPrimaryBitDepth@MxDirectDraw@@SAHXZ
+?CreateBackgroundAudio@LegoOmni@@QEAAXXZ
+?SerializePlayersInfo@LegoGameState@@QEAAXF@Z
+?GetInstance@LegoOmni@@SAPEAV1@XZ
+?BackgroundAudioManager@@YAPEAVMxBackgroundAudioManager@@XZ
+?configureLegoPartPresenter@LegoPartPresenter@@SAXHH@Z
+?EnableRMDevice@LegoVideoManager@@QEAAHXZ
+?GetRealTime@MxTimer@@QEAAJXZ
+?SetAtomId@MxDSObject@@UEAAXVMxAtomId@@@Z
+?DestroyInstance@MxOmni@@SAXXZ
+?InputManager@@YAPEAVLegoInputManager@@XZ
+?Open@MxStreamer@@QEAAPEAVMxStreamController@@PEBDG@Z
+?Start@@YAJPEAVMxDSAction@@@Z
+??4MxVideoParam@@QEAAAEAV0@AEBV0@@Z
+?EnableFullScreenMovie@LegoVideoManager@@QEAAXEE@Z
+?configureLegoBuildingManager@LegoBuildingManager@@SAXH@Z
+?SerializeScoreHistory@LegoGameState@@QEAAXF@Z
+?Close@MxStreamer@@QEAAJPEBD@Z
+??0MxOmniCreateFlags@@QEAA@XZ
+??1MxAtomId@@QEAA@XZ
+?SetSound3D@MxOmni@@SAXE@Z
diff --git a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
index f5abb3c8..fa136321 100644
--- a/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoanimationmanager.cpp
@@ -2954,7 +2954,7 @@ MxResult AnimState::Serialize(LegoFile* p_file)
 MxBool AnimState::SetFlag()
 {
 	if (m_unk0x10 != NULL) {
-		m_extraCharacterId = NULL;
+		m_extraCharacterId = 0;
 
 		for (MxS32 i = 0; i < m_unk0x0c; i++) {
 			m_unk0x10[i] = 0;
diff --git a/LEGO1/lego/legoomni/src/common/legotextureinfo.cpp b/LEGO1/lego/legoomni/src/common/legotextureinfo.cpp
index 51775a03..d141dd8c 100644
--- a/LEGO1/lego/legoomni/src/common/legotextureinfo.cpp
+++ b/LEGO1/lego/legoomni/src/common/legotextureinfo.cpp
@@ -127,7 +127,7 @@ LegoTextureInfo* LegoTextureInfo::Create(const char* p_name, LegoTexture* p_text
 		goto done;
 	}
 
-	textureInfo->m_texture->SetAppData((DWORD) textureInfo);
+	textureInfo->m_texture->SetAppData((LPD3DRM_APPDATA) textureInfo);
 	return textureInfo;
 
 done:
diff --git a/LEGO1/lego/legoomni/src/main/legomain.cpp b/LEGO1/lego/legoomni/src/main/legomain.cpp
index 62a927ff..5f9d5157 100644
--- a/LEGO1/lego/legoomni/src/main/legomain.cpp
+++ b/LEGO1/lego/legoomni/src/main/legomain.cpp
@@ -501,7 +501,8 @@ MxAtomId* LegoOmni::GetWorldAtom(MxU32 p_id)
 MxS32 LegoOmni::GetWorldId(const char* p_key)
 {
 	for (MxS32 i = 0; i < 19; i++) {
-		if ((MxS32) &m_worlds[i] != -4 && !strcmpi(m_worlds[i].GetKey(), p_key)) {
+		// FIXME: this looks very fishy. Is this guarding against out-of-bounds access?
+		if ((MxS32*) &m_worlds[i] != (MxS32*) -4 && !strcmpi(m_worlds[i].GetKey(), p_key)) {
 			return m_worlds[i].GetId();
 		}
 	}
diff --git a/LEGO1/lego/sources/misc/legocontainer.cpp b/LEGO1/lego/sources/misc/legocontainer.cpp
index d9bdc0eb..34dccc26 100644
--- a/LEGO1/lego/sources/misc/legocontainer.cpp
+++ b/LEGO1/lego/sources/misc/legocontainer.cpp
@@ -92,7 +92,7 @@ LegoTextureInfo* LegoTextureContainer::GetCached(LegoTextureInfo* p_textureInfo)
 				return NULL;
 			}
 			else {
-				textureInfo->m_texture->SetAppData((DWORD) textureInfo);
+				textureInfo->m_texture->SetAppData((LPD3DRM_APPDATA) textureInfo);
 				m_cached.push_back(LegoCachedTexture(textureInfo, TRUE));
 
 				textureInfo->m_texture->AddRef();
diff --git a/LEGO1/mxdirectx/mxdirect3d.cpp b/LEGO1/mxdirectx/mxdirect3d.cpp
index 8e4a94e8..d1f23abd 100644
--- a/LEGO1/mxdirectx/mxdirect3d.cpp
+++ b/LEGO1/mxdirectx/mxdirect3d.cpp
@@ -1014,6 +1014,7 @@ int MxDeviceEnumerate::SupportsMMX()
 	}
 	int supports_mmx;
 #ifdef _MSC_VER
+#if defined(_M_IX86)
 	__asm {
 			mov eax, 0x0            ; EAX=0: Highest Function Parameter and Manufacturer ID
 #if _MSC_VER > 1100
@@ -1034,6 +1035,11 @@ int MxDeviceEnumerate::SupportsMMX()
 			adc eax, eax            ; Add with carry: EAX = EAX + EAX + CF = CF
 			mov supports_mmx, eax   ; Save eax into C variable
 	}
+#elif defined(_M_IX64)
+	supports_mmx = 1;
+#else
+	supports_mmx = 0;
+#endif
 #else
 	__asm__("movl $0x0, %%eax\n\t"  // EAX=0: Highest Function Parameter and Manufacturer ID
 			"cpuid\n\t"             // Run CPUID\n"
diff --git a/LEGO1/omni/src/stream/mxdsbuffer.cpp b/LEGO1/omni/src/stream/mxdsbuffer.cpp
index e5e69c55..b1f4e92e 100644
--- a/LEGO1/omni/src/stream/mxdsbuffer.cpp
+++ b/LEGO1/omni/src/stream/mxdsbuffer.cpp
@@ -353,7 +353,7 @@ MxU8* MxDSBuffer::SkipToData()
 			case FOURCC('M', 'x', 'O', 'b'):
 			case FOURCC('M', 'x', 'C', 'h'):
 				result = m_pIntoBuffer;
-				m_pIntoBuffer = (MxU8*) ((ptr[1] & 1) + ptr[1] + (MxU32) ptr);
+				m_pIntoBuffer = (MxU8*) ptr + ((ptr[1] & 1) + ptr[1]);
 				m_pIntoBuffer = (MxU8*) ((MxU32*) m_pIntoBuffer + 2);
 				if (m_pBuffer + (m_writeOffset - 8) < m_pIntoBuffer) {
 					m_pIntoBuffer2 = result;
@@ -366,7 +366,7 @@ MxU8* MxDSBuffer::SkipToData()
 				m_pIntoBuffer = (MxU8*) (ptr + 2);
 				break;
 			case FOURCC('M', 'x', 'H', 'd'):
-				m_pIntoBuffer = (MxU8*) ((MxU32) ptr + ptr[1] + 8);
+				m_pIntoBuffer = (MxU8*) ptr + (ptr[1] + 8);
 				break;
 			default:
 				m_pIntoBuffer = NULL;
@@ -460,7 +460,7 @@ MxU8* MxDSBuffer::FUN_100c6fa0(MxU8* p_data)
 			if (current != p_data) {
 				return current;
 			}
-			current = ((MxU32) current & 1) + current;
+			current += ((uintptr_t) current) & 1;
 			current += 8;
 			break;
 		case FOURCC('M', 'x', 'H', 'd'):