mirror of
https://github.com/valinet/ExplorerPatcher.git
synced 2025-01-31 20:05:29 +01:00
22000.318.38:
* Functional Windows 10 network flyout * Functional Windows 10 battery flyout * Implemented support for Windows 7 battery flyout (#274)
This commit is contained in:
parent
fbc9b3df09
commit
725d5ad18f
15
CHANGELOG.md
15
CHANGELOG.md
@ -2,6 +2,21 @@
|
|||||||
|
|
||||||
This document includes the same release notes as in the [Releases](https://github.com/valinet/ExplorerPatcher/releases) section on GitHub.
|
This document includes the same release notes as in the [Releases](https://github.com/valinet/ExplorerPatcher/releases) section on GitHub.
|
||||||
|
|
||||||
|
## 22000.318.38
|
||||||
|
|
||||||
|
Tested on build 22000.318 and 22000.346 (currently in Windows Insider beta and release preview channels).
|
||||||
|
|
||||||
|
#### New features
|
||||||
|
|
||||||
|
* Functional Windows 10 network flyout
|
||||||
|
* Functional Windows 10 battery flyout
|
||||||
|
* Implemented support for Windows 7 battery flyout (#274)
|
||||||
|
|
||||||
|
#### Feature enhancements
|
||||||
|
|
||||||
|
* Improved reliability when invoking Control Center (`Win`+`A`) when the taskbar icon is disabled (the icon should now not reappear anymore sometimes) (#242)
|
||||||
|
* Small reorganization of some options in "Properties"
|
||||||
|
|
||||||
## 22000.318.37
|
## 22000.318.37
|
||||||
|
|
||||||
Tested on build 22000.318 and 22000.346 (currently in Windows Insider beta and release preview channels).
|
Tested on build 22000.318 and 22000.346 (currently in Windows Insider beta and release preview channels).
|
||||||
|
@ -246,6 +246,7 @@
|
|||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="HideExplorerSearchBar.c" />
|
<ClCompile Include="HideExplorerSearchBar.c" />
|
||||||
|
<ClCompile Include="ImmersiveFlyouts.c" />
|
||||||
<ClCompile Include="SettingsMonitor.c" />
|
<ClCompile Include="SettingsMonitor.c" />
|
||||||
<ClCompile Include="StartMenu.c">
|
<ClCompile Include="StartMenu.c">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
@ -298,6 +299,7 @@
|
|||||||
<ClInclude Include="HideExplorerSearchBar.h" />
|
<ClInclude Include="HideExplorerSearchBar.h" />
|
||||||
<ClInclude Include="hooking.h" />
|
<ClInclude Include="hooking.h" />
|
||||||
<ClInclude Include="ep_private.h" />
|
<ClInclude Include="ep_private.h" />
|
||||||
|
<ClInclude Include="ImmersiveFlyouts.h" />
|
||||||
<ClInclude Include="queryversion.h" />
|
<ClInclude Include="queryversion.h" />
|
||||||
<ClInclude Include="resource.h" />
|
<ClInclude Include="resource.h" />
|
||||||
<ClInclude Include="SettingsMonitor.h" />
|
<ClInclude Include="SettingsMonitor.h" />
|
||||||
|
@ -114,6 +114,9 @@
|
|||||||
<ClInclude Include="..\version.h">
|
<ClInclude Include="..\version.h">
|
||||||
<Filter>Header Files\internal</Filter>
|
<Filter>Header Files\internal</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="ImmersiveFlyouts.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="ExplorerPatcher.rc">
|
<ResourceCompile Include="ExplorerPatcher.rc">
|
||||||
@ -184,6 +187,9 @@
|
|||||||
<ClCompile Include="updates.c">
|
<ClCompile Include="updates.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="ImmersiveFlyouts.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="settings.reg">
|
<None Include="settings.reg">
|
||||||
|
146
ExplorerPatcher/ImmersiveFlyouts.c
Normal file
146
ExplorerPatcher/ImmersiveFlyouts.c
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
#include "ImmersiveFlyouts.h"
|
||||||
|
|
||||||
|
void InvokeActionCenter()
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
IUnknown* pImmersiveShell = NULL;
|
||||||
|
hr = CoCreateInstance(
|
||||||
|
&CLSID_ImmersiveShell,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_NO_CODE_DOWNLOAD | CLSCTX_LOCAL_SERVER,
|
||||||
|
&IID_IServiceProvider,
|
||||||
|
&pImmersiveShell
|
||||||
|
);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
IShellExperienceManagerFactory* pShellExperienceManagerFactory = NULL;
|
||||||
|
IUnknown_QueryService(
|
||||||
|
pImmersiveShell,
|
||||||
|
&CLSID_ShellExperienceManagerFactory,
|
||||||
|
&CLSID_ShellExperienceManagerFactory,
|
||||||
|
&pShellExperienceManagerFactory
|
||||||
|
);
|
||||||
|
if (pShellExperienceManagerFactory)
|
||||||
|
{
|
||||||
|
HSTRING_HEADER hstringHeader;
|
||||||
|
HSTRING hstring = NULL;
|
||||||
|
hr = WindowsCreateStringReference(
|
||||||
|
L"Windows.Internal.ShellExperience.ControlCenter",
|
||||||
|
(UINT32)(sizeof(L"Windows.Internal.ShellExperience.ControlCenter") / sizeof(wchar_t) - 1),
|
||||||
|
&hstringHeader,
|
||||||
|
&hstring
|
||||||
|
);
|
||||||
|
if (hstring)
|
||||||
|
{
|
||||||
|
IUnknown* pIntf = NULL;
|
||||||
|
pShellExperienceManagerFactory->lpVtbl->GetExperienceManager(
|
||||||
|
pShellExperienceManagerFactory,
|
||||||
|
hstring,
|
||||||
|
&pIntf
|
||||||
|
);
|
||||||
|
if (pIntf)
|
||||||
|
{
|
||||||
|
IActionCenterOrControlCenterExperienceManager* pControlCenterExperienceManager = NULL;
|
||||||
|
pIntf->lpVtbl->QueryInterface(pIntf, &IID_ControlCenterExperienceManager, &pControlCenterExperienceManager);
|
||||||
|
if (pControlCenterExperienceManager)
|
||||||
|
{
|
||||||
|
pControlCenterExperienceManager->lpVtbl->HotKeyInvoked(pControlCenterExperienceManager, 0);
|
||||||
|
pControlCenterExperienceManager->lpVtbl->Release(pControlCenterExperienceManager);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WindowsDeleteString(hstring);
|
||||||
|
}
|
||||||
|
pShellExperienceManagerFactory->lpVtbl->Release(pShellExperienceManagerFactory);
|
||||||
|
}
|
||||||
|
pImmersiveShell->lpVtbl->Release(pImmersiveShell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InvokeFlyout(BOOL bAction, DWORD dwWhich)
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
IUnknown* pImmersiveShell = NULL;
|
||||||
|
hr = CoCreateInstance(
|
||||||
|
&CLSID_ImmersiveShell,
|
||||||
|
NULL,
|
||||||
|
CLSCTX_NO_CODE_DOWNLOAD | CLSCTX_LOCAL_SERVER,
|
||||||
|
&IID_IServiceProvider,
|
||||||
|
&pImmersiveShell
|
||||||
|
);
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
IShellExperienceManagerFactory* pShellExperienceManagerFactory = NULL;
|
||||||
|
IUnknown_QueryService(
|
||||||
|
pImmersiveShell,
|
||||||
|
&CLSID_ShellExperienceManagerFactory,
|
||||||
|
&CLSID_ShellExperienceManagerFactory,
|
||||||
|
&pShellExperienceManagerFactory
|
||||||
|
);
|
||||||
|
if (pShellExperienceManagerFactory)
|
||||||
|
{
|
||||||
|
HSTRING_HEADER hstringHeader;
|
||||||
|
HSTRING hstring = NULL;
|
||||||
|
WCHAR* pwszStr = NULL;
|
||||||
|
switch (dwWhich)
|
||||||
|
{
|
||||||
|
case INVOKE_FLYOUT_NETWORK:
|
||||||
|
pwszStr = L"Windows.Internal.ShellExperience.NetworkFlyout";
|
||||||
|
break;
|
||||||
|
case INVOKE_FLYOUT_CLOCK:
|
||||||
|
pwszStr = L"Windows.Internal.ShellExperience.TrayClockFlyout";
|
||||||
|
break;
|
||||||
|
case INVOKE_FLYOUT_BATTERY:
|
||||||
|
pwszStr = L"Windows.Internal.ShellExperience.TrayBatteryFlyout";
|
||||||
|
break;
|
||||||
|
case INVOKE_FLYOUT_SOUND:
|
||||||
|
pwszStr = L"Windows.Internal.ShellExperience.MtcUvc";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
hr = WindowsCreateStringReference(
|
||||||
|
pwszStr,
|
||||||
|
pwszStr ? wcslen(pwszStr) : 0,
|
||||||
|
&hstringHeader,
|
||||||
|
&hstring
|
||||||
|
);
|
||||||
|
if (hstring)
|
||||||
|
{
|
||||||
|
IUnknown* pIntf = NULL;
|
||||||
|
pShellExperienceManagerFactory->lpVtbl->GetExperienceManager(
|
||||||
|
pShellExperienceManagerFactory,
|
||||||
|
hstring,
|
||||||
|
&pIntf
|
||||||
|
);
|
||||||
|
if (pIntf)
|
||||||
|
{
|
||||||
|
IExperienceManager* pExperienceManager = NULL;
|
||||||
|
pIntf->lpVtbl->QueryInterface(
|
||||||
|
pIntf,
|
||||||
|
dwWhich == INVOKE_FLYOUT_NETWORK ? &IID_NetworkFlyoutExperienceManager :
|
||||||
|
(dwWhich == INVOKE_FLYOUT_CLOCK ? &IID_TrayClockFlyoutExperienceManager :
|
||||||
|
(dwWhich == INVOKE_FLYOUT_BATTERY ? &IID_TrayBatteryFlyoutExperienceManager :
|
||||||
|
(dwWhich == INVOKE_FLYOUT_SOUND ? &IID_TrayMtcUvcFlyoutExperienceManager : &IID_IUnknown))),
|
||||||
|
&pExperienceManager
|
||||||
|
);
|
||||||
|
if (pExperienceManager)
|
||||||
|
{
|
||||||
|
RECT rc;
|
||||||
|
SetRect(&rc, 0, 0, 0, 0);
|
||||||
|
if (bAction == INVOKE_FLYOUT_SHOW)
|
||||||
|
{
|
||||||
|
pExperienceManager->lpVtbl->ShowFlyout(pExperienceManager, &rc, NULL);
|
||||||
|
}
|
||||||
|
else if (bAction == INVOKE_FLYOUT_HIDE)
|
||||||
|
{
|
||||||
|
pExperienceManager->lpVtbl->HideFlyout(pExperienceManager);
|
||||||
|
}
|
||||||
|
pExperienceManager->lpVtbl->Release(pExperienceManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
WindowsDeleteString(hstring);
|
||||||
|
}
|
||||||
|
pShellExperienceManagerFactory->lpVtbl->Release(pShellExperienceManagerFactory);
|
||||||
|
}
|
||||||
|
pImmersiveShell->lpVtbl->Release(pImmersiveShell);
|
||||||
|
}
|
||||||
|
}
|
196
ExplorerPatcher/ImmersiveFlyouts.h
Normal file
196
ExplorerPatcher/ImmersiveFlyouts.h
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
#ifndef _H_IMMERSIVEFLYOUTS_H_
|
||||||
|
#define _H_IMMERSIVEFLYOUTS_H_
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <roapi.h>
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
|
DEFINE_GUID(IID_TrayBatteryFlyoutExperienceManager,
|
||||||
|
0x0a73aedc,
|
||||||
|
0x1c68, 0x410d, 0x8d, 0x53,
|
||||||
|
0x63, 0xaf, 0x80, 0x95, 0x1e, 0x8f
|
||||||
|
);
|
||||||
|
DEFINE_GUID(IID_TrayClockFlyoutExperienceManager,
|
||||||
|
0xb1604325,
|
||||||
|
0x6b59, 0x427b, 0xbf, 0x1b,
|
||||||
|
0x80, 0xa2, 0xdb, 0x02, 0xd3, 0xd8
|
||||||
|
);
|
||||||
|
DEFINE_GUID(IID_TrayMtcUvcFlyoutExperienceManager,
|
||||||
|
0x7154c95d,
|
||||||
|
0xc519, 0x49bd, 0xa9, 0x7e,
|
||||||
|
0x64, 0x5b, 0xbf, 0xab, 0xE1, 0x11
|
||||||
|
);
|
||||||
|
DEFINE_GUID(IID_NetworkFlyoutExperienceManager,
|
||||||
|
0xC9DDC674,
|
||||||
|
0xB44B, 0x4C67, 0x9D, 0x79,
|
||||||
|
0x2B, 0x23, 0x7D, 0x9B, 0xE0, 0x5A
|
||||||
|
);
|
||||||
|
typedef interface IExperienceManager IExperienceManager;
|
||||||
|
|
||||||
|
typedef struct IExperienceManagerVtbl // : IInspectable
|
||||||
|
{
|
||||||
|
BEGIN_INTERFACE
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* QueryInterface)(
|
||||||
|
IExperienceManager* This,
|
||||||
|
/* [in] */ REFIID riid,
|
||||||
|
/* [annotation][iid_is][out] */
|
||||||
|
_COM_Outptr_ void** ppvObject);
|
||||||
|
|
||||||
|
ULONG(STDMETHODCALLTYPE* AddRef)(
|
||||||
|
IExperienceManager* This);
|
||||||
|
|
||||||
|
ULONG(STDMETHODCALLTYPE* Release)(
|
||||||
|
IExperienceManager* This);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetIids)(
|
||||||
|
IExperienceManager* This,
|
||||||
|
ULONG* iidCount,
|
||||||
|
IID** iids);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetRuntimeClassName)(
|
||||||
|
IExperienceManager* This,
|
||||||
|
HSTRING* className);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetTrustLevel)(
|
||||||
|
IExperienceManager* This,
|
||||||
|
TrustLevel* trustLevel);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* ShowFlyout)(
|
||||||
|
IExperienceManager* This,
|
||||||
|
/* [in] */ RECT* rect,
|
||||||
|
/* [in] */ HWND hWnd);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* HideFlyout)(
|
||||||
|
IExperienceManager* This);
|
||||||
|
|
||||||
|
END_INTERFACE
|
||||||
|
} IExperienceManagerVtbl;
|
||||||
|
|
||||||
|
interface IExperienceManager
|
||||||
|
{
|
||||||
|
CONST_VTBL struct IExperienceManagerVtbl* lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_GUID(CLSID_ShellExperienceManagerFactory,
|
||||||
|
0x2E8FCB18,
|
||||||
|
0xA0EE, 0x41AD, 0x8E, 0xF8,
|
||||||
|
0x77, 0xFB, 0x3A, 0x37, 0x0C, 0xA5
|
||||||
|
);
|
||||||
|
typedef interface IShellExperienceManagerFactory IShellExperienceManagerFactory;
|
||||||
|
|
||||||
|
typedef struct IShellExperienceManagerFactoryVtbl // : IInspectable
|
||||||
|
{
|
||||||
|
BEGIN_INTERFACE
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* QueryInterface)(
|
||||||
|
IShellExperienceManagerFactory* This,
|
||||||
|
/* [in] */ REFIID riid,
|
||||||
|
/* [annotation][iid_is][out] */
|
||||||
|
_COM_Outptr_ void** ppvObject);
|
||||||
|
|
||||||
|
ULONG(STDMETHODCALLTYPE* AddRef)(
|
||||||
|
IShellExperienceManagerFactory* This);
|
||||||
|
|
||||||
|
ULONG(STDMETHODCALLTYPE* Release)(
|
||||||
|
IShellExperienceManagerFactory* This);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetIids)(
|
||||||
|
IShellExperienceManagerFactory* This,
|
||||||
|
ULONG* iidCount,
|
||||||
|
IID** iids);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetRuntimeClassName)(
|
||||||
|
IShellExperienceManagerFactory* This,
|
||||||
|
HSTRING* className);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetTrustLevel)(
|
||||||
|
IShellExperienceManagerFactory* This,
|
||||||
|
TrustLevel* trustLevel);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetExperienceManager)(
|
||||||
|
IShellExperienceManagerFactory* This,
|
||||||
|
/* [in] */ HSTRING* experience,
|
||||||
|
_COM_Outptr_ IInspectable** ppvObject);
|
||||||
|
|
||||||
|
END_INTERFACE
|
||||||
|
} IShellExperienceManagerFactoryVtbl;
|
||||||
|
|
||||||
|
interface IShellExperienceManagerFactory
|
||||||
|
{
|
||||||
|
CONST_VTBL struct IShellExperienceManagerFactoryVtbl* lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_GUID(IID_ActionCenterExperienceManager,
|
||||||
|
0xdec04b18,
|
||||||
|
0x357e, 0x41d8, 0x9b, 0x71,
|
||||||
|
0xb9, 0x91, 0x24, 0x3b, 0xea, 0x34
|
||||||
|
);
|
||||||
|
DEFINE_GUID(IID_ControlCenterExperienceManager,
|
||||||
|
0xd669a58e,
|
||||||
|
0x6b18, 0x4d1d, 0x90, 0x04,
|
||||||
|
0xa8, 0x86, 0x2a, 0xdb, 0x0a, 0x20
|
||||||
|
);
|
||||||
|
typedef interface IActionCenterOrControlCenterExperienceManager IActionCenterOrControlCenterExperienceManager;
|
||||||
|
|
||||||
|
typedef struct IActionCenterOrControlCenterExperienceManagerVtbl // : IInspectable
|
||||||
|
{
|
||||||
|
BEGIN_INTERFACE
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* QueryInterface)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
/* [in] */ REFIID riid,
|
||||||
|
/* [annotation][iid_is][out] */
|
||||||
|
_COM_Outptr_ void** ppvObject);
|
||||||
|
|
||||||
|
ULONG(STDMETHODCALLTYPE* AddRef)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This);
|
||||||
|
|
||||||
|
ULONG(STDMETHODCALLTYPE* Release)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetIids)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
ULONG* iidCount,
|
||||||
|
IID** iids);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetRuntimeClassName)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
HSTRING* className);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* GetTrustLevel)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
TrustLevel* trustLevel);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* HotKeyInvoked)(
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
/* [in] */ void* kind);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* Show)( // only in control center
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
HSTRING hstringUnknown,
|
||||||
|
void* bSupressAnimations,
|
||||||
|
void* dwUnknown_ShouldBeOne);
|
||||||
|
|
||||||
|
HRESULT(STDMETHODCALLTYPE* Hide)( // only in control center
|
||||||
|
IActionCenterOrControlCenterExperienceManager* This,
|
||||||
|
HSTRING hstringUnknown,
|
||||||
|
void* bSupressAnimations);
|
||||||
|
|
||||||
|
END_INTERFACE
|
||||||
|
} IActionCenterOrControlCenterExperienceManagerVtbl;
|
||||||
|
|
||||||
|
interface IActionCenterOrControlCenterExperienceManager
|
||||||
|
{
|
||||||
|
CONST_VTBL struct IActionCenterOrControlCenterExperienceManagerVtbl* lpVtbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
void InvokeActionCenter();
|
||||||
|
|
||||||
|
#define INVOKE_FLYOUT_SHOW 1
|
||||||
|
#define INVOKE_FLYOUT_HIDE 2
|
||||||
|
#define INVOKE_FLYOUT_NETWORK 1
|
||||||
|
#define INVOKE_FLYOUT_CLOCK 2
|
||||||
|
#define INVOKE_FLYOUT_BATTERY 3
|
||||||
|
#define INVOKE_FLYOUT_SOUND 4
|
||||||
|
void InvokeFlyout(BOOL bAction, DWORD dwWhich);
|
||||||
|
#endif
|
@ -122,6 +122,7 @@ DWORD S_Icon_Dark_Widgets = 0;
|
|||||||
#endif
|
#endif
|
||||||
#include "SettingsMonitor.h"
|
#include "SettingsMonitor.h"
|
||||||
#include "HideExplorerSearchBar.h"
|
#include "HideExplorerSearchBar.h"
|
||||||
|
#include "ImmersiveFlyouts.h"
|
||||||
#include "updates.h"
|
#include "updates.h"
|
||||||
DWORD dwUpdatePolicy = UPDATE_POLICY_DEFAULT;
|
DWORD dwUpdatePolicy = UPDATE_POLICY_DEFAULT;
|
||||||
|
|
||||||
@ -461,9 +462,60 @@ POINT GetDefaultWinXPosition(BOOL bUseRcWork, BOOL* lpBottom, BOOL* lpRight, BOO
|
|||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TerminateShellExperienceHost()
|
||||||
|
{
|
||||||
|
WCHAR wszKnownPath[MAX_PATH];
|
||||||
|
GetWindowsDirectoryW(wszKnownPath, MAX_PATH);
|
||||||
|
wcscat_s(wszKnownPath, MAX_PATH, L"\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy\\ShellExperienceHost.exe");
|
||||||
|
HANDLE hSnapshot = NULL;
|
||||||
|
PROCESSENTRY32 pe32;
|
||||||
|
ZeroMemory(&pe32, sizeof(PROCESSENTRY32));
|
||||||
|
pe32.dwSize = sizeof(PROCESSENTRY32);
|
||||||
|
hSnapshot = CreateToolhelp32Snapshot(
|
||||||
|
TH32CS_SNAPPROCESS,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
if (Process32First(hSnapshot, &pe32) == TRUE)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (!wcscmp(pe32.szExeFile, TEXT("ShellExperienceHost.exe")))
|
||||||
|
{
|
||||||
|
HANDLE hProcess = OpenProcess(
|
||||||
|
PROCESS_QUERY_LIMITED_INFORMATION |
|
||||||
|
PROCESS_TERMINATE,
|
||||||
|
FALSE,
|
||||||
|
pe32.th32ProcessID
|
||||||
|
);
|
||||||
|
if (hProcess)
|
||||||
|
{
|
||||||
|
TCHAR wszProcessPath[MAX_PATH];
|
||||||
|
DWORD dwLength = MAX_PATH;
|
||||||
|
QueryFullProcessImageNameW(
|
||||||
|
hProcess,
|
||||||
|
0,
|
||||||
|
wszProcessPath,
|
||||||
|
&dwLength
|
||||||
|
);
|
||||||
|
if (!_wcsicmp(wszProcessPath, wszKnownPath))
|
||||||
|
{
|
||||||
|
TerminateProcess(hProcess, 0);
|
||||||
|
}
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
hProcess = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (Process32Next(hSnapshot, &pe32) == TRUE);
|
||||||
|
if (hSnapshot)
|
||||||
|
{
|
||||||
|
CloseHandle(hSnapshot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long long elapsedCheckForeground = 0;
|
long long elapsedCheckForeground = 0;
|
||||||
HANDLE hCheckForegroundThread = NULL;
|
HANDLE hCheckForegroundThread = NULL;
|
||||||
DWORD CheckForegroundThread(wchar_t* wszClassName)
|
DWORD CheckForegroundThread(DWORD dwMode)
|
||||||
{
|
{
|
||||||
printf("Started \"Check foreground window\" thread.\n");
|
printf("Started \"Check foreground window\" thread.\n");
|
||||||
UINT i = 0;
|
UINT i = 0;
|
||||||
@ -471,7 +523,7 @@ DWORD CheckForegroundThread(wchar_t* wszClassName)
|
|||||||
{
|
{
|
||||||
wchar_t text[200];
|
wchar_t text[200];
|
||||||
GetClassNameW(GetForegroundWindow(), text, 200);
|
GetClassNameW(GetForegroundWindow(), text, 200);
|
||||||
if (!wcscmp(text, wszClassName))
|
if (!wcscmp(text, L"Windows.UI.Core.CoreWindow"))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -483,13 +535,18 @@ DWORD CheckForegroundThread(wchar_t* wszClassName)
|
|||||||
{
|
{
|
||||||
wchar_t text[200];
|
wchar_t text[200];
|
||||||
GetClassNameW(GetForegroundWindow(), text, 200);
|
GetClassNameW(GetForegroundWindow(), text, 200);
|
||||||
if (wcscmp(text, wszClassName))
|
if (wcscmp(text, L"Windows.UI.Core.CoreWindow"))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Sleep(100);
|
Sleep(100);
|
||||||
}
|
}
|
||||||
elapsedCheckForeground = milliseconds_now();
|
elapsedCheckForeground = milliseconds_now();
|
||||||
|
if (!dwMode)
|
||||||
|
{
|
||||||
|
RegDeleteKeyW(HKEY_CURRENT_USER, _T(SEH_REGPATH));
|
||||||
|
TerminateShellExperienceHost();
|
||||||
|
}
|
||||||
printf("Ended \"Check foreground window\" thread.\n");
|
printf("Ended \"Check foreground window\" thread.\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -498,6 +555,10 @@ void LaunchNetworkTargets(DWORD dwTarget)
|
|||||||
{
|
{
|
||||||
// very helpful: https://www.tenforums.com/tutorials/3123-clsid-key-guid-shortcuts-list-windows-10-a.html
|
// very helpful: https://www.tenforums.com/tutorials/3123-clsid-key-guid-shortcuts-list-windows-10-a.html
|
||||||
if (!dwTarget)
|
if (!dwTarget)
|
||||||
|
{
|
||||||
|
InvokeFlyout(INVOKE_FLYOUT_SHOW, INVOKE_FLYOUT_NETWORK);
|
||||||
|
}
|
||||||
|
else if (dwTarget == 5)
|
||||||
{
|
{
|
||||||
ShellExecuteW(
|
ShellExecuteW(
|
||||||
NULL,
|
NULL,
|
||||||
@ -1287,7 +1348,9 @@ INT64 Shell_TrayWndSubclassProc(
|
|||||||
}
|
}
|
||||||
else if (uMsg == WM_HOTKEY && wParam == 500 && lParam == MAKELPARAM(MOD_WIN, 0x41))
|
else if (uMsg == WM_HOTKEY && wParam == 500 && lParam == MAKELPARAM(MOD_WIN, 0x41))
|
||||||
{
|
{
|
||||||
if (lpShouldDisplayCCButton)
|
InvokeActionCenter();
|
||||||
|
return 0;
|
||||||
|
/*if (lpShouldDisplayCCButton)
|
||||||
{
|
{
|
||||||
*lpShouldDisplayCCButton = 1;
|
*lpShouldDisplayCCButton = 1;
|
||||||
}
|
}
|
||||||
@ -1296,7 +1359,7 @@ INT64 Shell_TrayWndSubclassProc(
|
|||||||
{
|
{
|
||||||
*lpShouldDisplayCCButton = bHideControlCenterButton;
|
*lpShouldDisplayCCButton = bHideControlCenterButton;
|
||||||
}
|
}
|
||||||
return lRes;
|
return lRes;*/
|
||||||
}
|
}
|
||||||
else if (uMsg == WM_DISPLAYCHANGE)
|
else if (uMsg == WM_DISPLAYCHANGE)
|
||||||
{
|
{
|
||||||
@ -2121,6 +2184,62 @@ BOOL sndvolsso_TrackPopupMenuExHook(
|
|||||||
}
|
}
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
long long stobject_TrackPopupMenuExElapsed = 0;
|
||||||
|
BOOL stobject_TrackPopupMenuExHook(
|
||||||
|
HMENU hMenu,
|
||||||
|
UINT uFlags,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
HWND hWnd,
|
||||||
|
LPTPMPARAMS lptpm
|
||||||
|
)
|
||||||
|
{
|
||||||
|
long long elapsed = milliseconds_now() - stobject_TrackPopupMenuExElapsed;
|
||||||
|
BOOL b = FALSE;
|
||||||
|
if (elapsed > POPUPMENU_SAFETOREMOVE_TIMEOUT || !bFlyoutMenus)
|
||||||
|
{
|
||||||
|
if (bCenterMenus)
|
||||||
|
{
|
||||||
|
PopupMenuAdjustCoordinatesAndFlags(&x, &y, &uFlags);
|
||||||
|
}
|
||||||
|
INT64* unknown_array = NULL;
|
||||||
|
POINT pt;
|
||||||
|
if (bSkinMenus)
|
||||||
|
{
|
||||||
|
unknown_array = calloc(4, sizeof(INT64));
|
||||||
|
pt.x = x;
|
||||||
|
pt.y = y;
|
||||||
|
ImmersiveContextMenuHelper_ApplyOwnerDrawToMenuFunc(
|
||||||
|
hMenu,
|
||||||
|
hWnd,
|
||||||
|
&(pt),
|
||||||
|
0xc,
|
||||||
|
unknown_array
|
||||||
|
);
|
||||||
|
SetWindowSubclass(hWnd, OwnerDrawSubclassProc, OwnerDrawSubclassProc, 0);
|
||||||
|
}
|
||||||
|
b = TrackPopupMenuEx(
|
||||||
|
hMenu,
|
||||||
|
uFlags | TPM_RIGHTBUTTON,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
hWnd,
|
||||||
|
lptpm
|
||||||
|
);
|
||||||
|
stobject_TrackPopupMenuExElapsed = milliseconds_now();
|
||||||
|
if (bSkinMenus)
|
||||||
|
{
|
||||||
|
RemoveWindowSubclass(hWnd, OwnerDrawSubclassProc, OwnerDrawSubclassProc);
|
||||||
|
ImmersiveContextMenuHelper_RemoveOwnerDrawFromMenuFunc(
|
||||||
|
hMenu,
|
||||||
|
hWnd,
|
||||||
|
&(pt)
|
||||||
|
);
|
||||||
|
free(unknown_array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
long long stobject_TrackPopupMenuElapsed = 0;
|
long long stobject_TrackPopupMenuElapsed = 0;
|
||||||
BOOL stobject_TrackPopupMenuHook(
|
BOOL stobject_TrackPopupMenuHook(
|
||||||
HMENU hMenu,
|
HMENU hMenu,
|
||||||
@ -2326,18 +2445,104 @@ HWND WINAPI explorerframe_SHCreateWorkerWindowHook(
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
|
|
||||||
|
#pragma region "Fix battery flyout"
|
||||||
|
#ifdef _WIN64
|
||||||
|
LSTATUS stobject_RegGetValueW(
|
||||||
|
HKEY hkey,
|
||||||
|
LPCWSTR lpSubKey,
|
||||||
|
LPCWSTR lpValue,
|
||||||
|
DWORD dwFlags,
|
||||||
|
LPDWORD pdwType,
|
||||||
|
PVOID pvData,
|
||||||
|
LPDWORD pcbData
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!lstrcmpW(lpValue, L"UseWin32BatteryFlyout"))
|
||||||
|
{
|
||||||
|
if (SHRegGetValueFromHKCUHKLMFunc)
|
||||||
|
{
|
||||||
|
return SHRegGetValueFromHKCUHKLMFunc(
|
||||||
|
lpSubKey,
|
||||||
|
lpValue,
|
||||||
|
SRRF_RT_REG_DWORD,
|
||||||
|
pdwType,
|
||||||
|
pvData,
|
||||||
|
pcbData
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RegGetValueW(hkey, lpSubKey, lpValue, dwFlags, pdwType, pvData, pcbData);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT stobject_CoCreateInstanceHook(
|
||||||
|
REFCLSID rclsid,
|
||||||
|
LPUNKNOWN pUnkOuter,
|
||||||
|
DWORD dwClsContext,
|
||||||
|
REFIID riid,
|
||||||
|
LPVOID* ppv
|
||||||
|
)
|
||||||
|
{
|
||||||
|
DWORD dwVal = 0, dwSize = sizeof(DWORD);
|
||||||
|
if (IsEqualGUID(rclsid, &CLSID_ImmersiveShell) &&
|
||||||
|
IsEqualGUID(riid, &IID_IServiceProvider) &&
|
||||||
|
SHRegGetValueFromHKCUHKLMFunc && SHRegGetValueFromHKCUHKLMFunc(
|
||||||
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ImmersiveShell"),
|
||||||
|
TEXT("UseWin32BatteryFlyout"),
|
||||||
|
SRRF_RT_REG_DWORD,
|
||||||
|
NULL,
|
||||||
|
&dwVal,
|
||||||
|
(LPDWORD)(&dwSize)
|
||||||
|
) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
if (!dwVal)
|
||||||
|
{
|
||||||
|
if (hCheckForegroundThread)
|
||||||
|
{
|
||||||
|
WaitForSingleObject(hCheckForegroundThread, INFINITE);
|
||||||
|
CloseHandle(hCheckForegroundThread);
|
||||||
|
hCheckForegroundThread = NULL;
|
||||||
|
}
|
||||||
|
HKEY hKey = NULL;
|
||||||
|
if (RegCreateKeyExW(
|
||||||
|
HKEY_CURRENT_USER,
|
||||||
|
_T(SEH_REGPATH),
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_VOLATILE,
|
||||||
|
KEY_READ,
|
||||||
|
NULL,
|
||||||
|
&hKey,
|
||||||
|
NULL
|
||||||
|
) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
TerminateShellExperienceHost();
|
||||||
|
hCheckForegroundThread = CreateThread(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
CheckForegroundThread,
|
||||||
|
dwVal,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CoCreateInstance(
|
||||||
|
rclsid,
|
||||||
|
pUnkOuter,
|
||||||
|
dwClsContext,
|
||||||
|
riid,
|
||||||
|
ppv
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma region "Show WiFi networks on network icon click"
|
#pragma region "Show WiFi networks on network icon click"
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
DEFINE_GUID(GUID_c2f03a33_21f5_47fa_b4bb_156362a2f239,
|
|
||||||
0xc2f03a33,
|
|
||||||
0x21f5, 0x47fa, 0xb4, 0xbb,
|
|
||||||
0x15, 0x63, 0x62, 0xa2, 0xf2, 0x39
|
|
||||||
);
|
|
||||||
DEFINE_GUID(GUID_6d5140c1_7436_11ce_8034_00aa006009fa,
|
|
||||||
0x6d5140c1,
|
|
||||||
0x7436, 0x11ce, 0x80, 0x34,
|
|
||||||
0x00, 0xaa, 0x00, 0x60, 0x09, 0xfa
|
|
||||||
);
|
|
||||||
HRESULT pnidui_CoCreateInstanceHook(
|
HRESULT pnidui_CoCreateInstanceHook(
|
||||||
REFCLSID rclsid,
|
REFCLSID rclsid,
|
||||||
LPUNKNOWN pUnkOuter,
|
LPUNKNOWN pUnkOuter,
|
||||||
@ -2347,8 +2552,8 @@ HRESULT pnidui_CoCreateInstanceHook(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
DWORD dwVal = 0, dwSize = sizeof(DWORD);
|
DWORD dwVal = 0, dwSize = sizeof(DWORD);
|
||||||
if (IsEqualGUID(rclsid, &GUID_c2f03a33_21f5_47fa_b4bb_156362a2f239) &&
|
if (IsEqualGUID(rclsid, &CLSID_ImmersiveShell) &&
|
||||||
IsEqualGUID(riid, &GUID_6d5140c1_7436_11ce_8034_00aa006009fa) &&
|
IsEqualGUID(riid, &IID_IServiceProvider) &&
|
||||||
SHRegGetValueFromHKCUHKLMFunc && SHRegGetValueFromHKCUHKLMFunc(
|
SHRegGetValueFromHKCUHKLMFunc && SHRegGetValueFromHKCUHKLMFunc(
|
||||||
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Settings\\Network"),
|
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Settings\\Network"),
|
||||||
TEXT("ReplaceVan"),
|
TEXT("ReplaceVan"),
|
||||||
@ -2358,11 +2563,10 @@ HRESULT pnidui_CoCreateInstanceHook(
|
|||||||
(LPDWORD)(&dwSize)
|
(LPDWORD)(&dwSize)
|
||||||
) == ERROR_SUCCESS)
|
) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwVal != 0)
|
if (dwVal)
|
||||||
|
{
|
||||||
|
if (dwVal == 5)
|
||||||
{
|
{
|
||||||
LaunchNetworkTargets(dwVal);
|
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
|
||||||
if (hCheckForegroundThread)
|
if (hCheckForegroundThread)
|
||||||
{
|
{
|
||||||
WaitForSingleObject(hCheckForegroundThread, INFINITE);
|
WaitForSingleObject(hCheckForegroundThread, INFINITE);
|
||||||
@ -2376,13 +2580,52 @@ HRESULT pnidui_CoCreateInstanceHook(
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
CheckForegroundThread,
|
CheckForegroundThread,
|
||||||
L"Windows.UI.Core.CoreWindow",
|
dwVal,
|
||||||
0,
|
0,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LaunchNetworkTargets(dwVal);
|
||||||
|
}
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (hCheckForegroundThread)
|
||||||
|
{
|
||||||
|
WaitForSingleObject(hCheckForegroundThread, INFINITE);
|
||||||
|
CloseHandle(hCheckForegroundThread);
|
||||||
|
hCheckForegroundThread = NULL;
|
||||||
|
}
|
||||||
|
HKEY hKey = NULL;
|
||||||
|
if (RegCreateKeyExW(
|
||||||
|
HKEY_CURRENT_USER,
|
||||||
|
_T(SEH_REGPATH),
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_READ,
|
||||||
|
NULL,
|
||||||
|
&hKey,
|
||||||
|
NULL
|
||||||
|
) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
TerminateShellExperienceHost();
|
||||||
|
hCheckForegroundThread = CreateThread(
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
CheckForegroundThread,
|
||||||
|
dwVal,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
return CoCreateInstance(
|
return CoCreateInstance(
|
||||||
rclsid,
|
rclsid,
|
||||||
pUnkOuter,
|
pUnkOuter,
|
||||||
@ -2471,7 +2714,7 @@ INT64 winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageHo
|
|||||||
hWnd = FindWindowExW(hWnd, NULL, L"ClockButton", NULL);
|
hWnd = FindWindowExW(hWnd, NULL, L"ClockButton", NULL);
|
||||||
if (hWnd)
|
if (hWnd)
|
||||||
{
|
{
|
||||||
if (ShouldShowLegacyClockExperience())
|
if (ShouldShowLegacyClockExperience() == 1)
|
||||||
{
|
{
|
||||||
if (!FindWindowW(L"ClockFlyoutWindow", NULL))
|
if (!FindWindowW(L"ClockFlyoutWindow", NULL))
|
||||||
{
|
{
|
||||||
@ -2482,6 +2725,11 @@ INT64 winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageHo
|
|||||||
return PostMessageW(FindWindowW(L"ClockFlyoutWindow", NULL), WM_CLOSE, 0, 0);
|
return PostMessageW(FindWindowW(L"ClockFlyoutWindow", NULL), WM_CLOSE, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (ShouldShowLegacyClockExperience() == 2)
|
||||||
|
{
|
||||||
|
ToggleNotificationsFlyout();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
INT64* CTrayInstance = (BYTE*)(GetWindowLongPtrW(hShellTray_Wnd, 0)); // -> CTray
|
INT64* CTrayInstance = (BYTE*)(GetWindowLongPtrW(hShellTray_Wnd, 0)); // -> CTray
|
||||||
void* ClockButtonInstance = (BYTE*)(GetWindowLongPtrW(hWnd, 0)); // -> ClockButton
|
void* ClockButtonInstance = (BYTE*)(GetWindowLongPtrW(hWnd, 0)); // -> ClockButton
|
||||||
|
|
||||||
@ -5135,7 +5383,10 @@ DWORD Inject(BOOL bIsExplorer)
|
|||||||
|
|
||||||
|
|
||||||
HANDLE hStobject = LoadLibraryW(L"stobject.dll");
|
HANDLE hStobject = LoadLibraryW(L"stobject.dll");
|
||||||
|
VnPatchIAT(hStobject, "api-ms-win-core-registry-l1-1-0.dll", "RegGetValueW", stobject_RegGetValueW);
|
||||||
|
VnPatchIAT(hStobject, "api-ms-win-core-com-l1-1-0.dll", "CoCreateInstance", stobject_CoCreateInstanceHook);
|
||||||
VnPatchDelayIAT(hStobject, "user32.dll", "TrackPopupMenu", stobject_TrackPopupMenuHook);
|
VnPatchDelayIAT(hStobject, "user32.dll", "TrackPopupMenu", stobject_TrackPopupMenuHook);
|
||||||
|
VnPatchDelayIAT(hStobject, "user32.dll", "TrackPopupMenuEx", stobject_TrackPopupMenuExHook);
|
||||||
#ifdef USE_PRIVATE_INTERFACES
|
#ifdef USE_PRIVATE_INTERFACES
|
||||||
if (bSkinIcons)
|
if (bSkinIcons)
|
||||||
{
|
{
|
||||||
@ -6035,6 +6286,110 @@ void InjectStartMenu()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InjectShellExperienceHost()
|
||||||
|
{
|
||||||
|
#ifdef _WIN64
|
||||||
|
HKEY hKey;
|
||||||
|
if (RegOpenKeyW(HKEY_CURRENT_USER, _T(SEH_REGPATH), &hKey))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
HMODULE hQA = LoadLibraryW(L"Windows.UI.QuickActions.dll");
|
||||||
|
if (hQA)
|
||||||
|
{
|
||||||
|
PIMAGE_DOS_HEADER dosHeader = hQA;
|
||||||
|
if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE)
|
||||||
|
{
|
||||||
|
PIMAGE_NT_HEADERS64 ntHeader = (PIMAGE_NT_HEADERS64)((u_char*)dosHeader + dosHeader->e_lfanew);
|
||||||
|
if (ntHeader->Signature == IMAGE_NT_SIGNATURE)
|
||||||
|
{
|
||||||
|
char* pSEHPatchArea = NULL;
|
||||||
|
char seh_pattern1[14] =
|
||||||
|
{
|
||||||
|
// mov al, 1
|
||||||
|
0xB0, 0x01,
|
||||||
|
// jmp + 2
|
||||||
|
0xEB, 0x02,
|
||||||
|
// xor al, al
|
||||||
|
0x32, 0xC0,
|
||||||
|
// add rsp, 0x20
|
||||||
|
0x48, 0x83, 0xC4, 0x20,
|
||||||
|
// pop rdi
|
||||||
|
0x5F,
|
||||||
|
// pop rsi
|
||||||
|
0x5E,
|
||||||
|
// pop rbx
|
||||||
|
0x5B,
|
||||||
|
// ret
|
||||||
|
0xC3
|
||||||
|
};
|
||||||
|
char seh_off = 12;
|
||||||
|
char seh_pattern2[5] =
|
||||||
|
{
|
||||||
|
// mov r8b, 3
|
||||||
|
0x41, 0xB0, 0x03,
|
||||||
|
// mov dl, 1
|
||||||
|
0xB2, 0x01
|
||||||
|
};
|
||||||
|
BOOL bTwice = FALSE;
|
||||||
|
PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(ntHeader);
|
||||||
|
for (unsigned int i = 0; i < ntHeader->FileHeader.NumberOfSections; ++i)
|
||||||
|
{
|
||||||
|
if (section->Characteristics & IMAGE_SCN_CNT_CODE)
|
||||||
|
{
|
||||||
|
if (section->SizeOfRawData && !bTwice)
|
||||||
|
{
|
||||||
|
DWORD dwOldProtect;
|
||||||
|
VirtualProtect(hQA + section->VirtualAddress, section->SizeOfRawData, PAGE_EXECUTE_READWRITE, &dwOldProtect);
|
||||||
|
char* pCandidate = NULL;
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
pCandidate = memmem(
|
||||||
|
!pCandidate ? hQA + section->VirtualAddress : pCandidate,
|
||||||
|
!pCandidate ? section->SizeOfRawData : (uintptr_t)section->SizeOfRawData - (uintptr_t)(pCandidate - (hQA + section->VirtualAddress)),
|
||||||
|
seh_pattern1,
|
||||||
|
sizeof(seh_pattern1)
|
||||||
|
);
|
||||||
|
if (!pCandidate)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
char* pCandidate2 = pCandidate - seh_off - sizeof(seh_pattern2);
|
||||||
|
if (pCandidate2 > section->VirtualAddress)
|
||||||
|
{
|
||||||
|
if (memmem(pCandidate2, sizeof(seh_pattern2), seh_pattern2, sizeof(seh_pattern2)))
|
||||||
|
{
|
||||||
|
if (!pSEHPatchArea)
|
||||||
|
{
|
||||||
|
pSEHPatchArea = pCandidate;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bTwice = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pCandidate += sizeof(seh_pattern1);
|
||||||
|
}
|
||||||
|
VirtualProtect(hQA + section->VirtualAddress, section->SizeOfRawData, dwOldProtect, &dwOldProtect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
section++;
|
||||||
|
}
|
||||||
|
if (pSEHPatchArea && !bTwice)
|
||||||
|
{
|
||||||
|
DWORD dwOldProtect;
|
||||||
|
VirtualProtect(pSEHPatchArea, sizeof(seh_pattern1), PAGE_EXECUTE_READWRITE, &dwOldProtect);
|
||||||
|
pSEHPatchArea[2] = 0x90;
|
||||||
|
pSEHPatchArea[3] = 0x90;
|
||||||
|
VirtualProtect(pSEHPatchArea, sizeof(seh_pattern1), dwOldProtect, &dwOldProtect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#define DLL_INJECTION_METHOD_DXGI 0
|
#define DLL_INJECTION_METHOD_DXGI 0
|
||||||
#define DLL_INJECTION_METHOD_COM 1
|
#define DLL_INJECTION_METHOD_COM 1
|
||||||
#define DLL_INJECTION_METHOD_START_INJECTION 2
|
#define DLL_INJECTION_METHOD_START_INJECTION 2
|
||||||
@ -6082,9 +6437,14 @@ HRESULT EntryPoint(DWORD dwMethod)
|
|||||||
wcscat_s(wszStartExpectedPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\StartMenuExperienceHost.exe");
|
wcscat_s(wszStartExpectedPath, MAX_PATH, L"\\SystemApps\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\StartMenuExperienceHost.exe");
|
||||||
BOOL bIsThisStartMEH = !_wcsicmp(exePath, wszStartExpectedPath);
|
BOOL bIsThisStartMEH = !_wcsicmp(exePath, wszStartExpectedPath);
|
||||||
|
|
||||||
|
TCHAR wszShellExpectedPath[MAX_PATH];
|
||||||
|
GetWindowsDirectoryW(wszShellExpectedPath, MAX_PATH);
|
||||||
|
wcscat_s(wszShellExpectedPath, MAX_PATH, L"\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy\\ShellExperienceHost.exe");
|
||||||
|
BOOL bIsThisShellEH = !_wcsicmp(exePath, wszShellExpectedPath);
|
||||||
|
|
||||||
if (dwMethod == DLL_INJECTION_METHOD_DXGI)
|
if (dwMethod == DLL_INJECTION_METHOD_DXGI)
|
||||||
{
|
{
|
||||||
if (!(bIsThisExplorer || bIsThisStartMEH))
|
if (!(bIsThisExplorer || bIsThisStartMEH || bIsThisShellEH))
|
||||||
{
|
{
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
@ -6095,7 +6455,7 @@ HRESULT EntryPoint(DWORD dwMethod)
|
|||||||
SetupDXGIImportFunctions(LoadLibraryW(wszRealDXGIPath));
|
SetupDXGIImportFunctions(LoadLibraryW(wszRealDXGIPath));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (dwMethod == DLL_INJECTION_METHOD_COM && (bIsThisExplorer || bIsThisStartMEH))
|
if (dwMethod == DLL_INJECTION_METHOD_COM && (bIsThisExplorer || bIsThisStartMEH || bIsThisShellEH))
|
||||||
{
|
{
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
@ -6117,6 +6477,12 @@ HRESULT EntryPoint(DWORD dwMethod)
|
|||||||
IncrementDLLReferenceCount(hModule);
|
IncrementDLLReferenceCount(hModule);
|
||||||
bInstanced = TRUE;
|
bInstanced = TRUE;
|
||||||
}
|
}
|
||||||
|
else if (bIsThisShellEH)
|
||||||
|
{
|
||||||
|
InjectShellExperienceHost();
|
||||||
|
IncrementDLLReferenceCount(hModule);
|
||||||
|
bInstanced = TRUE;
|
||||||
|
}
|
||||||
else if (dwMethod == DLL_INJECTION_METHOD_COM)
|
else if (dwMethod == DLL_INJECTION_METHOD_COM)
|
||||||
{
|
{
|
||||||
Inject(FALSE);
|
Inject(FALSE);
|
||||||
@ -6128,7 +6494,7 @@ HRESULT EntryPoint(DWORD dwMethod)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
// for explorer.exe
|
// for explorer.exe and ShellExperienceHost.exe
|
||||||
__declspec(dllexport) HRESULT DXGIDeclareAdapterRemovalSupport()
|
__declspec(dllexport) HRESULT DXGIDeclareAdapterRemovalSupport()
|
||||||
{
|
{
|
||||||
EntryPoint(DLL_INJECTION_METHOD_DXGI);
|
EntryPoint(DLL_INJECTION_METHOD_DXGI);
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
"OldTaskbar"=dword:00000001
|
"OldTaskbar"=dword:00000001
|
||||||
;y More taskbar options in the Settings app 🡕
|
;y More taskbar options in the Settings app 🡕
|
||||||
;ms-settings:taskbar
|
;ms-settings:taskbar
|
||||||
|
;y Customize notification area icons 🡕
|
||||||
|
;shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}
|
||||||
|
;y Customize system icons in the notification area 🡕
|
||||||
|
;shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}\SystemIcons
|
||||||
;t The following settings only apply to the Windows 10 taskbar:
|
;t The following settings only apply to the Windows 10 taskbar:
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
||||||
;c 3 Combine taskbar icons on main taskbar
|
;c 3 Combine taskbar icons on main taskbar
|
||||||
@ -46,14 +50,8 @@
|
|||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
||||||
;b Show separators between toolbars *
|
;b Show separators between toolbars *
|
||||||
"ToolbarSeparators"=dword:00000000
|
"ToolbarSeparators"=dword:00000000
|
||||||
;t
|
|
||||||
;t
|
|
||||||
|
|
||||||
;T System tray
|
;T System tray
|
||||||
;y Customize notification area icons 🡕
|
|
||||||
;shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}
|
|
||||||
;y Customize system icons in the notification area 🡕
|
|
||||||
;shell:::{05d7b0f4-2121-4eff-bf6b-ed3f69b894d9}\SystemIcons
|
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
|
||||||
;b Show seconds in the clock
|
;b Show seconds in the clock
|
||||||
"ShowSecondsInSystemClock"=dword:00000000
|
"ShowSecondsInSystemClock"=dword:00000000
|
||||||
@ -72,24 +70,6 @@
|
|||||||
[HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7]
|
[HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7]
|
||||||
;b Show touch keyboard button *
|
;b Show touch keyboard button *
|
||||||
"TipbandDesiredVisibility"=dword:00000000
|
"TipbandDesiredVisibility"=dword:00000000
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\MTCUVC]
|
|
||||||
;i Use legacy volume flyout
|
|
||||||
"EnableMtcUvc"=dword:00000001
|
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ImmersiveShell]
|
|
||||||
;c 3 Clock flyout style
|
|
||||||
;x 2 Windows 11
|
|
||||||
;x 0 Windows 10 (default)
|
|
||||||
;x 1 Windows 7
|
|
||||||
"UseWin32TrayClockExperience"=dword:00000000
|
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
|
||||||
;c 6 Language switcher flyout style *
|
|
||||||
;x 0 Windows 11 (default)
|
|
||||||
;x 1 Windows 10
|
|
||||||
;x 2 "LOGONUI"
|
|
||||||
;x 3 "UAC"
|
|
||||||
;x 4 "SETTINGSPANE"
|
|
||||||
;x 5 "OOBE"
|
|
||||||
"IMEStyle"=dword:00000000
|
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
||||||
;a Choosing 'Open Network && Internet settings' when right clicking the
|
;a Choosing 'Open Network && Internet settings' when right clicking the
|
||||||
;c 3 network icon should open:
|
;c 3 network icon should open:
|
||||||
@ -97,14 +77,41 @@
|
|||||||
;x 1 Network and Sharing Center in Control Panel
|
;x 1 Network and Sharing Center in Control Panel
|
||||||
;x 2 Network Connections in Control Panel
|
;x 2 Network Connections in Control Panel
|
||||||
"ReplaceNetwork"=dword:00000000
|
"ReplaceNetwork"=dword:00000000
|
||||||
|
;t When clicking a system icon in the tray, open:
|
||||||
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Network]
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Network]
|
||||||
;c 5 Network icon should open
|
;c 6 Network
|
||||||
;x 0 WiFi list (default)
|
;x 5 Windows 11 WiFi flyout
|
||||||
|
;x 0 Windows 10 flyout (default)
|
||||||
|
;x 2 Windows 8 flyout
|
||||||
;x 1 Network section in the Settings app
|
;x 1 Network section in the Settings app
|
||||||
;x 2 Windows 8 network flyout
|
|
||||||
;x 3 Network and Sharing Center in Control Panel
|
;x 3 Network and Sharing Center in Control Panel
|
||||||
;x 4 Network Connections in Control Panel
|
;x 4 Network Connections in Control Panel
|
||||||
"ReplaceVan"=dword:00000000
|
"ReplaceVan"=dword:00000000
|
||||||
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\MTCUVC]
|
||||||
|
;c 2 Sound
|
||||||
|
;x 1 Windows 10 flyout (default)
|
||||||
|
;x 0 Windows 7 flyout
|
||||||
|
"EnableMtcUvc"=dword:00000001
|
||||||
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ImmersiveShell]
|
||||||
|
;c 3 Clock
|
||||||
|
;x 2 Windows 11 flyout
|
||||||
|
;x 0 Windows 10 flyout (default)
|
||||||
|
;x 1 Windows 7
|
||||||
|
"UseWin32TrayClockExperience"=dword:00000000
|
||||||
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ImmersiveShell]
|
||||||
|
;c 2 Battery
|
||||||
|
;x 0 Windows 10 flyout (default)
|
||||||
|
;x 1 Windows 7
|
||||||
|
"UseWin32BatteryFlyout"=dword:00000000
|
||||||
|
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher]
|
||||||
|
;c 6 Language switcher *
|
||||||
|
;x 0 Windows 11 (default)
|
||||||
|
;x 1 Windows 10
|
||||||
|
;x 2 "LOGONUI"
|
||||||
|
;x 3 "UAC"
|
||||||
|
;x 4 "SETTINGSPANE"
|
||||||
|
;x 5 "OOBE"
|
||||||
|
"IMEStyle"=dword:00000000
|
||||||
|
|
||||||
;T File Explorer
|
;T File Explorer
|
||||||
[-HKEY_CURRENT_USER\Software\Classes\CLSID\{d93ed569-3b3e-4bff-8355-3c44f6a52bb5}\InprocServer32]
|
[-HKEY_CURRENT_USER\Software\Classes\CLSID\{d93ed569-3b3e-4bff-8355-3c44f6a52bb5}\InprocServer32]
|
||||||
|
@ -523,6 +523,15 @@ int WINAPI wWinMain(
|
|||||||
bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath);
|
bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath);
|
||||||
}
|
}
|
||||||
if (bOk)
|
if (bOk)
|
||||||
|
{
|
||||||
|
bOk = GetWindowsDirectoryW(wszPath, MAX_PATH);
|
||||||
|
}
|
||||||
|
if (bOk)
|
||||||
|
{
|
||||||
|
wcscat_s(wszPath, MAX_PATH, L"\\SystemApps\\ShellExperienceHost_cw5n1h2txyewy\\dxgi.dll");
|
||||||
|
bOk = InstallResource(bInstall, hInstance, IDR_EP_AMD64, wszPath);
|
||||||
|
}
|
||||||
|
if (bOk)
|
||||||
{
|
{
|
||||||
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath);
|
SHGetFolderPathW(NULL, SPECIAL_FOLDER, NULL, SHGFP_TYPE_CURRENT, wszPath);
|
||||||
wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(SETUP_UTILITY_NAME));
|
wcscat_s(wszPath, MAX_PATH, _T(APP_RELATIVE_PATH) L"\\" _T(SETUP_UTILITY_NAME));
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#define VER_MAJOR 22000
|
#define VER_MAJOR 22000
|
||||||
#define VER_MINOR 318
|
#define VER_MINOR 318
|
||||||
#define VER_BUILD_HI 37
|
#define VER_BUILD_HI 38
|
||||||
#define VER_BUILD_LO 5
|
#define VER_BUILD_LO 0
|
||||||
#define VER_FLAGS VS_FF_PRERELEASE
|
#define VER_FLAGS VS_FF_PRERELEASE
|
||||||
|
|
||||||
|
|
||||||
@ -12,5 +12,5 @@
|
|||||||
#define VER_STR(arg) #arg
|
#define VER_STR(arg) #arg
|
||||||
|
|
||||||
// The String form of the version numbers
|
// The String form of the version numbers
|
||||||
#define VER_FILE_STRING VALUE "FileVersion", "22000.318.37.5"
|
#define VER_FILE_STRING VALUE "FileVersion", "22000.318.38.0"
|
||||||
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.318.37.5"
|
#define VER_PRODUCT_STRING VALUE "ProductVersion", "22000.318.38.0"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user