From 201364a44f37c4b54a3261693fc2fa9402092792 Mon Sep 17 00:00:00 2001 From: Unixian <48267798+notunixian@users.noreply.github.com> Date: Fri, 17 Jan 2025 02:15:42 -0500 Subject: [PATCH 1/4] general fixups --- dlls/AcpHal/AcpHal.cpp | 15 +- dlls/MMDevAPI/Exports.def | 10 +- dlls/MMDevAPI/MMDevAPI.cpp | 80 +-- dlls/d3d11_x/IDXGIFactoryWrapper.cpp | 26 +- dlls/d3d11_x/IDXGISwapChainWrapper.cpp | 10 +- dlls/d3d11_x/d3d11_x.vcxproj | 3 +- dlls/kernelx/CoreApplicationWrapperX.cpp | 9 +- dlls/kernelx/dllmain.cpp | 103 +--- dlls/kernelx/hooks.h | 226 +++++++-- dlls/mfplat/Exports.def | 12 - dlls/mfplat/dllmain.cpp | 474 +++++++++++++++++- dlls/mfplat/framework.h | 5 - dlls/mfplat/mfplat.asm | 7 + dlls/mfplat/mfplat.cpp | 68 --- dlls/mfplat/mfplat.def | 142 ++++++ dlls/mfplat/mfplat.vcxproj | 27 +- dlls/mfplat/mfplat.vcxproj.filters | 11 +- dlls/mfplat/pch.cpp | 5 - dlls/mfplat/pch.h | 13 - ...alTimeActivity.RealTimeActivityService.cpp | 2 +- ...icrosoft.Xbox.Services.XboxLiveContext.cpp | 4 +- ...ws.Xbox.ApplicationModel.Store.Product.cpp | 2 - symlink.ps1 | 2 +- 23 files changed, 896 insertions(+), 360 deletions(-) delete mode 100644 dlls/mfplat/Exports.def delete mode 100644 dlls/mfplat/framework.h create mode 100644 dlls/mfplat/mfplat.asm delete mode 100644 dlls/mfplat/mfplat.cpp create mode 100644 dlls/mfplat/mfplat.def delete mode 100644 dlls/mfplat/pch.cpp delete mode 100644 dlls/mfplat/pch.h diff --git a/dlls/AcpHal/AcpHal.cpp b/dlls/AcpHal/AcpHal.cpp index 35c9501..3f471bb 100644 --- a/dlls/AcpHal/AcpHal.cpp +++ b/dlls/AcpHal/AcpHal.cpp @@ -16,8 +16,19 @@ HRESULT AcpHalReleaseShapeContexts_X() { return 0; } -HRESULT ApuAlloc_X(void* ptr, void* a2, size_t size, UINT32 alignment) { - ptr = malloc(size); +HRESULT ApuAlloc_X( + void** virtualAddress, + UINT32* physicalAddress, + UINT32 sizeInBytes, + UINT32 alignmentInBytes, + UINT32 flags +) +{ + *virtualAddress = malloc(sizeInBytes); + + if (physicalAddress != nullptr) + *physicalAddress = 0; + return 0; } diff --git a/dlls/MMDevAPI/Exports.def b/dlls/MMDevAPI/Exports.def index aee671e..6513d47 100644 --- a/dlls/MMDevAPI/Exports.def +++ b/dlls/MMDevAPI/Exports.def @@ -1,7 +1,7 @@ LIBRARY MMDevAPI EXPORTS - ActivateAudioInterfaceAsync = ActivateAudioInterfaceAsync_X - DllCanUnloadNow = DllCanUnloadNow_X - DllGetClassObject = DllGetClassObject_X - RefreshWasapiDeviceList = RefreshWasapiDeviceList_X - SetWasapiThreadAffinityMask = SetWasapiThreadAffinityMask_X + RestoreBitstreamOut = RestoreBitstreamOut_X + DisableBitstreamOut = DisableBitstreamOut_X + EnableSpatialAudio = EnableSpatialAudio_X + SetWasapiThreadAffinityMask = SetWasapiThreadAffinityMask_X + RefreshWasapiDeviceList = RefreshWasapiDeviceList_X diff --git a/dlls/MMDevAPI/MMDevAPI.cpp b/dlls/MMDevAPI/MMDevAPI.cpp index 05834f9..df85a88 100644 --- a/dlls/MMDevAPI/MMDevAPI.cpp +++ b/dlls/MMDevAPI/MMDevAPI.cpp @@ -1,42 +1,52 @@ #include "pch.h" #include "framework.h" -void ActivateAudioInterfaceAsync_X() -{ +#define MMDEVAPI_EXPORT(Name) __pragma(comment(linker, "/export:" #Name "=C:\\WINDOWS\\System32\\MMDevAPI." #Name)) +#define MMDEVAPI_EXPORT_ORDINAL(Name, Ordinal) __pragma(comment(linker, "/export:" #Name "=C:\\WINDOWS\\System32\\MMDevAPI." #Name ",@" #Ordinal)) +#define MMDEVAPI_EXPORT_ORDINAL_PRIVATE(Name, Ordinal) __pragma(comment(linker, "/export:" #Name "=C:\\WINDOWS\\System32\\MMDevAPI.#" #Ordinal ",@" #Ordinal ",NONAME")) -} +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(CleanupDeviceAPI, 2) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(InitializeDeviceAPI, 3) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(MMDeviceCreateRegistryPropertyStore, 4) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(MMDeviceGetDeviceEnumerator, 5) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(MMDeviceGetEndpointManager, 6) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GetClassFromEndpointId, 7) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GetEndpointGuidFromEndpointId, 8) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GetSessionIdFromEndpointId, 9) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(RegisterForMediaCallback, 10) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(UnregisterMediaCallback, 11) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GenerateMediaEvent, 12) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(AETraceOutputDebugString, 13) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(MMDeviceGetPolicyConfig, 14) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(FlushDeviceTopologyCache, 15) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GetNeverSetAsDefaultProperty, 16) +MMDEVAPI_EXPORT_ORDINAL(ActivateAudioInterfaceAsync, 17) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GetEndpointIdFromDeviceInterfaceId, 18) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevFindMmDevProperty, 19) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInterfacePropertyStore, 20) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInterfaceIdFromMMDevice, 21) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInterfaceDataFlow, 22) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetMMDeviceFromInterfaceId, 23) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInterfaceClassGuid, 24) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetMMDeviceIdFromInterfaceId, 25) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInstanceIdFromInterfaceId, 26) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetRelatedInterfaceId, 27) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInterfaceIdFromMMDeviceId, 28) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetInstanceIdFromMMDeviceId, 29) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetEndpointFormFactorFromMMDeviceId, 30) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(mmdDevGetDeviceIdFromPnpInterface, 31) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(GetCategoryPath, 32) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(MMDeviceCreateRegistryPropertyStore2, 33) +MMDEVAPI_EXPORT_ORDINAL_PRIVATE(MMDeviceCreateAudioSystemEffectsPropertyStore, 34) +MMDEVAPI_EXPORT_ORDINAL(DllCanUnloadNow, 35) +MMDEVAPI_EXPORT_ORDINAL(DllGetClassObject, 36) +MMDEVAPI_EXPORT_ORDINAL(DllRegisterServer, 37) +MMDEVAPI_EXPORT_ORDINAL(DllUnregisterServer, 38) -void DisableBitstreamOut_X() -{ -} +void DisableBitstreamOut_X( ) {} +HRESULT EnableSpatialAudio_X( ) { return S_OK; } +void RestoreBitstreamOut_X( ) {} +DWORD_PTR SetWasapiThreadAffinityMask_X(DWORD_PTR dwThreadAffinityMask) { return 0; } +void RefreshWasapiDeviceList_X() {} -void DllCanUnloadNow_X() -{ - -} - -void DllGetClassObject_X() -{ - -} - -void EnableSpatialAudio_X() -{ - -} - -void RefreshWasapiDeviceList_X() -{ - -} - -void RestoreBitstreamOut_X() -{ - -} - -void SetWasapiThreadAffinityMask_X() -{ - -} \ No newline at end of file diff --git a/dlls/d3d11_x/IDXGIFactoryWrapper.cpp b/dlls/d3d11_x/IDXGIFactoryWrapper.cpp index 91e79db..e39e1b7 100644 --- a/dlls/d3d11_x/IDXGIFactoryWrapper.cpp +++ b/dlls/d3d11_x/IDXGIFactoryWrapper.cpp @@ -134,6 +134,12 @@ namespace d3d11x pDesc->Flags &= DXGI_SWAPCHAIN_FLAG_MASK; pDesc->Scaling = DXGI_SCALING_ASPECT_RATIO_STRETCH; + ::ID3D11Device2* device; + pDevice->QueryInterface(__uuidof(ID3D11Device), reinterpret_cast(&device)); + device = reinterpret_cast(device)->m_realDevice; + + device->CheckMultisampleQualityLevels(pDesc->Format, pDesc->SampleDesc.Count, &pDesc->SampleDesc.Quality); + if (pWindow == nullptr) { ComPtr coreWindowStatic; @@ -154,18 +160,18 @@ namespace d3d11x *ppSwapChain = new IDXGISwapChainWrapper(swap); } - if (WinDurango::g_Overlay == nullptr) - { - ::ID3D11Device2* device; - pDevice->QueryInterface(__uuidof(ID3D11Device), reinterpret_cast(&device)); - device = reinterpret_cast(device)->m_realDevice; + //if (WinDurango::g_Overlay == nullptr) + //{ + // ::ID3D11Device2* device; + // pDevice->QueryInterface(__uuidof(ID3D11Device), reinterpret_cast(&device)); + // device = reinterpret_cast(device)->m_realDevice; - ::ID3D11DeviceContext* ctx{}; - device->GetImmediateContext(&ctx); + // ::ID3D11DeviceContext* ctx{}; + // device->GetImmediateContext(&ctx); - WinDurango::g_Overlay = new WinDurango::Overlay(device, ctx, reinterpret_cast(*ppSwapChain)->m_realSwapchain); - WinDurango::g_Overlay->Initialize( ); - } + // WinDurango::g_Overlay = new WinDurango::Overlay(device, ctx, reinterpret_cast(*ppSwapChain)->m_realSwapchain); + // WinDurango::g_Overlay->Initialize( ); + //} return hr; } diff --git a/dlls/d3d11_x/IDXGISwapChainWrapper.cpp b/dlls/d3d11_x/IDXGISwapChainWrapper.cpp index 4e06ef5..a93c0e1 100644 --- a/dlls/d3d11_x/IDXGISwapChainWrapper.cpp +++ b/dlls/d3d11_x/IDXGISwapChainWrapper.cpp @@ -94,8 +94,8 @@ namespace d3d11x HRESULT __stdcall IDXGISwapChainWrapper::Present(UINT SyncInterval, UINT Flags) { - WinDurango::g_Overlay->Present( ); - return m_realSwapchain->Present(SyncInterval, Flags); + //WinDurango::g_Overlay->Present( ); + return m_realSwapchain->Present(0, Flags); } HRESULT __stdcall IDXGISwapChainWrapper::GetBuffer(UINT Buffer, REFIID riid, void** ppSurface) @@ -175,14 +175,14 @@ namespace d3d11x HRESULT __stdcall IDXGISwapChainWrapper::Present1(UINT SyncInterval, UINT PresentFlags, const DXGI_PRESENT_PARAMETERS* pPresentParameters) { - WinDurango::g_Overlay->Present( ); + //WinDurango::g_Overlay->Present( ); if (pPresentParameters == nullptr) { //fps60.sleep( ); - return m_realSwapchain->Present(SyncInterval, PresentFlags); + return m_realSwapchain->Present(0, PresentFlags); } - return m_realSwapchain->Present1(SyncInterval, PresentFlags, pPresentParameters); + return m_realSwapchain->Present1(0, PresentFlags, pPresentParameters); } BOOL __stdcall IDXGISwapChainWrapper::IsTemporaryMonoSupported(void) diff --git a/dlls/d3d11_x/d3d11_x.vcxproj b/dlls/d3d11_x/d3d11_x.vcxproj index b7b6e63..4ad3679 100644 --- a/dlls/d3d11_x/d3d11_x.vcxproj +++ b/dlls/d3d11_x/d3d11_x.vcxproj @@ -79,6 +79,7 @@ true Use pch.h + stdcpp17 Windows @@ -86,7 +87,7 @@ true true false - d3d11.lib;%(AdditionalDependencies);runtimeobject.lib + d3d10.lib;d3d11.lib;dxgi.lib;%(AdditionalDependencies);runtimeobject.lib Exports.def diff --git a/dlls/kernelx/CoreApplicationWrapperX.cpp b/dlls/kernelx/CoreApplicationWrapperX.cpp index 04d395e..fb37d3d 100644 --- a/dlls/kernelx/CoreApplicationWrapperX.cpp +++ b/dlls/kernelx/CoreApplicationWrapperX.cpp @@ -116,19 +116,22 @@ HRESULT CoreApplicationWrapperX::QueryInterface(const IID& riid, void** ppvObjec AddRef(); return S_OK; } - else if (riid == __uuidof(ICoreApplicationX)) + + if (riid == __uuidof(ICoreApplicationX)) { *ppvObject = static_cast(this); AddRef(); return S_OK; } - else if (riid == __uuidof(ICoreApplicationResourceAvailabilityX)) // allow ICoreApplicationResourceAvailabilityX interface + + if (riid == __uuidof(ICoreApplicationResourceAvailabilityX)) // allow ICoreApplicationResourceAvailabilityX interface { *ppvObject = static_cast(this); AddRef(); return S_OK; } - else if (riid == __uuidof(ICoreApplicationGpuPolicy)) // allow ICoreApplicationResourceAvailabilityX interface + + if (riid == __uuidof(ICoreApplicationGpuPolicy)) // allow ICoreApplicationResourceAvailabilityX interface { *ppvObject = static_cast(this); AddRef(); diff --git a/dlls/kernelx/dllmain.cpp b/dlls/kernelx/dllmain.cpp index daa9ad7..1246049 100644 --- a/dlls/kernelx/dllmain.cpp +++ b/dlls/kernelx/dllmain.cpp @@ -5,16 +5,12 @@ #include // note from unixian: i used this since using appxlauncher requires me attaching to the game after it launches -#define WINDURANGO_WAIT_FOR_DEBUGGER 0 +#define WINDURANGO_WAIT_FOR_DEBUGGER 1 //Rodrigo Todescatto: For debbuging Forza. #define RETURN_IF_FAILED(hr) if (FAILED(hr)) return hr #define FORZADEBUG -#define RETURN_HR(hr) return hr -#define RETURN_LAST_ERROR_IF(cond) if (cond) return HRESULT_FROM_WIN32(GetLastError()) - - std::vector loadedMods; inline void LoadMods() @@ -73,89 +69,6 @@ inline void UnLoadMods() FreeLibrary(mod); } } - - - - -inline HRESULT WINAPI GetActivationFactoryRedirect(PCWSTR str, REFIID riid, void** ppFactory) -{ - HRESULT hr; - HSTRING className; - HSTRING_HEADER classNameHeader; - - if (FAILED(hr = WindowsCreateStringReference(str, wcslen(str), &classNameHeader, &className))) - return hr; - - //printf("GetActivationFactoryRedirect: %S\n", str); - - hr = RoGetActivationFactory_Hook(className, riid, ppFactory); - WindowsDeleteString(className); - return hr; -} - -HRESULT XWineGetImport(_In_opt_ HMODULE Module, _In_ HMODULE ImportModule, _In_ LPCSTR Import, _Out_ PIMAGE_THUNK_DATA * pThunk) -{ - if (ImportModule == nullptr) - RETURN_HR(E_INVALIDARG); - - if (pThunk == nullptr) - RETURN_HR(E_POINTER); - - if (Module == nullptr) - Module = GetModuleHandleW(nullptr); - - auto dosHeader = (PIMAGE_DOS_HEADER)Module; - auto ntHeaders = (PIMAGE_NT_HEADERS)((PBYTE)Module + dosHeader->e_lfanew); - auto directory = &ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; - auto peImports = (PIMAGE_IMPORT_DESCRIPTOR)((PBYTE)Module + directory->VirtualAddress); - - for (size_t i = 0; peImports[i].Name; i++) - { - if (GetModuleHandleA((LPCSTR)((PBYTE)Module + peImports[i].Name)) != ImportModule) - continue; - - auto iatThunks = (PIMAGE_THUNK_DATA)((PBYTE)Module + peImports[i].FirstThunk); - auto intThunks = (PIMAGE_THUNK_DATA)((PBYTE)Module + peImports[i].OriginalFirstThunk); - - for (size_t j = 0; intThunks[j].u1.AddressOfData; j++) - { - if ((intThunks[j].u1.AddressOfData & IMAGE_ORDINAL_FLAG) != 0) - { - if (!IS_INTRESOURCE(Import)) - continue; - - if (((intThunks[j].u1.Ordinal & ~IMAGE_ORDINAL_FLAG) == (ULONG_PTR)Import)) - { - *pThunk = &iatThunks[j]; - return S_OK; - } - - continue; - } - - if (strcmp(((PIMAGE_IMPORT_BY_NAME)((PBYTE)Module + intThunks[j].u1.AddressOfData))->Name, Import)) - continue; - - *pThunk = &iatThunks[j]; - return S_OK; - } - } - - *pThunk = nullptr; - return (E_FAIL); -} - -HRESULT XWinePatchImport(_In_opt_ HMODULE Module, _In_ HMODULE ImportModule, _In_ PCSTR Import, _In_ PVOID Function) -{ - DWORD protect; - PIMAGE_THUNK_DATA pThunk; - RETURN_IF_FAILED(XWineGetImport(Module, ImportModule, Import, &pThunk)); - RETURN_LAST_ERROR_IF(!VirtualProtect(&pThunk->u1.Function, sizeof(ULONG_PTR), PAGE_READWRITE, &protect)); - pThunk->u1.Function = (ULONG_PTR)Function; - RETURN_LAST_ERROR_IF(!VirtualProtect(&pThunk->u1.Function, sizeof(ULONG_PTR), protect, &protect)); - return S_OK; -} - BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID reserved) { winrt::hstring GamePackage = winrt::Windows::ApplicationModel::Package::Current().Id().FamilyName(); @@ -227,18 +140,8 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID reserved) // games uses different vccorlib versions so just HardCoding vccorlib140 won't work // so we can just check if any of corlib modules are loaded and use that // (add more of them as we find in games) - std::array modules = { L"vccorlib140.dll", L"vccorlib110.dll", L"vccorlib120.dll" }; - HMODULE hModule = nullptr; - for (auto& module : modules) - { - hModule = GetModuleHandleW(module); - if (hModule != nullptr) - { - break; - } - } - XWinePatchImport(GetModuleHandleW(nullptr), hModule, "?GetActivationFactoryByPCWSTR@@YAJPEAXAEAVGuid@Platform@@PEAPEAX@Z", GetActivationFactoryRedirect); + XWinePatchImport(GetModuleHandleW(nullptr), GetRuntimeModule(), "?GetActivationFactoryByPCWSTR@@YAJPEAXAEAVGuid@Platform@@PEAPEAX@Z", GetActivationFactoryRedirect); DetourAttach(&reinterpret_cast(TrueOpenFile), OpenFile_Hook); DetourAttach(&reinterpret_cast(TrueCreateFileW), CreateFileW_Hook); @@ -247,6 +150,8 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID reserved) DetourAttach(&reinterpret_cast(TrueFindFirstFileW), FindFirstFileW_Hook); DetourAttach(&reinterpret_cast(TrueDeleteFileW), DeleteFileW_Hook); //DetourAttach(&reinterpret_cast(TrueLoadLibraryExW), LoadLibraryExW_Hook); + DetourAttach(&reinterpret_cast(TrueLoadLibraryW), LoadLibraryW_Hook); + DetourAttach(&reinterpret_cast(TrueLoadLibraryExA), LoadLibraryExA_Hook); DetourTransactionCommit(); diff --git a/dlls/kernelx/hooks.h b/dlls/kernelx/hooks.h index ca1865c..328816c 100644 --- a/dlls/kernelx/hooks.h +++ b/dlls/kernelx/hooks.h @@ -7,6 +7,9 @@ #include "CurrentAppWrapper.hpp" +#define RETURN_HR(hr) return hr +#define RETURN_LAST_ERROR_IF(cond) if (cond) return HRESULT_FROM_WIN32(GetLastError()) + /* This function is used to compare the class name of the classId with the classIdName. */ inline bool IsClassName(HSTRING classId, const char* classIdName) { @@ -17,6 +20,28 @@ inline bool IsClassName(HSTRING classId, const char* classIdName) return (classIdStringUTF8 == classIdName); } +HMODULE GetRuntimeModule() +{ + std::array modules = { L"vccorlib140.dll", L"vccorlib110.dll", L"vccorlib120.dll" }; + static HMODULE hModule = nullptr; + if (hModule != nullptr) + { + return hModule; + } + + for (auto& module : modules) + { + hModule = GetModuleHandleW(module); + if (hModule != nullptr) + { + break; + } + } + + return hModule; +} + +HRESULT WINAPI GetActivationFactoryRedirect(PCWSTR str, REFIID riid, void** ppFactory); /* Function pointers for the DllGetForCurrentThread */ typedef HRESULT(*DllGetForCurrentThreadFunc) (ICoreWindowStatic*, CoreWindow**); /* Function pointers for the DllGetForCurrentThread */ @@ -27,6 +52,7 @@ HRESULT(STDMETHODCALLTYPE* TrueGetForCurrentThread)(ICoreWindowStatic* staticWin typedef HRESULT(*DllGetActivationFactoryFunc) (HSTRING, IActivationFactory**); /* Function pointers for the DllGetActivationFactory */ DllGetActivationFactoryFunc pDllGetActivationFactory = nullptr; +DllGetActivationFactoryFunc pMediaDllGetActivationFactory = nullptr; /* Function pointers for the WinRT RoGetActivationFactory function. */ HRESULT(WINAPI* TrueRoGetActivationFactory)(HSTRING classId, REFIID iid, void** factory) = RoGetActivationFactory; @@ -53,6 +79,81 @@ HRESULT(STDMETHODCALLTYPE* TrueGetLicenseInformation)( ABI::Windows::ApplicationModel::Store::ILicenseInformation** value ) = nullptr; +HRESULT XWineGetImport(_In_opt_ HMODULE Module, _In_ HMODULE ImportModule, _In_ LPCSTR Import, _Out_ PIMAGE_THUNK_DATA* pThunk) +{ + if (ImportModule == nullptr) + RETURN_HR(E_INVALIDARG); + + if (pThunk == nullptr) + RETURN_HR(E_POINTER); + + if (Module == nullptr) + Module = GetModuleHandleW(nullptr); + + auto dosHeader = (PIMAGE_DOS_HEADER)Module; + auto ntHeaders = (PIMAGE_NT_HEADERS)((PBYTE)Module + dosHeader->e_lfanew); + auto directory = &ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]; + + if (directory->VirtualAddress == 0) + RETURN_HR(E_FAIL); + + auto peImports = (PIMAGE_IMPORT_DESCRIPTOR)((PBYTE)Module + directory->VirtualAddress); + + for (size_t i = 0; peImports[i].Name; i++) + { + if (GetModuleHandleA((LPCSTR)((PBYTE)Module + peImports[i].Name)) != ImportModule) + continue; + + auto iatThunks = (PIMAGE_THUNK_DATA)((PBYTE)Module + peImports[i].FirstThunk); + auto intThunks = (PIMAGE_THUNK_DATA)((PBYTE)Module + peImports[i].OriginalFirstThunk); + + for (size_t j = 0; intThunks[j].u1.AddressOfData; j++) + { + if ((intThunks[j].u1.AddressOfData & IMAGE_ORDINAL_FLAG) != 0) + { + if (!IS_INTRESOURCE(Import)) + continue; + + if (((intThunks[j].u1.Ordinal & ~IMAGE_ORDINAL_FLAG) == (ULONG_PTR)Import)) + { + *pThunk = &iatThunks[j]; + return S_OK; + } + + continue; + } + + if (strcmp(((PIMAGE_IMPORT_BY_NAME)((PBYTE)Module + intThunks[j].u1.AddressOfData))->Name, Import)) + continue; + + *pThunk = &iatThunks[j]; + return S_OK; + } + } + + *pThunk = nullptr; + return (E_FAIL); +} + +HRESULT XWinePatchImport(_In_opt_ HMODULE Module, _In_ HMODULE ImportModule, _In_ PCSTR Import, _In_ PVOID Function) +{ + DWORD protect; + PIMAGE_THUNK_DATA pThunk; + RETURN_IF_FAILED(XWineGetImport(Module, ImportModule, Import, &pThunk)); + RETURN_LAST_ERROR_IF(!VirtualProtect(&pThunk->u1.Function, sizeof(ULONG_PTR), PAGE_READWRITE, &protect)); + pThunk->u1.Function = (ULONG_PTR)Function; + RETURN_LAST_ERROR_IF(!VirtualProtect(&pThunk->u1.Function, sizeof(ULONG_PTR), protect, &protect)); + return S_OK; +} + +HRESULT PatchNeededImports(_In_opt_ HMODULE Module, _In_ HMODULE ImportModule, _In_ PCSTR Import, _In_ PVOID Function) +{ + PIMAGE_THUNK_DATA pThunk; + RETURN_IF_FAILED(XWineGetImport(Module, ImportModule, Import, &pThunk)); + + return XWinePatchImport(Module, ImportModule, Import, Function); +} + HMODULE WINAPI LoadLibraryExW_X(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { printf("LoadLibraryExW_X: %S\n", lpLibFileName); @@ -85,8 +186,9 @@ HMODULE WINAPI LoadLibraryExW_X(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw } } - - return LoadLibraryExW(lpLibFileName, hFile, dwFlags); + HMODULE mod = LoadLibraryExW(lpLibFileName, hFile, dwFlags); + PatchNeededImports(mod, GetRuntimeModule(), "?GetActivationFactoryByPCWSTR@@YAJPEAXAEAVGuid@Platform@@PEAPEAX@Z", GetActivationFactoryRedirect); + return mod; } @@ -146,6 +248,8 @@ HMODULE WINAPI LoadLibraryExA_Hook(LPCSTR lpLibFileName, _Reserved_ HANDLE hFile { printf("LoadLibraryExA_Hook failed: %d\n", GetLastError()); } + + PatchNeededImports(result, GetRuntimeModule(), "?GetActivationFactoryByPCWSTR@@YAJPEAXAEAVGuid@Platform@@PEAPEAX@Z", GetActivationFactoryRedirect); return result; } @@ -169,7 +273,9 @@ HMODULE WINAPI LoadLibraryW_Hook(LPCWSTR lpLibFileName) } //printf("LoadLibraryW_Hook: %ls\n", lpLibFileName); - return TrueLoadLibraryW(lpLibFileName); + HMODULE result = TrueLoadLibraryW(lpLibFileName); + PatchNeededImports(result, GetRuntimeModule(), "?GetActivationFactoryByPCWSTR@@YAJPEAXAEAVGuid@Platform@@PEAPEAX@Z", GetActivationFactoryRedirect); + return result; } HFILE WINAPI OpenFile_Hook(LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle) { @@ -276,69 +382,85 @@ inline HRESULT WINAPI RoGetActivationFactory_Hook(HSTRING classId, REFIID iid, v DetourTransactionCommit(); } - if (IsClassName(classId, "Windows.ApplicationModel.Core.CoreApplication")) - { - ComPtr realFactory; + if (IsClassName(classId, "Windows.ApplicationModel.Core.CoreApplication")) + { + ComPtr realFactory; - hr = TrueRoGetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), IID_PPV_ARGS(&realFactory)); + hr = TrueRoGetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), IID_PPV_ARGS(&realFactory)); - if (FAILED(hr)) - return hr; + if (FAILED(hr)) + return hr; - ComPtr wrappedFactory = Make(realFactory); + ComPtr wrappedFactory = Make(realFactory); - return wrappedFactory.CopyTo(iid, factory); + return wrappedFactory.CopyTo(iid, factory); + } + + if (IsClassName(classId, "Windows.UI.Core.CoreWindow")) + { + // + // for now we just hook GetForCurrentThread to get the CoreWindow but i'll change it later to + // wrap ICoreWindowStatic or as zombie said another thing that works is by hooking IFrameworkView::SetWindow + // but for now this *should* work just fine -AleBlbl + // + ComPtr coreWindowStatic; + hr = TrueRoGetActivationFactory(HStringReference(RuntimeClass_Windows_UI_Core_CoreWindow).Get(), IID_PPV_ARGS(&coreWindowStatic)); + if (FAILED(hr)) { + return hr; } - if (IsClassName(classId, "Windows.UI.Core.CoreWindow")) + if (!TrueGetForCurrentThread) { - // - // for now we just hook GetForCurrentThread to get the CoreWindow but i'll change it later to - // wrap ICoreWindowStatic or as zombie said another thing that works is by hooking IFrameworkView::SetWindow - // but for now this *should* work just fine -AleBlbl - // - ComPtr coreWindowStatic; - hr = TrueRoGetActivationFactory(HStringReference(RuntimeClass_Windows_UI_Core_CoreWindow).Get(), IID_PPV_ARGS(&coreWindowStatic)); - if (FAILED(hr)) { - return hr; - } + *reinterpret_cast(&TrueGetForCurrentThread) = (*reinterpret_cast(coreWindowStatic.Get()))[6]; - if (!TrueGetForCurrentThread) - { - *reinterpret_cast(&TrueGetForCurrentThread) = (*reinterpret_cast(coreWindowStatic.Get()))[6]; - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach(&TrueGetForCurrentThread, GetForCurrentThread_Hook); - DetourTransactionCommit(); - } - - return coreWindowStatic.CopyTo(iid, factory); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach(&TrueGetForCurrentThread, GetForCurrentThread_Hook); + DetourTransactionCommit(); } - // After WinDurango overrides try to load the rest + return coreWindowStatic.CopyTo(iid, factory); + } + + // After WinDurango overrides try to load the rest + + if (!pDllGetActivationFactory) + { + auto library = LoadPackagedLibrary(L"winrt_x.dll", 0); + + if (!library) library = LoadLibraryW(L"winrt_x.dll"); + + if (!library) return hr; + + pDllGetActivationFactory = reinterpret_cast + (GetProcAddress(library, "DllGetActivationFactory")); if (!pDllGetActivationFactory) - { - auto library = LoadPackagedLibrary(L"winrt_x.dll", 0); + return hr; + } - if (!library) library = LoadLibraryW(L"winrt_x.dll"); + // fallback + ComPtr fallbackFactory; + hr = pDllGetActivationFactory(classId, fallbackFactory.GetAddressOf()); - if (!library) return hr; - - pDllGetActivationFactory = reinterpret_cast - (GetProcAddress(library, "DllGetActivationFactory")); - - if (!pDllGetActivationFactory) - return hr; - } - - // fallback - ComPtr fallbackFactory; - hr = pDllGetActivationFactory(classId, fallbackFactory.GetAddressOf()); - - if (SUCCEEDED(hr)) - return fallbackFactory.CopyTo(iid, factory); + if (SUCCEEDED(hr)) + return fallbackFactory.CopyTo(iid, factory); return TrueRoGetActivationFactory(classId, iid, factory); } + +HRESULT WINAPI GetActivationFactoryRedirect(PCWSTR str, REFIID riid, void** ppFactory) +{ + HRESULT hr; + HSTRING className; + HSTRING_HEADER classNameHeader; + + if (FAILED(hr = WindowsCreateStringReference(str, wcslen(str), &classNameHeader, &className))) + return hr; + + //printf("GetActivationFactoryRedirect: %S\n", str); + + hr = RoGetActivationFactory_Hook(className, riid, ppFactory); + WindowsDeleteString(className); + return hr; +} diff --git a/dlls/mfplat/Exports.def b/dlls/mfplat/Exports.def deleted file mode 100644 index f4eae15..0000000 --- a/dlls/mfplat/Exports.def +++ /dev/null @@ -1,12 +0,0 @@ -LIBRARY mfplat -EXPORTS -MFCreateDxvaSampleRendererX = MFCreateDxvaSampleRendererX_X @34 -MFResetDXGIDeviceManagerX = MFResetDXGIDeviceManagerX_X @117 -MFCreateDXGIDeviceManager = MFCreateDXGIDeviceManager_X @32 -MFCreateAttributes = MFCreateAttributes_X @29 -MFCreateMediaType = MFCreateMediaType_X @45 -MFStartup = MFStartup_X @125 -MFShutdown = MFShutdown_X @126 -MFCreateNV12ToRGB32ConverterX = MFCreateNV12ToRGB32ConverterX_X @128 -MFCreateWaveFormatExFromMFMediaType = MFCreateWaveFormatExFromMFMediaType_X @129 -MFInitMediaTypeFromWaveFormatEx = MFInitMediaTypeFromWaveFormatEx_X @130 \ No newline at end of file diff --git a/dlls/mfplat/dllmain.cpp b/dlls/mfplat/dllmain.cpp index 821ff06..36e62ab 100644 --- a/dlls/mfplat/dllmain.cpp +++ b/dlls/mfplat/dllmain.cpp @@ -1,22 +1,460 @@ -#include "pch.h" -#include +#include +#include +// note from unixian: this proxy dll situation is temporary, but we need to use the actual functions from mfplat.dll while we're also named mfplat +#pragma region Proxy +struct mfplat_dll { + HMODULE dll; + FARPROC oCopyPropVariant; + FARPROC oCreatePropVariant; + FARPROC oCreatePropertyStore; + FARPROC oDestroyPropVariant; + FARPROC oGetAMSubtypeFromD3DFormat; + FARPROC oGetD3DFormatFromMFSubtype; + FARPROC oLFGetGlobalPool; + FARPROC oMFAddPeriodicCallback; + FARPROC oMFAllocateSerialWorkQueue; + FARPROC oMFAllocateWorkQueue; + FARPROC oMFAllocateWorkQueueEx; + FARPROC oMFAppendCollection; + FARPROC oMFAverageTimePerFrameToFrameRate; + FARPROC oMFBeginCreateFile; + FARPROC oMFBlockThread; + FARPROC oMFCalculateBitmapImageSize; + FARPROC oMFCalculateImageSize; + FARPROC oMFCancelCreateFile; + FARPROC oMFCancelWorkItem; + FARPROC oMFConvertColorInfoFromDXVA; + FARPROC oMFConvertColorInfoToDXVA; + FARPROC oMFConvertFromFP16Array; + FARPROC oMFConvertToFP16Array; + FARPROC oMFCopyImage; + FARPROC oMFCreate2DMediaBuffer; + FARPROC oMFCreateAMMediaTypeFromMFMediaType; + FARPROC oMFCreateAlignedMemoryBuffer; + FARPROC oMFCreateAsyncResult; + FARPROC oMFCreateAttributes; + FARPROC oMFCreateAudioMediaType; + FARPROC oMFCreateCollection; + FARPROC oMFCreateDXGIDeviceManager; + FARPROC oMFCreateDXGISurfaceBufferX; + FARPROC oMFCreateDxvaSampleRendererX; + FARPROC oMFCreateEventQueue; + FARPROC oMFCreateFile; + FARPROC oMFCreateFileFromHandle; + FARPROC oMFCreateLegacyMediaBufferOnMFMediaBuffer; + FARPROC oMFCreateMFByteStreamOnStream; + FARPROC oMFCreateMFVideoFormatFromMFMediaType; + FARPROC oMFCreateMediaBufferFromMediaType; + FARPROC oMFCreateMediaBufferWrapper; + FARPROC oMFCreateMediaEvent; + FARPROC oMFCreateMediaEventResult; + FARPROC oMFCreateMediaType; + FARPROC oMFCreateMediaTypeFromRepresentation; + FARPROC oMFCreateMemoryBuffer; + FARPROC oMFCreateMemoryStream; + FARPROC oMFCreateNV12ToRGB32ConverterX; + FARPROC oMFCreatePathFromURL; + FARPROC oMFCreatePresentationDescriptor; + FARPROC oMFCreateRGB32ToNV12ConverterX; + FARPROC oMFCreateSample; + FARPROC oMFCreateSourceResolver; + FARPROC oMFCreateSourceResolverInternal; + FARPROC oMFCreateStreamDescriptor; + FARPROC oMFCreateSystemTimeSource; + FARPROC oMFCreateTempFile; + FARPROC oMFCreateTrackedSample; + FARPROC oMFCreateURLFromPath; + FARPROC oMFCreateVideoMediaType; + FARPROC oMFCreateVideoMediaTypeFromBitMapInfoHeader; + FARPROC oMFCreateVideoMediaTypeFromBitMapInfoHeaderEx; + FARPROC oMFCreateVideoMediaTypeFromSubtype; + FARPROC oMFCreateVideoMediaTypeFromVideoInfoHeader; + FARPROC oMFCreateVideoMediaTypeFromVideoInfoHeader2; + FARPROC oMFCreateVideoSampleAllocatorEx; + FARPROC oMFCreateWaveFormatExFromMFMediaType; + FARPROC oMFDeserializeAttributesFromStream; + FARPROC oMFDeserializeEvent; + FARPROC oMFDeserializeMediaTypeFromStream; + FARPROC oMFDeserializePresentationDescriptor; + FARPROC oMFEndCreateFile; + FARPROC oMFFrameRateToAverageTimePerFrame; + FARPROC oMFGetAttributesAsBlob; + FARPROC oMFGetAttributesAsBlobSize; + FARPROC oMFGetConfigurationDWORD; + FARPROC oMFGetConfigurationPolicy; + FARPROC oMFGetConfigurationStore; + FARPROC oMFGetConfigurationString; + FARPROC oMFGetPlaneSize; + FARPROC oMFGetPlatform; + FARPROC oMFGetPrivateWorkqueues; + FARPROC oMFGetStrideForBitmapInfoHeader; + FARPROC oMFGetSupportedMimeTypes; + FARPROC oMFGetSupportedSchemes; + FARPROC oMFGetSystemTime; + FARPROC oMFGetTimerPeriodicity; + FARPROC oMFGetUncompressedVideoFormat; + FARPROC oMFGetWorkQueueMMCSSTaskId; + FARPROC oMFHeapAlloc; + FARPROC oMFHeapFree; + FARPROC oMFInitAMMediaTypeFromMFMediaType; + FARPROC oMFInitAttributesFromBlob; + FARPROC oMFInitMediaTypeFromAMMediaType; + FARPROC oMFInitMediaTypeFromMFVideoFormat; + FARPROC oMFInitMediaTypeFromVideoInfoHeader; + FARPROC oMFInitMediaTypeFromVideoInfoHeader2; + FARPROC oMFInitMediaTypeFromWaveFormatEx; + FARPROC oMFInitVideoFormat; + FARPROC oMFInitVideoFormat_RGB; + FARPROC oMFInvokeCallback; + FARPROC oMFJoinIoPort; + FARPROC oMFJoinWorkQueue; + FARPROC oMFLockDXGIDeviceManager; + FARPROC oMFLockPlatform; + FARPROC oMFLockSharedWorkQueue; + FARPROC oMFLockWorkQueue; + FARPROC oMFMapDX9FormatToDXGIFormat; + FARPROC oMFMapDXGIFormatToDX9Format; + FARPROC oMFPutWaitingWorkItem; + FARPROC oMFPutWorkItem; + FARPROC oMFPutWorkItem2; + FARPROC oMFPutWorkItemEx; + FARPROC oMFPutWorkItemEx2; + FARPROC oMFRemovePeriodicCallback; + FARPROC oMFResetDXGIDeviceManagerX; + FARPROC oMFScheduleWorkItem; + FARPROC oMFScheduleWorkItemEx; + FARPROC oMFSerializeAttributesToStream; + FARPROC oMFSerializeEvent; + FARPROC oMFSerializeMediaTypeToStream; + FARPROC oMFSerializePresentationDescriptor; + FARPROC oMFShutdown; + FARPROC oMFStartup; + FARPROC oMFTEnumEx; + FARPROC oMFTraceError; + FARPROC oMFTraceFuncEnter; + FARPROC oMFUnblockThread; + FARPROC oMFUnjoinWorkQueue; + FARPROC oMFUnlockDXGIDeviceManager; + FARPROC oMFUnlockPlatform; + FARPROC oMFUnlockWorkQueue; + FARPROC oMFUnwrapMediaType; + FARPROC oMFValidateMediaTypeSize; + FARPROC oMFWrapMediaType; + FARPROC oMFllMulDiv; + FARPROC oPropVariantFromStream; + FARPROC oPropVariantToStream; + FARPROC oValidateWaveFormat; +} mfplat; -BOOL APIENTRY DllMain(HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - break; +extern "C" { + FARPROC PA = 0; + int runASM(); - case DLL_PROCESS_DETACH: - break; + void fCopyPropVariant() { PA = mfplat.oCopyPropVariant; runASM(); } + void fCreatePropVariant() { PA = mfplat.oCreatePropVariant; runASM(); } + void fCreatePropertyStore() { PA = mfplat.oCreatePropertyStore; runASM(); } + void fDestroyPropVariant() { PA = mfplat.oDestroyPropVariant; runASM(); } + void fGetAMSubtypeFromD3DFormat() { PA = mfplat.oGetAMSubtypeFromD3DFormat; runASM(); } + void fGetD3DFormatFromMFSubtype() { PA = mfplat.oGetD3DFormatFromMFSubtype; runASM(); } + void fLFGetGlobalPool() { PA = mfplat.oLFGetGlobalPool; runASM(); } + void fMFAddPeriodicCallback() { PA = mfplat.oMFAddPeriodicCallback; runASM(); } + void fMFAllocateSerialWorkQueue() { PA = mfplat.oMFAllocateSerialWorkQueue; runASM(); } + void fMFAllocateWorkQueue() { PA = mfplat.oMFAllocateWorkQueue; runASM(); } + void fMFAllocateWorkQueueEx() { PA = mfplat.oMFAllocateWorkQueueEx; runASM(); } + void fMFAppendCollection() { PA = mfplat.oMFAppendCollection; runASM(); } + void fMFAverageTimePerFrameToFrameRate() { PA = mfplat.oMFAverageTimePerFrameToFrameRate; runASM(); } + void fMFBeginCreateFile() { PA = mfplat.oMFBeginCreateFile; runASM(); } + void fMFBlockThread() { PA = mfplat.oMFBlockThread; runASM(); } + void fMFCalculateBitmapImageSize() { PA = mfplat.oMFCalculateBitmapImageSize; runASM(); } + void fMFCalculateImageSize() { PA = mfplat.oMFCalculateImageSize; runASM(); } + void fMFCancelCreateFile() { PA = mfplat.oMFCancelCreateFile; runASM(); } + void fMFCancelWorkItem() { PA = mfplat.oMFCancelWorkItem; runASM(); } + void fMFConvertColorInfoFromDXVA() { PA = mfplat.oMFConvertColorInfoFromDXVA; runASM(); } + void fMFConvertColorInfoToDXVA() { PA = mfplat.oMFConvertColorInfoToDXVA; runASM(); } + void fMFConvertFromFP16Array() { PA = mfplat.oMFConvertFromFP16Array; runASM(); } + void fMFConvertToFP16Array() { PA = mfplat.oMFConvertToFP16Array; runASM(); } + void fMFCopyImage() { PA = mfplat.oMFCopyImage; runASM(); } + void fMFCreate2DMediaBuffer() { PA = mfplat.oMFCreate2DMediaBuffer; runASM(); } + void fMFCreateAMMediaTypeFromMFMediaType() { PA = mfplat.oMFCreateAMMediaTypeFromMFMediaType; runASM(); } + void fMFCreateAlignedMemoryBuffer() { PA = mfplat.oMFCreateAlignedMemoryBuffer; runASM(); } + void fMFCreateAsyncResult() { PA = mfplat.oMFCreateAsyncResult; runASM(); } + void fMFCreateAttributes() { PA = mfplat.oMFCreateAttributes; runASM(); } + void fMFCreateAudioMediaType() { PA = mfplat.oMFCreateAudioMediaType; runASM(); } + void fMFCreateCollection() { PA = mfplat.oMFCreateCollection; runASM(); } + void fMFCreateDXGIDeviceManager() { PA = mfplat.oMFCreateDXGIDeviceManager; runASM(); } + void fMFCreateDXGISurfaceBufferX() { PA = mfplat.oMFCreateDXGISurfaceBufferX; runASM(); } + void fMFCreateDxvaSampleRendererX() { PA = mfplat.oMFCreateDxvaSampleRendererX; runASM(); } + void fMFCreateEventQueue() { PA = mfplat.oMFCreateEventQueue; runASM(); } + void fMFCreateFile() { PA = mfplat.oMFCreateFile; runASM(); } + void fMFCreateFileFromHandle() { PA = mfplat.oMFCreateFileFromHandle; runASM(); } + void fMFCreateLegacyMediaBufferOnMFMediaBuffer() { PA = mfplat.oMFCreateLegacyMediaBufferOnMFMediaBuffer; runASM(); } + void fMFCreateMFByteStreamOnStream() { PA = mfplat.oMFCreateMFByteStreamOnStream; runASM(); } + void fMFCreateMFVideoFormatFromMFMediaType() { PA = mfplat.oMFCreateMFVideoFormatFromMFMediaType; runASM(); } + void fMFCreateMediaBufferFromMediaType() { PA = mfplat.oMFCreateMediaBufferFromMediaType; runASM(); } + void fMFCreateMediaBufferWrapper() { PA = mfplat.oMFCreateMediaBufferWrapper; runASM(); } + void fMFCreateMediaEvent() { PA = mfplat.oMFCreateMediaEvent; runASM(); } + void fMFCreateMediaEventResult() { PA = mfplat.oMFCreateMediaEventResult; runASM(); } + void fMFCreateMediaType() { PA = mfplat.oMFCreateMediaType; runASM(); } + void fMFCreateMediaTypeFromRepresentation() { PA = mfplat.oMFCreateMediaTypeFromRepresentation; runASM(); } + void fMFCreateMemoryBuffer() { PA = mfplat.oMFCreateMemoryBuffer; runASM(); } + void fMFCreateMemoryStream() { PA = mfplat.oMFCreateMemoryStream; runASM(); } + void fMFCreateNV12ToRGB32ConverterX() { PA = mfplat.oMFCreateNV12ToRGB32ConverterX; runASM(); } + void fMFCreatePathFromURL() { PA = mfplat.oMFCreatePathFromURL; runASM(); } + void fMFCreatePresentationDescriptor() { PA = mfplat.oMFCreatePresentationDescriptor; runASM(); } + void fMFCreateRGB32ToNV12ConverterX() { PA = mfplat.oMFCreateRGB32ToNV12ConverterX; runASM(); } + void fMFCreateSample() { PA = mfplat.oMFCreateSample; runASM(); } + void fMFCreateSourceResolver() { PA = mfplat.oMFCreateSourceResolver; runASM(); } + void fMFCreateSourceResolverInternal() { PA = mfplat.oMFCreateSourceResolverInternal; runASM(); } + void fMFCreateStreamDescriptor() { PA = mfplat.oMFCreateStreamDescriptor; runASM(); } + void fMFCreateSystemTimeSource() { PA = mfplat.oMFCreateSystemTimeSource; runASM(); } + void fMFCreateTempFile() { PA = mfplat.oMFCreateTempFile; runASM(); } + void fMFCreateTrackedSample() { PA = mfplat.oMFCreateTrackedSample; runASM(); } + void fMFCreateURLFromPath() { PA = mfplat.oMFCreateURLFromPath; runASM(); } + void fMFCreateVideoMediaType() { PA = mfplat.oMFCreateVideoMediaType; runASM(); } + void fMFCreateVideoMediaTypeFromBitMapInfoHeader() { PA = mfplat.oMFCreateVideoMediaTypeFromBitMapInfoHeader; runASM(); } + void fMFCreateVideoMediaTypeFromBitMapInfoHeaderEx() { PA = mfplat.oMFCreateVideoMediaTypeFromBitMapInfoHeaderEx; runASM(); } + void fMFCreateVideoMediaTypeFromSubtype() { PA = mfplat.oMFCreateVideoMediaTypeFromSubtype; runASM(); } + void fMFCreateVideoMediaTypeFromVideoInfoHeader() { PA = mfplat.oMFCreateVideoMediaTypeFromVideoInfoHeader; runASM(); } + void fMFCreateVideoMediaTypeFromVideoInfoHeader2() { PA = mfplat.oMFCreateVideoMediaTypeFromVideoInfoHeader2; runASM(); } + void fMFCreateVideoSampleAllocatorEx() { PA = mfplat.oMFCreateVideoSampleAllocatorEx; runASM(); } + void fMFCreateWaveFormatExFromMFMediaType() { PA = mfplat.oMFCreateWaveFormatExFromMFMediaType; runASM(); } + void fMFDeserializeAttributesFromStream() { PA = mfplat.oMFDeserializeAttributesFromStream; runASM(); } + void fMFDeserializeEvent() { PA = mfplat.oMFDeserializeEvent; runASM(); } + void fMFDeserializeMediaTypeFromStream() { PA = mfplat.oMFDeserializeMediaTypeFromStream; runASM(); } + void fMFDeserializePresentationDescriptor() { PA = mfplat.oMFDeserializePresentationDescriptor; runASM(); } + void fMFEndCreateFile() { PA = mfplat.oMFEndCreateFile; runASM(); } + void fMFFrameRateToAverageTimePerFrame() { PA = mfplat.oMFFrameRateToAverageTimePerFrame; runASM(); } + void fMFGetAttributesAsBlob() { PA = mfplat.oMFGetAttributesAsBlob; runASM(); } + void fMFGetAttributesAsBlobSize() { PA = mfplat.oMFGetAttributesAsBlobSize; runASM(); } + void fMFGetConfigurationDWORD() { PA = mfplat.oMFGetConfigurationDWORD; runASM(); } + void fMFGetConfigurationPolicy() { PA = mfplat.oMFGetConfigurationPolicy; runASM(); } + void fMFGetConfigurationStore() { PA = mfplat.oMFGetConfigurationStore; runASM(); } + void fMFGetConfigurationString() { PA = mfplat.oMFGetConfigurationString; runASM(); } + void fMFGetPlaneSize() { PA = mfplat.oMFGetPlaneSize; runASM(); } + void fMFGetPlatform() { PA = mfplat.oMFGetPlatform; runASM(); } + void fMFGetPrivateWorkqueues() { PA = mfplat.oMFGetPrivateWorkqueues; runASM(); } + void fMFGetStrideForBitmapInfoHeader() { PA = mfplat.oMFGetStrideForBitmapInfoHeader; runASM(); } + void fMFGetSupportedMimeTypes() { PA = mfplat.oMFGetSupportedMimeTypes; runASM(); } + void fMFGetSupportedSchemes() { PA = mfplat.oMFGetSupportedSchemes; runASM(); } + void fMFGetSystemTime() { PA = mfplat.oMFGetSystemTime; runASM(); } + void fMFGetTimerPeriodicity() { PA = mfplat.oMFGetTimerPeriodicity; runASM(); } + void fMFGetUncompressedVideoFormat() { PA = mfplat.oMFGetUncompressedVideoFormat; runASM(); } + void fMFGetWorkQueueMMCSSTaskId() { PA = mfplat.oMFGetWorkQueueMMCSSTaskId; runASM(); } + void fMFHeapAlloc() { PA = mfplat.oMFHeapAlloc; runASM(); } + void fMFHeapFree() { PA = mfplat.oMFHeapFree; runASM(); } + void fMFInitAMMediaTypeFromMFMediaType() { PA = mfplat.oMFInitAMMediaTypeFromMFMediaType; runASM(); } + void fMFInitAttributesFromBlob() { PA = mfplat.oMFInitAttributesFromBlob; runASM(); } + void fMFInitMediaTypeFromAMMediaType() { PA = mfplat.oMFInitMediaTypeFromAMMediaType; runASM(); } + void fMFInitMediaTypeFromMFVideoFormat() { PA = mfplat.oMFInitMediaTypeFromMFVideoFormat; runASM(); } + void fMFInitMediaTypeFromVideoInfoHeader() { PA = mfplat.oMFInitMediaTypeFromVideoInfoHeader; runASM(); } + void fMFInitMediaTypeFromVideoInfoHeader2() { PA = mfplat.oMFInitMediaTypeFromVideoInfoHeader2; runASM(); } + void fMFInitMediaTypeFromWaveFormatEx() { PA = mfplat.oMFInitMediaTypeFromWaveFormatEx; runASM(); } + void fMFInitVideoFormat() { PA = mfplat.oMFInitVideoFormat; runASM(); } + void fMFInitVideoFormat_RGB() { PA = mfplat.oMFInitVideoFormat_RGB; runASM(); } + void fMFInvokeCallback() { PA = mfplat.oMFInvokeCallback; runASM(); } + void fMFJoinIoPort() { PA = mfplat.oMFJoinIoPort; runASM(); } + void fMFJoinWorkQueue() { PA = mfplat.oMFJoinWorkQueue; runASM(); } + void fMFLockDXGIDeviceManager() { PA = mfplat.oMFLockDXGIDeviceManager; runASM(); } + void fMFLockPlatform() { PA = mfplat.oMFLockPlatform; runASM(); } + void fMFLockSharedWorkQueue() { PA = mfplat.oMFLockSharedWorkQueue; runASM(); } + void fMFLockWorkQueue() { PA = mfplat.oMFLockWorkQueue; runASM(); } + void fMFMapDX9FormatToDXGIFormat() { PA = mfplat.oMFMapDX9FormatToDXGIFormat; runASM(); } + void fMFMapDXGIFormatToDX9Format() { PA = mfplat.oMFMapDXGIFormatToDX9Format; runASM(); } + void fMFPutWaitingWorkItem() { PA = mfplat.oMFPutWaitingWorkItem; runASM(); } + void fMFPutWorkItem() { PA = mfplat.oMFPutWorkItem; runASM(); } + void fMFPutWorkItem2() { PA = mfplat.oMFPutWorkItem2; runASM(); } + void fMFPutWorkItemEx() { PA = mfplat.oMFPutWorkItemEx; runASM(); } + void fMFPutWorkItemEx2() { PA = mfplat.oMFPutWorkItemEx2; runASM(); } + void fMFRemovePeriodicCallback() { PA = mfplat.oMFRemovePeriodicCallback; runASM(); } + void fMFResetDXGIDeviceManagerX() { PA = mfplat.oMFResetDXGIDeviceManagerX; runASM(); } + void fMFScheduleWorkItem() { PA = mfplat.oMFScheduleWorkItem; runASM(); } + void fMFScheduleWorkItemEx() { PA = mfplat.oMFScheduleWorkItemEx; runASM(); } + void fMFSerializeAttributesToStream() { PA = mfplat.oMFSerializeAttributesToStream; runASM(); } + void fMFSerializeEvent() { PA = mfplat.oMFSerializeEvent; runASM(); } + void fMFSerializeMediaTypeToStream() { PA = mfplat.oMFSerializeMediaTypeToStream; runASM(); } + void fMFSerializePresentationDescriptor() { PA = mfplat.oMFSerializePresentationDescriptor; runASM(); } + void fMFShutdown() { PA = mfplat.oMFShutdown; runASM(); } - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - // Do nothing for thread-specific cases - break; - } - return TRUE; // Continue loading the DLL + HRESULT fMFStartup( ULONG Version, DWORD dwFlags ) + { + return reinterpret_cast(mfplat.oMFStartup)(MF_VERSION, dwFlags); + } + + void fMFTEnumEx() { PA = mfplat.oMFTEnumEx; runASM(); } + void fMFTraceError() { PA = mfplat.oMFTraceError; runASM(); } + void fMFTraceFuncEnter() { PA = mfplat.oMFTraceFuncEnter; runASM(); } + void fMFUnblockThread() { PA = mfplat.oMFUnblockThread; runASM(); } + void fMFUnjoinWorkQueue() { PA = mfplat.oMFUnjoinWorkQueue; runASM(); } + void fMFUnlockDXGIDeviceManager() { PA = mfplat.oMFUnlockDXGIDeviceManager; runASM(); } + void fMFUnlockPlatform() { PA = mfplat.oMFUnlockPlatform; runASM(); } + void fMFUnlockWorkQueue() { PA = mfplat.oMFUnlockWorkQueue; runASM(); } + void fMFUnwrapMediaType() { PA = mfplat.oMFUnwrapMediaType; runASM(); } + void fMFValidateMediaTypeSize() { PA = mfplat.oMFValidateMediaTypeSize; runASM(); } + void fMFWrapMediaType() { PA = mfplat.oMFWrapMediaType; runASM(); } + void fMFllMulDiv() { PA = mfplat.oMFllMulDiv; runASM(); } + void fPropVariantFromStream() { PA = mfplat.oPropVariantFromStream; runASM(); } + void fPropVariantToStream() { PA = mfplat.oPropVariantToStream; runASM(); } + void fValidateWaveFormat() { PA = mfplat.oValidateWaveFormat; runASM(); } +} + +void setupFunctions() { + mfplat.oCopyPropVariant = GetProcAddress(mfplat.dll, "CopyPropVariant"); + mfplat.oCreatePropVariant = GetProcAddress(mfplat.dll, "CreatePropVariant"); + mfplat.oCreatePropertyStore = GetProcAddress(mfplat.dll, "CreatePropertyStore"); + mfplat.oDestroyPropVariant = GetProcAddress(mfplat.dll, "DestroyPropVariant"); + mfplat.oGetAMSubtypeFromD3DFormat = GetProcAddress(mfplat.dll, "GetAMSubtypeFromD3DFormat"); + mfplat.oGetD3DFormatFromMFSubtype = GetProcAddress(mfplat.dll, "GetD3DFormatFromMFSubtype"); + mfplat.oLFGetGlobalPool = GetProcAddress(mfplat.dll, "LFGetGlobalPool"); + mfplat.oMFAddPeriodicCallback = GetProcAddress(mfplat.dll, "MFAddPeriodicCallback"); + mfplat.oMFAllocateSerialWorkQueue = GetProcAddress(mfplat.dll, "MFAllocateSerialWorkQueue"); + mfplat.oMFAllocateWorkQueue = GetProcAddress(mfplat.dll, "MFAllocateWorkQueue"); + mfplat.oMFAllocateWorkQueueEx = GetProcAddress(mfplat.dll, "MFAllocateWorkQueueEx"); + mfplat.oMFAppendCollection = GetProcAddress(mfplat.dll, "MFAppendCollection"); + mfplat.oMFAverageTimePerFrameToFrameRate = GetProcAddress(mfplat.dll, "MFAverageTimePerFrameToFrameRate"); + mfplat.oMFBeginCreateFile = GetProcAddress(mfplat.dll, "MFBeginCreateFile"); + mfplat.oMFBlockThread = GetProcAddress(mfplat.dll, "MFBlockThread"); + mfplat.oMFCalculateBitmapImageSize = GetProcAddress(mfplat.dll, "MFCalculateBitmapImageSize"); + mfplat.oMFCalculateImageSize = GetProcAddress(mfplat.dll, "MFCalculateImageSize"); + mfplat.oMFCancelCreateFile = GetProcAddress(mfplat.dll, "MFCancelCreateFile"); + mfplat.oMFCancelWorkItem = GetProcAddress(mfplat.dll, "MFCancelWorkItem"); + mfplat.oMFConvertColorInfoFromDXVA = GetProcAddress(mfplat.dll, "MFConvertColorInfoFromDXVA"); + mfplat.oMFConvertColorInfoToDXVA = GetProcAddress(mfplat.dll, "MFConvertColorInfoToDXVA"); + mfplat.oMFConvertFromFP16Array = GetProcAddress(mfplat.dll, "MFConvertFromFP16Array"); + mfplat.oMFConvertToFP16Array = GetProcAddress(mfplat.dll, "MFConvertToFP16Array"); + mfplat.oMFCopyImage = GetProcAddress(mfplat.dll, "MFCopyImage"); + mfplat.oMFCreate2DMediaBuffer = GetProcAddress(mfplat.dll, "MFCreate2DMediaBuffer"); + mfplat.oMFCreateAMMediaTypeFromMFMediaType = GetProcAddress(mfplat.dll, "MFCreateAMMediaTypeFromMFMediaType"); + mfplat.oMFCreateAlignedMemoryBuffer = GetProcAddress(mfplat.dll, "MFCreateAlignedMemoryBuffer"); + mfplat.oMFCreateAsyncResult = GetProcAddress(mfplat.dll, "MFCreateAsyncResult"); + mfplat.oMFCreateAttributes = GetProcAddress(mfplat.dll, "MFCreateAttributes"); + mfplat.oMFCreateAudioMediaType = GetProcAddress(mfplat.dll, "MFCreateAudioMediaType"); + mfplat.oMFCreateCollection = GetProcAddress(mfplat.dll, "MFCreateCollection"); + mfplat.oMFCreateDXGIDeviceManager = GetProcAddress(mfplat.dll, "MFCreateDXGIDeviceManager"); + mfplat.oMFCreateDXGISurfaceBufferX = GetProcAddress(mfplat.dll, "MFCreateDXGISurfaceBufferX"); + mfplat.oMFCreateDxvaSampleRendererX = GetProcAddress(mfplat.dll, "MFCreateDxvaSampleRendererX"); + mfplat.oMFCreateEventQueue = GetProcAddress(mfplat.dll, "MFCreateEventQueue"); + mfplat.oMFCreateFile = GetProcAddress(mfplat.dll, "MFCreateFile"); + mfplat.oMFCreateFileFromHandle = GetProcAddress(mfplat.dll, "MFCreateFileFromHandle"); + mfplat.oMFCreateLegacyMediaBufferOnMFMediaBuffer = GetProcAddress(mfplat.dll, "MFCreateLegacyMediaBufferOnMFMediaBuffer"); + mfplat.oMFCreateMFByteStreamOnStream = GetProcAddress(mfplat.dll, "MFCreateMFByteStreamOnStream"); + mfplat.oMFCreateMFVideoFormatFromMFMediaType = GetProcAddress(mfplat.dll, "MFCreateMFVideoFormatFromMFMediaType"); + mfplat.oMFCreateMediaBufferFromMediaType = GetProcAddress(mfplat.dll, "MFCreateMediaBufferFromMediaType"); + mfplat.oMFCreateMediaBufferWrapper = GetProcAddress(mfplat.dll, "MFCreateMediaBufferWrapper"); + mfplat.oMFCreateMediaEvent = GetProcAddress(mfplat.dll, "MFCreateMediaEvent"); + mfplat.oMFCreateMediaEventResult = GetProcAddress(mfplat.dll, "MFCreateMediaEventResult"); + mfplat.oMFCreateMediaType = GetProcAddress(mfplat.dll, "MFCreateMediaType"); + mfplat.oMFCreateMediaTypeFromRepresentation = GetProcAddress(mfplat.dll, "MFCreateMediaTypeFromRepresentation"); + mfplat.oMFCreateMemoryBuffer = GetProcAddress(mfplat.dll, "MFCreateMemoryBuffer"); + mfplat.oMFCreateMemoryStream = GetProcAddress(mfplat.dll, "MFCreateMemoryStream"); + mfplat.oMFCreateNV12ToRGB32ConverterX = GetProcAddress(mfplat.dll, "MFCreateNV12ToRGB32ConverterX"); + mfplat.oMFCreatePathFromURL = GetProcAddress(mfplat.dll, "MFCreatePathFromURL"); + mfplat.oMFCreatePresentationDescriptor = GetProcAddress(mfplat.dll, "MFCreatePresentationDescriptor"); + mfplat.oMFCreateRGB32ToNV12ConverterX = GetProcAddress(mfplat.dll, "MFCreateRGB32ToNV12ConverterX"); + mfplat.oMFCreateSample = GetProcAddress(mfplat.dll, "MFCreateSample"); + mfplat.oMFCreateSourceResolver = GetProcAddress(mfplat.dll, "MFCreateSourceResolver"); + mfplat.oMFCreateSourceResolverInternal = GetProcAddress(mfplat.dll, "MFCreateSourceResolverInternal"); + mfplat.oMFCreateStreamDescriptor = GetProcAddress(mfplat.dll, "MFCreateStreamDescriptor"); + mfplat.oMFCreateSystemTimeSource = GetProcAddress(mfplat.dll, "MFCreateSystemTimeSource"); + mfplat.oMFCreateTempFile = GetProcAddress(mfplat.dll, "MFCreateTempFile"); + mfplat.oMFCreateTrackedSample = GetProcAddress(mfplat.dll, "MFCreateTrackedSample"); + mfplat.oMFCreateURLFromPath = GetProcAddress(mfplat.dll, "MFCreateURLFromPath"); + mfplat.oMFCreateVideoMediaType = GetProcAddress(mfplat.dll, "MFCreateVideoMediaType"); + mfplat.oMFCreateVideoMediaTypeFromBitMapInfoHeader = GetProcAddress(mfplat.dll, "MFCreateVideoMediaTypeFromBitMapInfoHeader"); + mfplat.oMFCreateVideoMediaTypeFromBitMapInfoHeaderEx = GetProcAddress(mfplat.dll, "MFCreateVideoMediaTypeFromBitMapInfoHeaderEx"); + mfplat.oMFCreateVideoMediaTypeFromSubtype = GetProcAddress(mfplat.dll, "MFCreateVideoMediaTypeFromSubtype"); + mfplat.oMFCreateVideoMediaTypeFromVideoInfoHeader = GetProcAddress(mfplat.dll, "MFCreateVideoMediaTypeFromVideoInfoHeader"); + mfplat.oMFCreateVideoMediaTypeFromVideoInfoHeader2 = GetProcAddress(mfplat.dll, "MFCreateVideoMediaTypeFromVideoInfoHeader2"); + mfplat.oMFCreateVideoSampleAllocatorEx = GetProcAddress(mfplat.dll, "MFCreateVideoSampleAllocatorEx"); + mfplat.oMFCreateWaveFormatExFromMFMediaType = GetProcAddress(mfplat.dll, "MFCreateWaveFormatExFromMFMediaType"); + mfplat.oMFDeserializeAttributesFromStream = GetProcAddress(mfplat.dll, "MFDeserializeAttributesFromStream"); + mfplat.oMFDeserializeEvent = GetProcAddress(mfplat.dll, "MFDeserializeEvent"); + mfplat.oMFDeserializeMediaTypeFromStream = GetProcAddress(mfplat.dll, "MFDeserializeMediaTypeFromStream"); + mfplat.oMFDeserializePresentationDescriptor = GetProcAddress(mfplat.dll, "MFDeserializePresentationDescriptor"); + mfplat.oMFEndCreateFile = GetProcAddress(mfplat.dll, "MFEndCreateFile"); + mfplat.oMFFrameRateToAverageTimePerFrame = GetProcAddress(mfplat.dll, "MFFrameRateToAverageTimePerFrame"); + mfplat.oMFGetAttributesAsBlob = GetProcAddress(mfplat.dll, "MFGetAttributesAsBlob"); + mfplat.oMFGetAttributesAsBlobSize = GetProcAddress(mfplat.dll, "MFGetAttributesAsBlobSize"); + mfplat.oMFGetConfigurationDWORD = GetProcAddress(mfplat.dll, "MFGetConfigurationDWORD"); + mfplat.oMFGetConfigurationPolicy = GetProcAddress(mfplat.dll, "MFGetConfigurationPolicy"); + mfplat.oMFGetConfigurationStore = GetProcAddress(mfplat.dll, "MFGetConfigurationStore"); + mfplat.oMFGetConfigurationString = GetProcAddress(mfplat.dll, "MFGetConfigurationString"); + mfplat.oMFGetPlaneSize = GetProcAddress(mfplat.dll, "MFGetPlaneSize"); + mfplat.oMFGetPlatform = GetProcAddress(mfplat.dll, "MFGetPlatform"); + mfplat.oMFGetPrivateWorkqueues = GetProcAddress(mfplat.dll, "MFGetPrivateWorkqueues"); + mfplat.oMFGetStrideForBitmapInfoHeader = GetProcAddress(mfplat.dll, "MFGetStrideForBitmapInfoHeader"); + mfplat.oMFGetSupportedMimeTypes = GetProcAddress(mfplat.dll, "MFGetSupportedMimeTypes"); + mfplat.oMFGetSupportedSchemes = GetProcAddress(mfplat.dll, "MFGetSupportedSchemes"); + mfplat.oMFGetSystemTime = GetProcAddress(mfplat.dll, "MFGetSystemTime"); + mfplat.oMFGetTimerPeriodicity = GetProcAddress(mfplat.dll, "MFGetTimerPeriodicity"); + mfplat.oMFGetUncompressedVideoFormat = GetProcAddress(mfplat.dll, "MFGetUncompressedVideoFormat"); + mfplat.oMFGetWorkQueueMMCSSTaskId = GetProcAddress(mfplat.dll, "MFGetWorkQueueMMCSSTaskId"); + mfplat.oMFHeapAlloc = GetProcAddress(mfplat.dll, "MFHeapAlloc"); + mfplat.oMFHeapFree = GetProcAddress(mfplat.dll, "MFHeapFree"); + mfplat.oMFInitAMMediaTypeFromMFMediaType = GetProcAddress(mfplat.dll, "MFInitAMMediaTypeFromMFMediaType"); + mfplat.oMFInitAttributesFromBlob = GetProcAddress(mfplat.dll, "MFInitAttributesFromBlob"); + mfplat.oMFInitMediaTypeFromAMMediaType = GetProcAddress(mfplat.dll, "MFInitMediaTypeFromAMMediaType"); + mfplat.oMFInitMediaTypeFromMFVideoFormat = GetProcAddress(mfplat.dll, "MFInitMediaTypeFromMFVideoFormat"); + mfplat.oMFInitMediaTypeFromVideoInfoHeader = GetProcAddress(mfplat.dll, "MFInitMediaTypeFromVideoInfoHeader"); + mfplat.oMFInitMediaTypeFromVideoInfoHeader2 = GetProcAddress(mfplat.dll, "MFInitMediaTypeFromVideoInfoHeader2"); + mfplat.oMFInitMediaTypeFromWaveFormatEx = GetProcAddress(mfplat.dll, "MFInitMediaTypeFromWaveFormatEx"); + mfplat.oMFInitVideoFormat = GetProcAddress(mfplat.dll, "MFInitVideoFormat"); + mfplat.oMFInitVideoFormat_RGB = GetProcAddress(mfplat.dll, "MFInitVideoFormat_RGB"); + mfplat.oMFInvokeCallback = GetProcAddress(mfplat.dll, "MFInvokeCallback"); + mfplat.oMFJoinIoPort = GetProcAddress(mfplat.dll, "MFJoinIoPort"); + mfplat.oMFJoinWorkQueue = GetProcAddress(mfplat.dll, "MFJoinWorkQueue"); + mfplat.oMFLockDXGIDeviceManager = GetProcAddress(mfplat.dll, "MFLockDXGIDeviceManager"); + mfplat.oMFLockPlatform = GetProcAddress(mfplat.dll, "MFLockPlatform"); + mfplat.oMFLockSharedWorkQueue = GetProcAddress(mfplat.dll, "MFLockSharedWorkQueue"); + mfplat.oMFLockWorkQueue = GetProcAddress(mfplat.dll, "MFLockWorkQueue"); + mfplat.oMFMapDX9FormatToDXGIFormat = GetProcAddress(mfplat.dll, "MFMapDX9FormatToDXGIFormat"); + mfplat.oMFMapDXGIFormatToDX9Format = GetProcAddress(mfplat.dll, "MFMapDXGIFormatToDX9Format"); + mfplat.oMFPutWaitingWorkItem = GetProcAddress(mfplat.dll, "MFPutWaitingWorkItem"); + mfplat.oMFPutWorkItem = GetProcAddress(mfplat.dll, "MFPutWorkItem"); + mfplat.oMFPutWorkItem2 = GetProcAddress(mfplat.dll, "MFPutWorkItem2"); + mfplat.oMFPutWorkItemEx = GetProcAddress(mfplat.dll, "MFPutWorkItemEx"); + mfplat.oMFPutWorkItemEx2 = GetProcAddress(mfplat.dll, "MFPutWorkItemEx2"); + mfplat.oMFRemovePeriodicCallback = GetProcAddress(mfplat.dll, "MFRemovePeriodicCallback"); + mfplat.oMFResetDXGIDeviceManagerX = GetProcAddress(mfplat.dll, "MFResetDXGIDeviceManagerX"); + mfplat.oMFScheduleWorkItem = GetProcAddress(mfplat.dll, "MFScheduleWorkItem"); + mfplat.oMFScheduleWorkItemEx = GetProcAddress(mfplat.dll, "MFScheduleWorkItemEx"); + mfplat.oMFSerializeAttributesToStream = GetProcAddress(mfplat.dll, "MFSerializeAttributesToStream"); + mfplat.oMFSerializeEvent = GetProcAddress(mfplat.dll, "MFSerializeEvent"); + mfplat.oMFSerializeMediaTypeToStream = GetProcAddress(mfplat.dll, "MFSerializeMediaTypeToStream"); + mfplat.oMFSerializePresentationDescriptor = GetProcAddress(mfplat.dll, "MFSerializePresentationDescriptor"); + mfplat.oMFShutdown = GetProcAddress(mfplat.dll, "MFShutdown"); + mfplat.oMFStartup = GetProcAddress(mfplat.dll, "MFStartup"); + mfplat.oMFTEnumEx = GetProcAddress(mfplat.dll, "MFTEnumEx"); + mfplat.oMFTraceError = GetProcAddress(mfplat.dll, "MFTraceError"); + mfplat.oMFTraceFuncEnter = GetProcAddress(mfplat.dll, "MFTraceFuncEnter"); + mfplat.oMFUnblockThread = GetProcAddress(mfplat.dll, "MFUnblockThread"); + mfplat.oMFUnjoinWorkQueue = GetProcAddress(mfplat.dll, "MFUnjoinWorkQueue"); + mfplat.oMFUnlockDXGIDeviceManager = GetProcAddress(mfplat.dll, "MFUnlockDXGIDeviceManager"); + mfplat.oMFUnlockPlatform = GetProcAddress(mfplat.dll, "MFUnlockPlatform"); + mfplat.oMFUnlockWorkQueue = GetProcAddress(mfplat.dll, "MFUnlockWorkQueue"); + mfplat.oMFUnwrapMediaType = GetProcAddress(mfplat.dll, "MFUnwrapMediaType"); + mfplat.oMFValidateMediaTypeSize = GetProcAddress(mfplat.dll, "MFValidateMediaTypeSize"); + mfplat.oMFWrapMediaType = GetProcAddress(mfplat.dll, "MFWrapMediaType"); + mfplat.oMFllMulDiv = GetProcAddress(mfplat.dll, "MFllMulDiv"); + mfplat.oPropVariantFromStream = GetProcAddress(mfplat.dll, "PropVariantFromStream"); + mfplat.oPropVariantToStream = GetProcAddress(mfplat.dll, "PropVariantToStream"); + mfplat.oValidateWaveFormat = GetProcAddress(mfplat.dll, "ValidateWaveFormat"); +} +#pragma endregion + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH: + char path[MAX_PATH]; + GetWindowsDirectoryA(path, sizeof(path)); + + strcat_s(path, "\\System32\\mfplat.dll"); + mfplat.dll = LoadLibraryA(path); + setupFunctions(); + + break; + case DLL_PROCESS_DETACH: + FreeLibrary(mfplat.dll); + break; + } + return 1; } diff --git a/dlls/mfplat/framework.h b/dlls/mfplat/framework.h deleted file mode 100644 index 54b83e9..0000000 --- a/dlls/mfplat/framework.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files -#include diff --git a/dlls/mfplat/mfplat.asm b/dlls/mfplat/mfplat.asm new file mode 100644 index 0000000..e6b6bd3 --- /dev/null +++ b/dlls/mfplat/mfplat.asm @@ -0,0 +1,7 @@ +.data +extern PA : qword +.code +runASM proc +jmp qword ptr [PA] +runASM endp +end diff --git a/dlls/mfplat/mfplat.cpp b/dlls/mfplat/mfplat.cpp deleted file mode 100644 index 41761f6..0000000 --- a/dlls/mfplat/mfplat.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "pch.h" - -#include - -HRESULT MFCreateDxvaSampleRendererX_X(void* pDevice, void* pAttribute, void** pObject) -{ - return E_NOTIMPL; -} - -HRESULT MFCreateDXGIDeviceManager_X(UINT* resetToken, void** ppDeviceManager) -{ - return E_NOTIMPL; -} - -HRESULT MFResetDXGIDeviceManagerX_X( - void* pDeviceManager, - void* pUnkDevice, - UINT resetToken -) -{ - return E_NOTIMPL; -} - -HRESULT MFCreateAttributes_X( - void** ppMFAttributes, - UINT32 cInitialSize -) -{ - return E_NOTIMPL; -} - -HRESULT MFCreateMediaType_X( - void** ppMFType -) -{ - return E_NOTIMPL; -} - -HRESULT MFStartup_X( - ULONG Version, - DWORD dwFlags -) -{ - return E_NOTIMPL; -} - -HRESULT MFShutdown_X( ) -{ - return E_NOTIMPL; -} - -HRESULT __fastcall MFCreateNV12ToRGB32ConverterX_X(void*, void*, void*) -{ - return E_NOTIMPL; -} - -HRESULT(MFCreateWaveFormatExFromMFMediaType_X)(void* pMFType, void** ppWF, UINT32* pcbSize, UINT32 Flags) { - return E_NOTIMPL; -} - -HRESULT MFInitMediaTypeFromWaveFormatEx_X( - void* pMFType, - const WAVEFORMATEX* pWaveFormat, - UINT32 cbBufSize -) -{ - return E_NOTIMPL; -} \ No newline at end of file diff --git a/dlls/mfplat/mfplat.def b/dlls/mfplat/mfplat.def new file mode 100644 index 0000000..e821a3e --- /dev/null +++ b/dlls/mfplat/mfplat.def @@ -0,0 +1,142 @@ +LIBRARY mfplat +EXPORTS + CopyPropVariant=fCopyPropVariant @1 + CreatePropVariant=fCreatePropVariant @2 + CreatePropertyStore=fCreatePropertyStore @3 + DestroyPropVariant=fDestroyPropVariant @4 + GetAMSubtypeFromD3DFormat=fGetAMSubtypeFromD3DFormat @5 + GetD3DFormatFromMFSubtype=fGetD3DFormatFromMFSubtype @6 + LFGetGlobalPool=fLFGetGlobalPool @7 + MFAddPeriodicCallback=fMFAddPeriodicCallback @8 + MFAllocateSerialWorkQueue=fMFAllocateSerialWorkQueue @9 + MFAllocateWorkQueue=fMFAllocateWorkQueue @10 + MFAllocateWorkQueueEx=fMFAllocateWorkQueueEx @11 + MFAppendCollection=fMFAppendCollection @12 + MFAverageTimePerFrameToFrameRate=fMFAverageTimePerFrameToFrameRate @13 + MFBeginCreateFile=fMFBeginCreateFile @14 + MFBlockThread=fMFBlockThread @15 + MFCalculateBitmapImageSize=fMFCalculateBitmapImageSize @16 + MFCalculateImageSize=fMFCalculateImageSize @17 + MFCancelCreateFile=fMFCancelCreateFile @18 + MFCancelWorkItem=fMFCancelWorkItem @19 + MFConvertColorInfoFromDXVA=fMFConvertColorInfoFromDXVA @20 + MFConvertColorInfoToDXVA=fMFConvertColorInfoToDXVA @21 + MFConvertFromFP16Array=fMFConvertFromFP16Array @22 + MFConvertToFP16Array=fMFConvertToFP16Array @23 + MFCopyImage=fMFCopyImage @24 + MFCreate2DMediaBuffer=fMFCreate2DMediaBuffer @25 + MFCreateAMMediaTypeFromMFMediaType=fMFCreateAMMediaTypeFromMFMediaType @26 + MFCreateAlignedMemoryBuffer=fMFCreateAlignedMemoryBuffer @27 + MFCreateAsyncResult=fMFCreateAsyncResult @28 + MFCreateAttributes=fMFCreateAttributes @29 + MFCreateAudioMediaType=fMFCreateAudioMediaType @30 + MFCreateCollection=fMFCreateCollection @31 + MFCreateDXGIDeviceManager=fMFCreateDXGIDeviceManager @32 + MFCreateDXGISurfaceBufferX=fMFCreateDXGISurfaceBufferX @33 + MFCreateDxvaSampleRendererX=fMFCreateDxvaSampleRendererX @34 + MFCreateEventQueue=fMFCreateEventQueue @35 + MFCreateFile=fMFCreateFile @36 + MFCreateFileFromHandle=fMFCreateFileFromHandle @37 + MFCreateLegacyMediaBufferOnMFMediaBuffer=fMFCreateLegacyMediaBufferOnMFMediaBuffer @38 + MFCreateMFByteStreamOnStream=fMFCreateMFByteStreamOnStream @39 + MFCreateMFVideoFormatFromMFMediaType=fMFCreateMFVideoFormatFromMFMediaType @40 + MFCreateMediaBufferFromMediaType=fMFCreateMediaBufferFromMediaType @41 + MFCreateMediaBufferWrapper=fMFCreateMediaBufferWrapper @42 + MFCreateMediaEvent=fMFCreateMediaEvent @43 + MFCreateMediaEventResult=fMFCreateMediaEventResult @44 + MFCreateMediaType=fMFCreateMediaType @45 + MFCreateMediaTypeFromRepresentation=fMFCreateMediaTypeFromRepresentation @46 + MFCreateMemoryBuffer=fMFCreateMemoryBuffer @47 + MFCreateMemoryStream=fMFCreateMemoryStream @48 + MFCreateNV12ToRGB32ConverterX=fMFCreateNV12ToRGB32ConverterX @49 + MFCreatePathFromURL=fMFCreatePathFromURL @50 + MFCreatePresentationDescriptor=fMFCreatePresentationDescriptor @51 + MFCreateRGB32ToNV12ConverterX=fMFCreateRGB32ToNV12ConverterX @52 + MFCreateSample=fMFCreateSample @53 + MFCreateSourceResolver=fMFCreateSourceResolver @54 + MFCreateSourceResolverInternal=fMFCreateSourceResolverInternal @55 + MFCreateStreamDescriptor=fMFCreateStreamDescriptor @56 + MFCreateSystemTimeSource=fMFCreateSystemTimeSource @57 + MFCreateTempFile=fMFCreateTempFile @58 + MFCreateTrackedSample=fMFCreateTrackedSample @59 + MFCreateURLFromPath=fMFCreateURLFromPath @60 + MFCreateVideoMediaType=fMFCreateVideoMediaType @61 + MFCreateVideoMediaTypeFromBitMapInfoHeader=fMFCreateVideoMediaTypeFromBitMapInfoHeader @62 + MFCreateVideoMediaTypeFromBitMapInfoHeaderEx=fMFCreateVideoMediaTypeFromBitMapInfoHeaderEx @63 + MFCreateVideoMediaTypeFromSubtype=fMFCreateVideoMediaTypeFromSubtype @64 + MFCreateVideoMediaTypeFromVideoInfoHeader=fMFCreateVideoMediaTypeFromVideoInfoHeader @65 + MFCreateVideoMediaTypeFromVideoInfoHeader2=fMFCreateVideoMediaTypeFromVideoInfoHeader2 @66 + MFCreateVideoSampleAllocatorEx=fMFCreateVideoSampleAllocatorEx @67 + MFCreateWaveFormatExFromMFMediaType=fMFCreateWaveFormatExFromMFMediaType @68 + MFDeserializeAttributesFromStream=fMFDeserializeAttributesFromStream @69 + MFDeserializeEvent=fMFDeserializeEvent @70 + MFDeserializeMediaTypeFromStream=fMFDeserializeMediaTypeFromStream @71 + MFDeserializePresentationDescriptor=fMFDeserializePresentationDescriptor @72 + MFEndCreateFile=fMFEndCreateFile @73 + MFFrameRateToAverageTimePerFrame=fMFFrameRateToAverageTimePerFrame @74 + MFGetAttributesAsBlob=fMFGetAttributesAsBlob @75 + MFGetAttributesAsBlobSize=fMFGetAttributesAsBlobSize @76 + MFGetConfigurationDWORD=fMFGetConfigurationDWORD @77 + MFGetConfigurationPolicy=fMFGetConfigurationPolicy @78 + MFGetConfigurationStore=fMFGetConfigurationStore @79 + MFGetConfigurationString=fMFGetConfigurationString @80 + MFGetPlaneSize=fMFGetPlaneSize @81 + MFGetPlatform=fMFGetPlatform @82 + MFGetPrivateWorkqueues=fMFGetPrivateWorkqueues @83 + MFGetStrideForBitmapInfoHeader=fMFGetStrideForBitmapInfoHeader @84 + MFGetSupportedMimeTypes=fMFGetSupportedMimeTypes @85 + MFGetSupportedSchemes=fMFGetSupportedSchemes @86 + MFGetSystemTime=fMFGetSystemTime @87 + MFGetTimerPeriodicity=fMFGetTimerPeriodicity @88 + MFGetUncompressedVideoFormat=fMFGetUncompressedVideoFormat @89 + MFGetWorkQueueMMCSSTaskId=fMFGetWorkQueueMMCSSTaskId @90 + MFHeapAlloc=fMFHeapAlloc @91 + MFHeapFree=fMFHeapFree @92 + MFInitAMMediaTypeFromMFMediaType=fMFInitAMMediaTypeFromMFMediaType @93 + MFInitAttributesFromBlob=fMFInitAttributesFromBlob @94 + MFInitMediaTypeFromAMMediaType=fMFInitMediaTypeFromAMMediaType @95 + MFInitMediaTypeFromMFVideoFormat=fMFInitMediaTypeFromMFVideoFormat @96 + MFInitMediaTypeFromVideoInfoHeader=fMFInitMediaTypeFromVideoInfoHeader @97 + MFInitMediaTypeFromVideoInfoHeader2=fMFInitMediaTypeFromVideoInfoHeader2 @98 + MFInitMediaTypeFromWaveFormatEx=fMFInitMediaTypeFromWaveFormatEx @99 + MFInitVideoFormat=fMFInitVideoFormat @100 + MFInitVideoFormat_RGB=fMFInitVideoFormat_RGB @101 + MFInvokeCallback=fMFInvokeCallback @102 + MFJoinIoPort=fMFJoinIoPort @103 + MFJoinWorkQueue=fMFJoinWorkQueue @104 + MFLockDXGIDeviceManager=fMFLockDXGIDeviceManager @105 + MFLockPlatform=fMFLockPlatform @106 + MFLockSharedWorkQueue=fMFLockSharedWorkQueue @107 + MFLockWorkQueue=fMFLockWorkQueue @108 + MFMapDX9FormatToDXGIFormat=fMFMapDX9FormatToDXGIFormat @109 + MFMapDXGIFormatToDX9Format=fMFMapDXGIFormatToDX9Format @110 + MFPutWaitingWorkItem=fMFPutWaitingWorkItem @111 + MFPutWorkItem=fMFPutWorkItem @112 + MFPutWorkItem2=fMFPutWorkItem2 @113 + MFPutWorkItemEx=fMFPutWorkItemEx @114 + MFPutWorkItemEx2=fMFPutWorkItemEx2 @115 + MFRemovePeriodicCallback=fMFRemovePeriodicCallback @116 + MFResetDXGIDeviceManagerX=fMFResetDXGIDeviceManagerX @117 + MFScheduleWorkItem=fMFScheduleWorkItem @118 + MFScheduleWorkItemEx=fMFScheduleWorkItemEx @119 + MFSerializeAttributesToStream=fMFSerializeAttributesToStream @120 + MFSerializeEvent=fMFSerializeEvent @121 + MFSerializeMediaTypeToStream=fMFSerializeMediaTypeToStream @122 + MFSerializePresentationDescriptor=fMFSerializePresentationDescriptor @123 + MFShutdown=fMFShutdown @124 + MFStartup=fMFStartup @125 + MFTEnumEx=fMFTEnumEx @126 + MFTraceError=fMFTraceError @127 + MFTraceFuncEnter=fMFTraceFuncEnter @128 + MFUnblockThread=fMFUnblockThread @129 + MFUnjoinWorkQueue=fMFUnjoinWorkQueue @130 + MFUnlockDXGIDeviceManager=fMFUnlockDXGIDeviceManager @131 + MFUnlockPlatform=fMFUnlockPlatform @132 + MFUnlockWorkQueue=fMFUnlockWorkQueue @133 + MFUnwrapMediaType=fMFUnwrapMediaType @134 + MFValidateMediaTypeSize=fMFValidateMediaTypeSize @135 + MFWrapMediaType=fMFWrapMediaType @136 + MFllMulDiv=fMFllMulDiv @137 + PropVariantFromStream=fPropVariantFromStream @138 + PropVariantToStream=fPropVariantToStream @139 + ValidateWaveFormat=fValidateWaveFormat @140 diff --git a/dlls/mfplat/mfplat.vcxproj b/dlls/mfplat/mfplat.vcxproj index 284b829..c609e07 100644 --- a/dlls/mfplat/mfplat.vcxproj +++ b/dlls/mfplat/mfplat.vcxproj @@ -16,6 +16,7 @@ {a67d1cec-9f56-4d53-97c2-88badeddb22d} mfplat 10.0 + mfplat @@ -33,6 +34,7 @@ + @@ -57,7 +59,7 @@ true _DEBUG;MFPLAT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true - Use + NotUsing pch.h stdcpp17 @@ -65,7 +67,8 @@ Windows true false - Exports.def + mfplat.def + $(CoreLibraryDependencies);%(AdditionalDependencies);mfplat.lib @@ -76,7 +79,7 @@ true NDEBUG;MFPLAT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true - Use + NotUsing pch.h @@ -85,25 +88,21 @@ true true false - Exports.def + mfplat.def + $(CoreLibraryDependencies);%(AdditionalDependencies);mfplat.lib - - - - - + + Document + + - - - Create - Create - + \ No newline at end of file diff --git a/dlls/mfplat/mfplat.vcxproj.filters b/dlls/mfplat/mfplat.vcxproj.filters index 8b79237..e1fe3cd 100644 --- a/dlls/mfplat/mfplat.vcxproj.filters +++ b/dlls/mfplat/mfplat.vcxproj.filters @@ -1,15 +1,12 @@  - - - - - - - + + + + \ No newline at end of file diff --git a/dlls/mfplat/pch.cpp b/dlls/mfplat/pch.cpp deleted file mode 100644 index 64b7eef..0000000 --- a/dlls/mfplat/pch.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// pch.cpp: source file corresponding to the pre-compiled header - -#include "pch.h" - -// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/dlls/mfplat/pch.h b/dlls/mfplat/pch.h deleted file mode 100644 index 885d5d6..0000000 --- a/dlls/mfplat/pch.h +++ /dev/null @@ -1,13 +0,0 @@ -// pch.h: This is a precompiled header file. -// Files listed below are compiled only once, improving build performance for future builds. -// This also affects IntelliSense performance, including code completion and many code browsing features. -// However, files listed here are ALL re-compiled if any one of them is updated between builds. -// Do not add files here that you will be updating frequently as this negates the performance advantage. - -#ifndef PCH_H -#define PCH_H - -// add headers that you want to pre-compile here -#include "framework.h" - -#endif //PCH_H diff --git a/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.RealTimeActivity.RealTimeActivityService.cpp b/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.RealTimeActivity.RealTimeActivityService.cpp index a71d5ef..763cf3e 100644 --- a/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.RealTimeActivity.RealTimeActivityService.cpp +++ b/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.RealTimeActivity.RealTimeActivityService.cpp @@ -29,7 +29,7 @@ namespace winrt::Microsoft::Xbox::Services::RealTimeActivity::implementation } void RealTimeActivityService::Deactivate() { - throw hresult_not_implemented(); + printf("[RealTimeActivityService] Deactivate (function is stubbed)\n"); } winrt::event_token RealTimeActivityService::RealTimeActivityConnectionStateChange(winrt::Windows::Foundation::EventHandler const& __param0) { diff --git a/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.XboxLiveContext.cpp b/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.XboxLiveContext.cpp index 9f6653b..93f46d8 100644 --- a/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.XboxLiveContext.cpp +++ b/dlls/winrt_x/Implementation/Microsoft.Xbox.Services.XboxLiveContext.cpp @@ -4,6 +4,7 @@ #include "Microsoft.Xbox.Services.Presence.PresenceService.h" #include "Microsoft.Xbox.Services.XboxLiveContext.g.cpp" #include "Microsoft.Xbox.Services.Multiplayer.MultiplayerService.h" +#include "Microsoft.Xbox.Services.RealTimeActivity.RealTimeActivityService.h" #include "Microsoft.Xbox.Services.Social.SocialService.h" #include "Microsoft.Xbox.Services.UserStatistics.UserStatisticsService.h" @@ -83,8 +84,7 @@ namespace winrt::Microsoft::Xbox::Services::implementation } winrt::Microsoft::Xbox::Services::RealTimeActivity::RealTimeActivityService XboxLiveContext::RealTimeActivityService() { - printf("!!!!! Microsoft.Xbox.Services.XboxLiveContext [RealTimeActivityService] NOT IMPLEMENTED !!!!\n"); - throw hresult_not_implemented(); + return winrt::make( ); } winrt::Microsoft::Xbox::Services::Presence::PresenceService XboxLiveContext::PresenceService() { diff --git a/dlls/winrt_x/Implementation/Windows.Xbox.ApplicationModel.Store.Product.cpp b/dlls/winrt_x/Implementation/Windows.Xbox.ApplicationModel.Store.Product.cpp index c855298..0e0710e 100644 --- a/dlls/winrt_x/Implementation/Windows.Xbox.ApplicationModel.Store.Product.cpp +++ b/dlls/winrt_x/Implementation/Windows.Xbox.ApplicationModel.Store.Product.cpp @@ -47,13 +47,11 @@ namespace winrt::Windows::Xbox::ApplicationModel::Store::implementation winrt::Windows::Foundation::IAsyncOperation Product::CheckPrivilegeAsync(winrt::Windows::Xbox::System::IUser user, uint32_t privilegeId, bool attemptResolution, hstring friendlyDisplay) { auto args = winrt::make( ); - m_productPurchasedEvent(args); co_return PrivilegeCheckResult::NoIssue; } winrt::Windows::Foundation::IAsyncOperation Product::CheckPrivilegesAsync(winrt::Windows::Xbox::System::IUser user, winrt::Windows::Foundation::Collections::IVectorView privilegeIds, bool attemptResolution, hstring friendlyDisplay) { auto args = winrt::make( ); - m_productPurchasedEvent(args); co_return PrivilegeCheckResult::NoIssue; } winrt::event_token Product::ProductPurchased(winrt::Windows::Xbox::ApplicationModel::Store::ProductPurchasedEventHandler const& handler) diff --git a/symlink.ps1 b/symlink.ps1 index 709c4e4..c0f13cc 100644 --- a/symlink.ps1 +++ b/symlink.ps1 @@ -15,7 +15,7 @@ make-link("d3d11_x.dll") make-link("etwplus.dll") make-link("kernelx.dll") make-link("mfplat.dll") -#make-link("MMDevAPI.dll") +make-link("MMDevAPI.dll") make-link("XboxIntegratedMultiplayer.dll") make-link("xg_x.dll") make-link("XFrontPanelDisplay.dll") From 7f7fd9f090c8cd72c77025ca4b8910457f68f5d5 Mon Sep 17 00:00:00 2001 From: Unixian <48267798+notunixian@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:35:58 -0500 Subject: [PATCH 2/4] minor changes to push up --- dlls/AcpHal/AcpHal.cpp | 118 +++++++++++++++++- dlls/d3d11_x/overlay/overlay.cpp | 1 - dlls/kernelx/CurrentAppWrapper.cpp | 68 +++++++++- dlls/kernelx/CurrentAppWrapper.hpp | 55 +++----- dlls/kernelx/dllmain.cpp | 1 - .../Windows.Xbox.System.User.cpp | 2 +- 6 files changed, 199 insertions(+), 46 deletions(-) diff --git a/dlls/AcpHal/AcpHal.cpp b/dlls/AcpHal/AcpHal.cpp index 3f471bb..00a41b3 100644 --- a/dlls/AcpHal/AcpHal.cpp +++ b/dlls/AcpHal/AcpHal.cpp @@ -1,14 +1,124 @@ #include "pch.h" #include "AcpHal.h" + +#include +#include #include -struct IAcpHal; +#include "contexts.h" -HRESULT AcpHalAllocateShapeContexts_X(__int64 a1) { - return 0; +struct SHAPE_CONTEXTS { + UINT32 numSrcContexts; + UINT32 numEqCompContexts; + UINT32 numFiltVolContexts; + UINT32 numDmaContexts; + UINT32 numXmaContexts; + UINT32 numPcmContexts; + SHAPE_SRC_CONTEXT* srcContextArray; + SHAPE_EQCOMP_CONTEXT* eqCompContextArray; + SHAPE_FILTVOL_CONTEXT* filtVolContextArray; + SHAPE_DMA_CONTEXT* dmaContextArray; + SHAPE_XMA_CONTEXT* xmaContextArray; + SHAPE_PCM_CONTEXT* pcmContextArray; + APU_ADDRESS apuSrcContextArray; + APU_ADDRESS apuEqCompContextArray; + APU_ADDRESS apuFiltVolContextArray; + APU_ADDRESS apuDmaContextArray; + APU_ADDRESS apuXmaContextArray; + APU_ADDRESS apuPcmContextArray; +}; + +DECLARE_INTERFACE(IAcpHal) +{ + STDMETHOD(Connect)(THIS_ UINT32 numCommands,UINT32 numMessages) PURE; + STDMETHOD(Disconnect)(THIS) PURE; + STDMETHOD(SubmitCommand)(THIS_ ACP_COMMAND_TYPE command, UINT64 commandId, UINT32 audioFrame, _In_opt_ const void* data = nullptr, _In_opt_ APU_ADDRESS notification = 0) PURE; + _Success_(return) STDMETHOD_(bool, PopMessage)(THIS_ _Out_ ACP_MESSAGE * message) PURE; + STDMETHOD_(UINT32, GetNumMessages)(THIS) PURE; + STDMETHOD_(void, Release)(THIS) PURE; +}; + + +class AcpHal : public IAcpHal { +public: + HRESULT Connect(UINT32 numCommands, UINT32 numMessages) override + { + printf("[AcpHal] Connect\n"); + return S_OK; + } + + HRESULT Disconnect() override + { + printf("[AcpHal] Disconnect\n"); + return S_OK; + } + + HRESULT SubmitCommand(ACP_COMMAND_TYPE command, UINT64 commandId, UINT32 audioFrame, const void* data, + APU_ADDRESS notification) override + { + printf("[AcpHal] SubmitCommand\n"); + + if (notification != 0) + *reinterpret_cast(notification) = 1; + + return S_OK; + } + + bool PopMessage(ACP_MESSAGE* message) override + { + static ACP_MESSAGE dummyMessage = { + ACP_MESSAGE_TYPE_DISCONNECTED, + 0, + GetTickCount() + }; + + *message = dummyMessage; + return true; + } + + UINT32 GetNumMessages() override + { + printf("[AcpHal] GetNumMessages\n"); + return 0; + } + + void Release() override + { + printf("[AcpHal] Release\n"); + } + +private: + UINT32 m_numCommands; + UINT32 m_numMessages; + +}; + + +HRESULT AcpHalAllocateShapeContexts_X(SHAPE_CONTEXTS* ctx) { + if (ctx->numSrcContexts > 0) + ctx->srcContextArray = static_cast(malloc(sizeof(SHAPE_SRC_CONTEXT) * ctx->numSrcContexts)); + + if (ctx->numEqCompContexts > 0) + ctx->eqCompContextArray = static_cast(malloc(sizeof(SHAPE_EQCOMP_CONTEXT) * ctx->numEqCompContexts)); + + if (ctx->numFiltVolContexts > 0) + ctx->filtVolContextArray = static_cast(malloc(sizeof(SHAPE_FILTVOL_CONTEXT) * ctx->numFiltVolContexts)); + + if (ctx->numDmaContexts > 0) + ctx->dmaContextArray = static_cast(malloc(sizeof(SHAPE_DMA_CONTEXT) * ctx->numDmaContexts)); + + if (ctx->numXmaContexts > 0) + ctx->xmaContextArray = static_cast(malloc(sizeof(SHAPE_XMA_CONTEXT) * ctx->numXmaContexts)); + + if (ctx->numPcmContexts > 0) + ctx->pcmContextArray = static_cast(malloc(sizeof(SHAPE_PCM_CONTEXT) * ctx->numPcmContexts)); + + printf("[AcpHal] allocated shape contexts\n"); + return S_OK; } -HRESULT AcpHalCreate_X(IAcpHal* a1) { +HRESULT AcpHalCreate_X(IAcpHal** acpInterface) { + *acpInterface = new AcpHal( ); return 0; } diff --git a/dlls/d3d11_x/overlay/overlay.cpp b/dlls/d3d11_x/overlay/overlay.cpp index 49ff125..6125f4f 100644 --- a/dlls/d3d11_x/overlay/overlay.cpp +++ b/dlls/d3d11_x/overlay/overlay.cpp @@ -21,7 +21,6 @@ WinDurango::Overlay::~Overlay() m_pSwapchain = nullptr; } -// This should be called when Run is called by the game inside the wrapper. void WinDurango::Overlay::Initialize() { g_KeyboardFinished = CreateEventA(NULL, FALSE, FALSE, "KeyboardFinished"); diff --git a/dlls/kernelx/CurrentAppWrapper.cpp b/dlls/kernelx/CurrentAppWrapper.cpp index 64806f9..4e0b295 100644 --- a/dlls/kernelx/CurrentAppWrapper.cpp +++ b/dlls/kernelx/CurrentAppWrapper.cpp @@ -1,6 +1,56 @@ #include "pch.h" #include "CurrentAppWrapper.hpp" +HRESULT XboxUserLicenseInformationWrapperX::QueryInterface(const IID& riid, void** ppvObject) +{ + if (riid == __uuidof(IXboxUserLicenseInformation)) + { + *ppvObject = reinterpret_cast(this); + AddRef(); + return S_OK; + } + + *ppvObject = nullptr; + return E_NOINTERFACE; +} + +ULONG XboxUserLicenseInformationWrapperX::AddRef() +{ + return InterlockedIncrement(&m_RefCount); +} + +ULONG XboxUserLicenseInformationWrapperX::Release() +{ + ULONG refCount = InterlockedDecrement(&m_RefCount); + if (refCount == 0) + { + delete this; + } + return refCount; +} + +HRESULT XboxUserLicenseInformationWrapperX::GetIids(ULONG* iidCount, IID** iids) +{ + return E_NOTIMPL; +} + +HRESULT XboxUserLicenseInformationWrapperX::GetRuntimeClassName(HSTRING* className) +{ + return E_NOTIMPL; +} + +HRESULT XboxUserLicenseInformationWrapperX::GetTrustLevel(TrustLevel* trustLevel) +{ + return E_NOTIMPL; +} + +HRESULT XboxUserLicenseInformationWrapperX::get_CurrentLicenseUserXuid(winrt::hstring* value) +{ + printf("[XboxUserLicenseInformationWrapperX] get_CurrentLicenseUserXuid\n"); + *value = winrt::to_hstring(123); + return S_OK; +} + HRESULT LicenseInformationWrapperX::QueryInterface(const IID& riid, void** ppvObject) { if (riid == __uuidof(ILicenseInformationX)) @@ -10,6 +60,13 @@ HRESULT LicenseInformationWrapperX::QueryInterface(const IID& riid, void** ppvOb return S_OK; } + if (riid == __uuidof(IXboxUserLicenseInformation)) + { + *ppvObject = reinterpret_cast(new XboxUserLicenseInformationWrapperX()); + AddRef(); + return S_OK; + } + HRESULT hr = m_realLicenseInformation->QueryInterface(riid, ppvObject); if (FAILED(hr)) { @@ -17,7 +74,7 @@ HRESULT LicenseInformationWrapperX::QueryInterface(const IID& riid, void** ppvOb OLECHAR iidwstr[sizeof(iidstr)]; StringFromGUID2(riid, iidwstr, ARRAYSIZE(iidwstr)); WideCharToMultiByte(CP_UTF8, 0, iidwstr, -1, iidstr, sizeof(iidstr), nullptr, nullptr); - printf("[CurrentAppWrapperX] Interface Not Implemented: %s\n", iidstr); + printf("[LicenseInformationWrapperX] Interface Not Implemented: %s\n", iidstr); } *ppvObject = nullptr; @@ -66,7 +123,8 @@ HRESULT LicenseInformationWrapperX::get_ProductLicenses( HRESULT LicenseInformationWrapperX::get_IsActive(boolean* value) { printf("[LicenseInformationWrapperX] get_IsActive\n"); - return E_NOTIMPL; + *value = true; + return S_OK; } HRESULT LicenseInformationWrapperX::get_IsTrial(boolean* value) @@ -79,7 +137,11 @@ HRESULT LicenseInformationWrapperX::get_IsTrial(boolean* value) HRESULT LicenseInformationWrapperX::get_ExpirationDate(ABI::Windows::Foundation::DateTime* value) { printf("[LicenseInformationWrapperX] get_ExpirationDate\n"); - return E_NOTIMPL; + DateTime time; + time.UniversalTime = UINT64_MAX; + + *value = time; + return S_OK; } HRESULT LicenseInformationWrapperX::add_LicenseChanged( diff --git a/dlls/kernelx/CurrentAppWrapper.hpp b/dlls/kernelx/CurrentAppWrapper.hpp index 082f066..dad69a6 100644 --- a/dlls/kernelx/CurrentAppWrapper.hpp +++ b/dlls/kernelx/CurrentAppWrapper.hpp @@ -60,42 +60,25 @@ public: ) = 0; }; -//class LicenseInformationWrapperX : public RuntimeClass { -//public: -// LicenseInformationWrapperX(ComPtr realFactory) -// : m_realFactory(realFactory) -// { -// HRESULT hr = m_realFactory.As(&m_realLicenseInformation); -// if (FAILED(hr)) { -// return; -// } -// } -// HRESULT QueryInterface(const IID& riid, void** ppvObject) override; -// ULONG AddRef() override; -// ULONG Release() override; -// HRESULT GetIids(ULONG* iidCount, IID** iids) override; -// HRESULT GetRuntimeClassName(HSTRING* className) override; -// HRESULT GetTrustLevel(TrustLevel* trustLevel) override; -// HRESULT STDMETHODCALLTYPE get_ProductLicenses( -// __FIMapView_2_HSTRING_Windows__CApplicationModel__CStore__CProductLicense** value -// ) override; -// HRESULT STDMETHODCALLTYPE get_IsActive( -// boolean* value -// ) override; -// HRESULT STDMETHODCALLTYPE get_IsTrial( -// boolean* value -// ) override; -// HRESULT STDMETHODCALLTYPE get_ExpirationDate( -// ABI::Windows::Foundation::DateTime* value -// ) override; -// HRESULT STDMETHODCALLTYPE add_LicenseChanged( -// ABI::Windows::ApplicationModel::Store::ILicenseChangedEventHandler* handler, -// EventRegistrationToken* cookie -// ) override; -// HRESULT STDMETHODCALLTYPE remove_LicenseChanged( -// EventRegistrationToken cookie -// ) override; -//}; +MIDL_INTERFACE("AA98C583-A3C8-4F51-A5BC-463AE0C23EAA") +IXboxUserLicenseInformation : public IInspectable +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_CurrentLicenseUserXuid(winrt::hstring* value) = 0; +}; + +class XboxUserLicenseInformationWrapperX : public IXboxUserLicenseInformation +{ + HRESULT QueryInterface(REFIID riid, void** ppvObject) override; + ULONG AddRef() override; + ULONG Release() override; + HRESULT GetIids(ULONG* iidCount, IID** iids) override; + HRESULT GetRuntimeClassName(HSTRING* className) override; + HRESULT GetTrustLevel(TrustLevel* trustLevel) override; + HRESULT STDMETHODCALLTYPE get_CurrentLicenseUserXuid(winrt::hstring* value) override; +private: + long m_RefCount = 1; +}; class LicenseInformationWrapperX : public ILicenseInformationX { diff --git a/dlls/kernelx/dllmain.cpp b/dlls/kernelx/dllmain.cpp index 1246049..3b87d99 100644 --- a/dlls/kernelx/dllmain.cpp +++ b/dlls/kernelx/dllmain.cpp @@ -15,7 +15,6 @@ std::vector loadedMods; inline void LoadMods() { - WCHAR path[MAX_PATH]; GetModuleFileNameW(GetModuleHandleW(nullptr), path, MAX_PATH); PathRemoveFileSpecW(path); diff --git a/dlls/winrt_x/Implementation/Windows.Xbox.System.User.cpp b/dlls/winrt_x/Implementation/Windows.Xbox.System.User.cpp index 082020e..4b8f839 100644 --- a/dlls/winrt_x/Implementation/Windows.Xbox.System.User.cpp +++ b/dlls/winrt_x/Implementation/Windows.Xbox.System.User.cpp @@ -151,7 +151,7 @@ namespace winrt::Windows::Xbox::System::implementation winrt::Windows::Foundation::Collections::IVectorView User::Controllers() { printf("!!!! Windows.Xbox.System.User Controllers | NOT IMPLEMENTED !!!!\n"); - throw hresult_not_implemented(); + return winrt::single_threaded_vector( ).GetView( ); } winrt::Windows::Xbox::System::UserDisplayInfo User::DisplayInfo() { From fbc694affdd6eee4b1e85a1722f388b34cefcb6c Mon Sep 17 00:00:00 2001 From: Unixian <48267798+notunixian@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:42:12 -0500 Subject: [PATCH 3/4] fix build --- dlls/AcpHal/AcpHal.cpp | 95 ++++-------------------------------------- thirdparty/Detours | 2 +- 2 files changed, 9 insertions(+), 88 deletions(-) diff --git a/dlls/AcpHal/AcpHal.cpp b/dlls/AcpHal/AcpHal.cpp index f844053..919b6f5 100644 --- a/dlls/AcpHal/AcpHal.cpp +++ b/dlls/AcpHal/AcpHal.cpp @@ -29,71 +29,6 @@ struct SHAPE_CONTEXTS { APU_ADDRESS apuPcmContextArray; }; -DECLARE_INTERFACE(IAcpHal) -{ - STDMETHOD(Connect)(THIS_ UINT32 numCommands,UINT32 numMessages) PURE; - STDMETHOD(Disconnect)(THIS) PURE; - STDMETHOD(SubmitCommand)(THIS_ ACP_COMMAND_TYPE command, UINT64 commandId, UINT32 audioFrame, _In_opt_ const void* data = nullptr, _In_opt_ APU_ADDRESS notification = 0) PURE; - _Success_(return) STDMETHOD_(bool, PopMessage)(THIS_ _Out_ ACP_MESSAGE * message) PURE; - STDMETHOD_(UINT32, GetNumMessages)(THIS) PURE; - STDMETHOD_(void, Release)(THIS) PURE; -}; - - -class AcpHal : public IAcpHal { -public: - HRESULT Connect(UINT32 numCommands, UINT32 numMessages) override - { - printf("[AcpHal] Connect\n"); - return S_OK; - } - - HRESULT Disconnect() override - { - printf("[AcpHal] Disconnect\n"); - return S_OK; - } - - HRESULT SubmitCommand(ACP_COMMAND_TYPE command, UINT64 commandId, UINT32 audioFrame, const void* data, - APU_ADDRESS notification) override - { - printf("[AcpHal] SubmitCommand\n"); - - if (notification != 0) - *reinterpret_cast(notification) = 1; - - return S_OK; - } - - bool PopMessage(ACP_MESSAGE* message) override - { - static ACP_MESSAGE dummyMessage = { - ACP_MESSAGE_TYPE_DISCONNECTED, - 0, - GetTickCount() - }; - - *message = dummyMessage; - return true; - } - - UINT32 GetNumMessages() override - { - printf("[AcpHal] GetNumMessages\n"); - return 0; - } - - void Release() override - { - printf("[AcpHal] Release\n"); - } - -private: - UINT32 m_numCommands; - UINT32 m_numMessages; - -}; - HRESULT AcpHalAllocateShapeContexts_X(SHAPE_CONTEXTS* ctx) { if (ctx->numSrcContexts > 0) @@ -118,8 +53,14 @@ HRESULT AcpHalAllocateShapeContexts_X(SHAPE_CONTEXTS* ctx) { return S_OK; } +HRESULT AcpHalReleaseShapeContexts_X() { + DEBUG_PRINT( ); + return S_OK; +} + HRESULT AcpHalCreate_X(IAcpHal** acpInterface) { - *acpInterface = new AcpHal( ); + printf("[WARNING] AcpHalCreate returns back a nullptr, the game is likely to crash!\n"); + *acpInterface = nullptr; return 0; } @@ -136,22 +77,6 @@ HRESULT ApuAlloc_X( return 0; } -HRESULT ApuAlloc_X( - void** virtualAddress, - UINT32* physicalAddress, - UINT32 sizeInBytes, - UINT32 alignmentInBytes, - UINT32 flags -) -{ - *virtualAddress = malloc(sizeInBytes); - - if (physicalAddress != nullptr) - *physicalAddress = 0; - - return 0; -} - HRESULT ApuCreateHeap_X(size_t initialSize, size_t maximumSize) { // Don't think we need that as this is for chaning memory pool iirc... return 0; @@ -187,11 +112,7 @@ APU_ADDRESS ApuMapVirtualAddress_X( DEBUG_PRINT( ); return 0; } -HRESULT AcpHalCreate_X(IAcpHal** acp) -{ - DEBUG_PRINT( ); - return 0; -} + void* ApuMapApuAddress_X( APU_ADDRESS apuPhysicalAddress ) diff --git a/thirdparty/Detours b/thirdparty/Detours index 2df406e..09e0356 160000 --- a/thirdparty/Detours +++ b/thirdparty/Detours @@ -1 +1 @@ -Subproject commit 2df406eda2bfa3e4c11b10b191b243b369f26943 +Subproject commit 09e035677dfd566280b65f36b9c017b6ed51537a From 759e4e6f60c0b8bbbd8ae8c653ca8f0c8d8b2263 Mon Sep 17 00:00:00 2001 From: Unixian <48267798+notunixian@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:56:40 -0500 Subject: [PATCH 4/4] add back overlay/keyboard --- dlls/d3d11_x/d3d11_x.cpp | 6 +- dlls/d3d11_x/dxgi_factory.cpp | 11 +- dlls/d3d11_x/dxgi_swapchain.cpp | 7 + dlls/d3d11_x/overlay/overlay.cpp | 236 +++++++++++++++---------------- dlls/d3d11_x/overlay/overlay.h | 2 +- 5 files changed, 139 insertions(+), 123 deletions(-) diff --git a/dlls/d3d11_x/d3d11_x.cpp b/dlls/d3d11_x/d3d11_x.cpp index 8269106..d63d3ae 100644 --- a/dlls/d3d11_x/d3d11_x.cpp +++ b/dlls/d3d11_x/d3d11_x.cpp @@ -407,7 +407,7 @@ void WD11XNotify_X(WDEVENT_TYPE event) throw std::exception("this shouldn't happen, check code that sends events."); case WDEVENT_TYPE_KEYBOARD_ENGAGE: printf("[d3d11_x] keyboard engage\n"); - WinDurango::g_Overlay->EnableKeyboard( ); + wd::g_Overlay->EnableKeyboard( ); break; } } @@ -416,7 +416,7 @@ void WDWaitForKeyboard(const char** outText) { printf("[d3d11_x] waiting for keyboard\n"); - WaitForSingleObject(WinDurango::g_KeyboardFinished, INFINITE); + WaitForSingleObject(wd::g_KeyboardFinished, INFINITE); - *outText = WinDurango::g_KeyboardText; + *outText = wd::g_KeyboardText; } \ No newline at end of file diff --git a/dlls/d3d11_x/dxgi_factory.cpp b/dlls/d3d11_x/dxgi_factory.cpp index 2093ab6..c1a8596 100644 --- a/dlls/d3d11_x/dxgi_factory.cpp +++ b/dlls/d3d11_x/dxgi_factory.cpp @@ -5,6 +5,8 @@ #include "dxgi_swapchain.h" #include "../kernelx/CoreWindowWrapperX.h" +#include "overlay/overlay.h" +#include #define DXGI_SWAPCHAIN_FLAG_MASK DXGI_SWAP_CHAIN_FLAG_NONPREROTATED | DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH | DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE \ | DXGI_SWAP_CHAIN_FLAG_RESTRICTED_CONTENT | DXGI_SWAP_CHAIN_FLAG_RESTRICT_SHARED_RESOURCE_DRIVER | DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT \ @@ -43,7 +45,7 @@ HRESULT wd::dxgi_factory::CreateSwapChainForCoreWindow(IGraphicsUnknown* pDevice pDesc->Flags &= DXGI_SWAPCHAIN_FLAG_MASK; pDesc->Scaling = DXGI_SCALING_ASPECT_RATIO_STRETCH; - IUnknown* pRealDevice = nullptr; + ::ID3D11Device2* pRealDevice = nullptr; hr = pDevice->QueryInterface(__uuidof(wdi::IGraphicsUnwrap), (void**)&pRealDevice); if (FAILED(hr)) { @@ -72,6 +74,13 @@ HRESULT wd::dxgi_factory::CreateSwapChainForCoreWindow(IGraphicsUnknown* pDevice } // TODO: init overlay + if (wd::g_Overlay == nullptr) { + ::ID3D11DeviceContext* ctx = nullptr; + pRealDevice->GetImmediateContext(&ctx); + + wd::g_Overlay = new wd::Overlay(pRealDevice, ctx, swap); + wd::g_Overlay->Initialize( ); + } return hr; } diff --git a/dlls/d3d11_x/dxgi_swapchain.cpp b/dlls/d3d11_x/dxgi_swapchain.cpp index 37762cc..94cfff4 100644 --- a/dlls/d3d11_x/dxgi_swapchain.cpp +++ b/dlls/d3d11_x/dxgi_swapchain.cpp @@ -1,6 +1,7 @@ #include "dxgi_swapchain.h" #include "resource.hpp" +#include "overlay/overlay.h" HRESULT wd::dxgi_swapchain::QueryInterface(const IID& riid, void** ppvObject) { @@ -34,6 +35,9 @@ HRESULT wd::dxgi_swapchain::GetDevice(const IID& riid, void** ppDevice) HRESULT wd::dxgi_swapchain::Present(UINT SyncInterval, UINT Flags) { + if (wd::g_Overlay) + wd::g_Overlay->Present( ); + return wrapped_interface->Present(SyncInterval, Flags); } @@ -138,6 +142,9 @@ HRESULT wd::dxgi_swapchain::GetCoreWindow(const IID& refiid, void** ppUnk) HRESULT wd::dxgi_swapchain::Present1(UINT SyncInterval, UINT PresentFlags, const DXGI_PRESENT_PARAMETERS* pPresentParameters) { + if (wd::g_Overlay) + wd::g_Overlay->Present( ); + return wrapped_interface->Present1(SyncInterval, PresentFlags, pPresentParameters); } diff --git a/dlls/d3d11_x/overlay/overlay.cpp b/dlls/d3d11_x/overlay/overlay.cpp index 70f6e13..87983ed 100644 --- a/dlls/d3d11_x/overlay/overlay.cpp +++ b/dlls/d3d11_x/overlay/overlay.cpp @@ -5,7 +5,7 @@ #include "../../../thirdparty/imgui_impl_uwp.h" #include -WinDurango::Overlay::Overlay(ID3D11Device* pDevice, ID3D11DeviceContext* pContext, IDXGISwapChain1* pSwapchain): +wd::Overlay::Overlay(ID3D11Device* pDevice, ID3D11DeviceContext* pContext, IDXGISwapChain1* pSwapchain): m_pRenderTargetView(nullptr) { m_pDevice = pDevice; @@ -13,7 +13,7 @@ WinDurango::Overlay::Overlay(ID3D11Device* pDevice, ID3D11DeviceContext* pContex m_pSwapchain = pSwapchain; } -WinDurango::Overlay::~Overlay() +wd::Overlay::~Overlay() { Shutdown( ); m_pDevice = nullptr; @@ -21,7 +21,7 @@ WinDurango::Overlay::~Overlay() m_pSwapchain = nullptr; } -void WinDurango::Overlay::Initialize() +void wd::Overlay::Initialize() { g_KeyboardFinished = CreateEventA(NULL, FALSE, FALSE, "KeyboardFinished"); @@ -44,19 +44,19 @@ void WinDurango::Overlay::Initialize() ImGui_ImplDX11_Init(m_pDevice, m_pContext); } -void WinDurango::Overlay::Shutdown() +void wd::Overlay::Shutdown() { ImGui_ImplDX11_Shutdown( ); ImGui_ImplUwp_Shutdown( ); ImGui::DestroyContext( ); } -void WinDurango::Overlay::EnableKeyboard() +void wd::Overlay::EnableKeyboard() { m_bKeyboard = true; } -void WinDurango::Overlay::Present( ) +void wd::Overlay::Present( ) { ImGui_ImplDX11_NewFrame( ); ImGui_ImplUwp_NewFrame( ); @@ -65,123 +65,123 @@ void WinDurango::Overlay::Present( ) if (m_bKeyboard) { ImGui::SetNextWindowSize(ImVec2(500, 300)); - ImGui::Begin("WinDurango Keyboard Input", &m_bKeyboard, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + ImGui::Begin("WinDurango Keyboard Input", nullptr, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - //static bool isUppercase = false; - //static bool isSymbols = false; + static bool isUppercase = false; + static bool isSymbols = false; - //const char* keys[] = { - // "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", - // "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]", - // "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", - // "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/" - //}; + const char* keys[] = { + "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", + "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]", + "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", + "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/" + }; - //const char* symbols[] = { - // "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", - // "~", "`", "|", "\\", "{", "}", "[", "]", ":", ";", "\"", "'", - // "<", ">", "?", "/", ",", ".", "=", "-" - //}; + const char* symbols[] = { + "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", + "~", "`", "|", "\\", "{", "}", "[", "]", ":", ";", "\"", "'", + "<", ">", "?", "/", ",", ".", "=", "-" + }; ImGui::InputText("Buffer", g_KeyboardText, IM_ARRAYSIZE(g_KeyboardText)); - //if (ImGui::Button(isUppercase ? "Lowercase" : "Uppercase")) - //{ - // isUppercase = !isUppercase; - //} - //ImGui::SameLine(); - //if (ImGui::Button(isSymbols ? "Letters" : "Symbols")) - //{ - // isSymbols = !isSymbols; - //} - //ImGui::NewLine(); + if (ImGui::Button(isUppercase ? "Lowercase" : "Uppercase")) + { + isUppercase = !isUppercase; + } + ImGui::SameLine(); + if (ImGui::Button(isSymbols ? "Letters" : "Symbols")) + { + isSymbols = !isSymbols; + } + ImGui::NewLine(); - //const char** currentKeys = isSymbols ? symbols : keys; - ImVec2 buttonSize = ImVec2(30, 30); // Set a fixed size for all buttons + const char** currentKeys = isSymbols ? symbols : keys; + ImVec2 buttonSize = ImVec2(30, 30); - //for (int i = 0; i < 12; ++i) - //{ - // if (ImGui::Button(currentKeys[i], buttonSize)) - // { - // size_t len = strlen(g_KeyboardText); - // if (len < 255) - // { - // g_KeyboardText[len] = isUppercase ? currentKeys[i][0] : tolower(currentKeys[i][0]); - // g_KeyboardText[len + 1] = '\0'; - // } - // } - // ImGui::SameLine(); - //} - //ImGui::NewLine(); + for (int i = 0; i < 12; ++i) + { + if (ImGui::Button(currentKeys[i], buttonSize)) + { + size_t len = strlen(g_KeyboardText); + if (len < 255) + { + g_KeyboardText[len] = isUppercase ? currentKeys[i][0] : tolower(currentKeys[i][0]); + g_KeyboardText[len + 1] = '\0'; + } + } + ImGui::SameLine(); + } + ImGui::NewLine(); - //for (int i = 12; i < 24; ++i) - //{ - // if (ImGui::Button(currentKeys[i], buttonSize)) - // { - // size_t len = strlen(g_KeyboardText); - // if (len < 255) - // { - // g_KeyboardText[len] = isUppercase ? currentKeys[i][0] : tolower(currentKeys[i][0]); - // g_KeyboardText[len + 1] = '\0'; - // } - // } - // ImGui::SameLine(); - //} - //ImGui::NewLine(); + for (int i = 12; i < 24; ++i) + { + if (ImGui::Button(currentKeys[i], buttonSize)) + { + size_t len = strlen(g_KeyboardText); + if (len < 255) + { + g_KeyboardText[len] = isUppercase ? currentKeys[i][0] : tolower(currentKeys[i][0]); + g_KeyboardText[len + 1] = '\0'; + } + } + ImGui::SameLine(); + } + ImGui::NewLine(); - //if (!isSymbols) - //{ - // for (int i = 24; i < 35; ++i) - // { - // if (ImGui::Button(currentKeys[ i ], buttonSize)) - // { - // size_t len = strlen(g_KeyboardText); - // if (len < 255) - // { - // g_KeyboardText[ len ] = isUppercase ? currentKeys[ i ][ 0 ] : tolower(currentKeys[ i ][ 0 ]); - // g_KeyboardText[ len + 1 ] = '\0'; - // } - // } - // ImGui::SameLine( ); - // } - //} - //else - //{ - // for (int i = 24; i < 32; ++i) - // { - // if (ImGui::Button(currentKeys[ i ], buttonSize)) - // { - // size_t len = strlen(g_KeyboardText); - // if (len < 255) - // { - // g_KeyboardText[ len ] = isUppercase ? currentKeys[ i ][ 0 ] : tolower(currentKeys[ i ][ 0 ]); - // g_KeyboardText[ len + 1 ] = '\0'; - // } - // } - // ImGui::SameLine( ); - // } - //} + if (!isSymbols) + { + for (int i = 24; i < 35; ++i) + { + if (ImGui::Button(currentKeys[ i ], buttonSize)) + { + size_t len = strlen(g_KeyboardText); + if (len < 255) + { + g_KeyboardText[ len ] = isUppercase ? currentKeys[ i ][ 0 ] : tolower(currentKeys[ i ][ 0 ]); + g_KeyboardText[ len + 1 ] = '\0'; + } + } + ImGui::SameLine( ); + } + } + else + { + for (int i = 24; i < 32; ++i) + { + if (ImGui::Button(currentKeys[ i ], buttonSize)) + { + size_t len = strlen(g_KeyboardText); + if (len < 255) + { + g_KeyboardText[ len ] = isUppercase ? currentKeys[ i ][ 0 ] : tolower(currentKeys[ i ][ 0 ]); + g_KeyboardText[ len + 1 ] = '\0'; + } + } + ImGui::SameLine( ); + } + } - //ImGui::NewLine(); + ImGui::NewLine(); - //if (!isSymbols) - //{ - // for (int i = 35; i < 44; ++i) - // { - // if (ImGui::Button(currentKeys[ i ], buttonSize)) - // { - // size_t len = strlen(g_KeyboardText); - // if (len < 255) - // { - // g_KeyboardText[ len ] = isUppercase ? currentKeys[ i ][ 0 ] : tolower(currentKeys[ i ][ 0 ]); - // g_KeyboardText[ len + 1 ] = '\0'; - // } - // } - // ImGui::SameLine( ); - // } - //} + if (!isSymbols) + { + for (int i = 35; i < 44; ++i) + { + if (ImGui::Button(currentKeys[ i ], buttonSize)) + { + size_t len = strlen(g_KeyboardText); + if (len < 255) + { + g_KeyboardText[ len ] = isUppercase ? currentKeys[ i ][ 0 ] : tolower(currentKeys[ i ][ 0 ]); + g_KeyboardText[ len + 1 ] = '\0'; + } + } + ImGui::SameLine( ); + } + } - //ImGui::NewLine(); + ImGui::NewLine(); if (ImGui::Button("OK", buttonSize) || ImGui::IsKeyPressed(ImGuiKey_GamepadStart)) { @@ -189,14 +189,14 @@ void WinDurango::Overlay::Present( ) SetEvent(g_KeyboardFinished); } - //if (ImGui::IsKeyPressed(ImGuiKey_GamepadBack)) - //{ - // size_t len = strlen(g_KeyboardText); - // if (len > 0) - // { - // g_KeyboardText[len - 1] = '\0'; - // } - //} + if (ImGui::IsKeyPressed(ImGuiKey_GamepadBack)) + { + size_t len = strlen(g_KeyboardText); + if (len > 0) + { + g_KeyboardText[len - 1] = '\0'; + } + } ImGui::End(); } diff --git a/dlls/d3d11_x/overlay/overlay.h b/dlls/d3d11_x/overlay/overlay.h index 5acdf5b..440135a 100644 --- a/dlls/d3d11_x/overlay/overlay.h +++ b/dlls/d3d11_x/overlay/overlay.h @@ -2,7 +2,7 @@ #include #include -namespace WinDurango +namespace wd { class Overlay {