diff --git a/dlls/kernelx/CoreApplicationResourceAvailabilityX.cpp b/dlls/kernelx/CoreApplicationResourceAvailabilityX.cpp new file mode 100644 index 0000000..b7c615a --- /dev/null +++ b/dlls/kernelx/CoreApplicationResourceAvailabilityX.cpp @@ -0,0 +1,19 @@ +#include "pch.h" +#include "CoreApplicationResourceAvailabilityX.h" + +INT32 CoreApplicationResourceAvailabilityX::_abi_get_ResourceAvailability(ResourceAvailability* resourceAvailability) +{ + *resourceAvailability = Full; + + return S_OK; +} + +INT32 CoreApplicationResourceAvailabilityX::_abi_add_ResourceAvailabilityChanged(__FIEventHandler_1_IInspectable* handler, EventRegistrationToken* token) +{ + return S_OK; +} + +INT32 CoreApplicationResourceAvailabilityX::_abi_remove_ResourceAvailabilityChanged(EventRegistrationToken token) +{ + return S_OK; +} \ No newline at end of file diff --git a/dlls/kernelx/CoreApplicationResourceAvailabilityX.h b/dlls/kernelx/CoreApplicationResourceAvailabilityX.h new file mode 100644 index 0000000..9ebfe56 --- /dev/null +++ b/dlls/kernelx/CoreApplicationResourceAvailabilityX.h @@ -0,0 +1,10 @@ +#pragma once +#include "ICoreApplicationResourceAvailabilityX.h" + +class CoreApplicationResourceAvailabilityX : public ICoreApplicationResourceAvailabilityX +{ +public: + virtual INT32 _abi_get_ResourceAvailability(ResourceAvailability* resourceAvailability) override; + virtual INT32 _abi_add_ResourceAvailabilityChanged(__FIEventHandler_1_IInspectable* handler, EventRegistrationToken* token) override; + virtual INT32 _abi_remove_ResourceAvailabilityChanged(EventRegistrationToken token) override; +}; \ No newline at end of file diff --git a/dlls/kernelx/CoreApplicationX.cpp b/dlls/kernelx/CoreApplicationX.cpp index ba21dee..7deb78f 100644 --- a/dlls/kernelx/CoreApplicationX.cpp +++ b/dlls/kernelx/CoreApplicationX.cpp @@ -36,11 +36,17 @@ INT32 CoreApplicationX::_abi_remove_Suspending(EventRegistrationToken token) return m_IapplicationCore->remove_Suspending(token); } -//INT32 CoreApplicationX::_abi_get_ResourceAvailability(Windows::ApplicationModel::Core::ResourceAvailability*) +INT32 CoreApplicationX::_abi_get_ResourceAvailability(ResourceAvailability* resourceAvailability) +{ + // TODO: Stubbed for now. + *resourceAvailability = Full; + + return S_OK; +} + INT32 CoreApplicationX::_abi_get_ResourceAvailability() { - //Stubbed at this moment. - return 0; + return S_OK; } INT32 CoreApplicationX::_abi_add_ResourceAvailabilityChanged(winrt::Windows::Foundation::EventHandler* handler, EventRegistrationToken* token) diff --git a/dlls/kernelx/CoreApplicationX.h b/dlls/kernelx/CoreApplicationX.h index f9d2e4f..b2a8559 100644 --- a/dlls/kernelx/CoreApplicationX.h +++ b/dlls/kernelx/CoreApplicationX.h @@ -24,6 +24,7 @@ public: INT32 _abi_remove_Resuming(EventRegistrationToken token) override; INT32 _abi_add_Suspending(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs* handler, EventRegistrationToken* token) override; INT32 _abi_remove_Suspending(EventRegistrationToken token) override; + INT32 _abi_get_ResourceAvailability(ResourceAvailability* resourceAvailability) override; INT32 _abi_get_ResourceAvailability() override; INT32 _abi_add_ResourceAvailabilityChanged(winrt::Windows::Foundation::EventHandler* handler, EventRegistrationToken* token) override; INT32 _abi_remove_ResourceAvailabilityChanged(EventRegistrationToken token) override; diff --git a/dlls/kernelx/ICoreApplicationResourceAvailabilityX.h b/dlls/kernelx/ICoreApplicationResourceAvailabilityX.h new file mode 100644 index 0000000..97a1a6f --- /dev/null +++ b/dlls/kernelx/ICoreApplicationResourceAvailabilityX.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include + +using namespace ABI::Windows::ApplicationModel; +using namespace ABI::Windows::ApplicationModel::Activation; +using namespace ABI::Windows::ApplicationModel::Core; +using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::System; + +enum ResourceAvailability : INT32 { + Full = 0x0000, + Constrained = 0x0001, + FullWithExtendedSystemReserve = 0x0002, +}; + +class ICoreApplicationResourceAvailabilityX : public IInspectable +{ +public: + virtual INT32 _abi_get_ResourceAvailability(ResourceAvailability* resourceAvailability) = 0; + virtual INT32 _abi_add_ResourceAvailabilityChanged(__FIEventHandler_1_IInspectable* handler, EventRegistrationToken* token) = 0; + virtual INT32 _abi_remove_ResourceAvailabilityChanged(EventRegistrationToken token) = 0; +}; \ No newline at end of file diff --git a/dlls/kernelx/ICoreApplicationX.h b/dlls/kernelx/ICoreApplicationX.h index 5fd3835..71ca9d2 100644 --- a/dlls/kernelx/ICoreApplicationX.h +++ b/dlls/kernelx/ICoreApplicationX.h @@ -2,11 +2,12 @@ #include #include +#include "ICoreApplicationResourceAvailabilityX.h" -using namespace ABI::Windows::ApplicationModel::Activation; using namespace ABI::Windows::ApplicationModel; -using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::ApplicationModel::Activation; using namespace ABI::Windows::ApplicationModel::Core; +using namespace ABI::Windows::Foundation; using namespace ABI::Windows::System; class ICoreApplicationX : public IInspectable @@ -16,7 +17,7 @@ public: virtual INT32 _abi_remove_Resuming(EventRegistrationToken token) = 0; virtual INT32 _abi_add_Suspending(__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs* handler, EventRegistrationToken* token) = 0; virtual INT32 _abi_remove_Suspending(EventRegistrationToken token) = 0; - //virtual INT32 _abi_get_ResourceAvailability(Windows::ApplicationModel::Core::ResourceAvailability*) = 0; + virtual INT32 _abi_get_ResourceAvailability(ResourceAvailability* resourceAvailability) = 0; virtual INT32 _abi_get_ResourceAvailability() = 0; virtual INT32 _abi_add_ResourceAvailabilityChanged(winrt::Windows::Foundation::EventHandler* handler, EventRegistrationToken* token) = 0; virtual INT32 _abi_remove_ResourceAvailabilityChanged(EventRegistrationToken token) = 0; @@ -42,5 +43,4 @@ public: virtual HRESULT QueryInterface(const IID& riid, void** ppvObject) override = 0; virtual ULONG AddRef() override = 0; virtual ULONG Release() override = 0; - }; \ No newline at end of file diff --git a/dlls/kernelx/hooks.h b/dlls/kernelx/hooks.h index b52cf54..f4adccb 100644 --- a/dlls/kernelx/hooks.h +++ b/dlls/kernelx/hooks.h @@ -1,5 +1,6 @@ #pragma once #include + #include "CoreApplicationX.h" inline bool IsClassName(HSTRING classId, const char* classIdName) @@ -19,8 +20,8 @@ DllGetForCurrentThreadFunc pDllGetForCurrentThread = nullptr; DllGetForCurrentThreadFunc_App pDllGetForCurrentThread_App = nullptr; DllGetActivationFactoryFunc pDllGetActivationFactory = nullptr; -HRESULT(STDMETHODCALLTYPE* TrueGetForCurrentThread_App)(ICoreApplication* application, winrt::Windows::ApplicationModel::Core::CoreApplication** Application); HRESULT(STDMETHODCALLTYPE* TrueGetForCurrentThread)(ICoreWindowStatic* staticWindow, CoreWindow** window); +HRESULT(STDMETHODCALLTYPE* TrueGetForCurrentThread_App)(ICoreApplication* application, winrt::Windows::ApplicationModel::Core::CoreApplication** Application); HRESULT(WINAPI* TrueRoGetActivationFactory)(HSTRING classId, REFIID iid, void** factory) = RoGetActivationFactory; inline HRESULT STDMETHODCALLTYPE GetForCurrentThread_Hook(ICoreWindowStatic* paramThis, CoreWindow** window) @@ -36,8 +37,7 @@ inline HRESULT STDMETHODCALLTYPE GetForCurrentThread_Hook(ICoreWindowStatic* par return hr; } -inline HRESULT STDMETHODCALLTYPE GetForCurrentThreadApp_Hook(ICoreApplication* paramThis, - winrt::Windows::ApplicationModel::Core::CoreApplication** Application) +inline HRESULT STDMETHODCALLTYPE GetForCurrentThreadApp_Hook(ICoreApplication* paramThis, winrt::Windows::ApplicationModel::Core::CoreApplication** Application) { // ReSharper disable once CppLocalVariableMayBeConst HRESULT hrApp = TrueGetForCurrentThread_App(paramThis, Application); @@ -69,13 +69,17 @@ inline HRESULT WINAPI RoGetActivationFactory_Hook(HSTRING classId, REFIID iid, v ComPtr _factory; - if (IsClassName(classId, "Windows.ApplicationModel.Core.CoreApplication")) + if (IsClassName(classId, "Windows.ApplicationModel.Core.ICoreApplicationResourceAvailability")) { - ComPtr ICoreApplicationPtr; + + } + else if (IsClassName(classId, "Windows.ApplicationModel.Core.CoreApplication")) + { + ComPtr ICoreApplicationPtr; hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication).Get(), IID_PPV_ARGS(&ICoreApplicationPtr)); - *reinterpret_cast(&TrueGetForCurrentThread_App) = (*reinterpret_cast(ICoreApplicationPtr.Get()))[ 6 ]; + *reinterpret_cast(&TrueGetForCurrentThread_App) = (*reinterpret_cast(ICoreApplicationPtr.Get()))[6]; DetourAttach(&TrueGetForCurrentThread_App, GetForCurrentThreadApp_Hook); } @@ -85,7 +89,7 @@ inline HRESULT WINAPI RoGetActivationFactory_Hook(HSTRING classId, REFIID iid, v hr = RoGetActivationFactory(HStringReference(RuntimeClass_Windows_UI_Core_CoreWindow).Get(), IID_PPV_ARGS(&coreWindowStatic)); - *reinterpret_cast(&TrueGetForCurrentThread) = (*reinterpret_cast(coreWindowStatic.Get()))[ 6 ]; + *reinterpret_cast(&TrueGetForCurrentThread) = (*reinterpret_cast(coreWindowStatic.Get()))[6]; DetourAttach(&TrueGetForCurrentThread, GetForCurrentThread_Hook); } @@ -100,5 +104,4 @@ inline HRESULT WINAPI RoGetActivationFactory_Hook(HSTRING classId, REFIID iid, v } return hr; - } \ No newline at end of file diff --git a/dlls/kernelx/kernelx.vcxproj b/dlls/kernelx/kernelx.vcxproj index ddc077f..e5c6609 100644 --- a/dlls/kernelx/kernelx.vcxproj +++ b/dlls/kernelx/kernelx.vcxproj @@ -93,10 +93,12 @@ + + @@ -104,6 +106,7 @@ + diff --git a/dlls/kernelx/kernelx.vcxproj.filters b/dlls/kernelx/kernelx.vcxproj.filters index 92cd67b..3e14c03 100644 --- a/dlls/kernelx/kernelx.vcxproj.filters +++ b/dlls/kernelx/kernelx.vcxproj.filters @@ -8,6 +8,9 @@ Windows.UI.Core + Windows.ApplicationModel.Core\CoreApplication + + Windows.ApplicationModel.Core @@ -23,10 +26,16 @@ + + Windows.ApplicationModel.Core\CoreApplication + + Windows.ApplicationModel.Core\CoreApplication + + Windows.ApplicationModel.Core - + Windows.ApplicationModel.Core @@ -43,5 +52,8 @@ {22d419bf-d552-4ab7-a078-94a3d47e5051} + + {ee124397-8dbc-48c3-869f-10201a7d04fd} + \ No newline at end of file