Skip to content

Commit

Permalink
Fea #71, 让qt5.15.12支持XP,扩充DEPPolicy接口
Browse files Browse the repository at this point in the history
  - 添加 SetProcessDEPPolicy
  - 添加 GetSystemDEPPolicy
  • Loading branch information
mingkuang-Chuyu committed May 20, 2024
1 parent 241874c commit d9d43cc
Show file tree
Hide file tree
Showing 9 changed files with 415 additions and 9 deletions.
12 changes: 12 additions & 0 deletions ThunksList.md
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,8 @@
| SetProcessWorkingSetSizeEx | 不存在时,调用SetProcessWorkingSetSize。
| GetProcessWorkingSetSizeEx | 不存在时,调用GetProcessWorkingSetSize。
| GetTimeZoneInformationForYear | 不存在时,直接读取`Time Zones`注册表。
| SetProcessDEPPolicy | 不存在时,调用NtSetInformationProcess。
| GetSystemDEPPolicy | 不存在时,返回总是关闭。

## mfplat.dll
| 函数 | Fallback
Expand Down Expand Up @@ -503,6 +505,16 @@
| IsTouchWindow | 不存在时,始终报告非触摸窗口。
| GetTouchInputInfo | 不存在时,报告错误 ERROR_INVALID_HANDLE。
| CloseTouchInputHandle | 不存在时,报告错误 ERROR_INVALID_HANDLE。
| *ChangeWindowMessageFilterEx | 不存在时,调用ChangeWindowMessageFilter。温馨提示:将影响该进程的所有窗口。
| ChangeWindowMessageFilter | 不存在时,什么都不做,假装成功。
| UpdateLayeredWindowIndirect | 不存在时,调用UpdateLayeredWindow。
| AddClipboardFormatListener | 不存在时,什么都不做,假装成功。
| RemoveClipboardFormatListener | 不存在时,什么都不做,假装成功。
| RegisterPowerSettingNotification | 不存在时,什么都不做,假装成功。
| UnregisterPowerSettingNotification | 不存在时,什么都不做,假装成功。
| DisplayConfigGetDeviceInfo | 不存在时,报告没有安装驱动。
| GetDisplayConfigBufferSizes | 不存在时,报告没有安装驱动。
| QueryDisplayConfig | 不存在时,报告没有安装驱动。

## userenv.dll
| 函数 | Fallback
Expand Down
55 changes: 55 additions & 0 deletions src/Thunks/ext-ms-win-ntuser-gui.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
namespace YY::Thunks
{
#if (YY_Thunks_Support_Version < NTDDI_WIN7)

// 最低受支持的客户端 Windows 7 [仅限桌面应用]
// 最低受支持的服务器 Windows Server 2008 R2[仅限桌面应用]
__DEFINE_THUNK(
user32,
16,
BOOL,
WINAPI,
ChangeWindowMessageFilterEx,
_In_ HWND _hWnd,
_In_ UINT _uMessage,
_In_ DWORD _uAction,
_Inout_opt_ PCHANGEFILTERSTRUCT _pChangeFilterStruct
)
{
if (const auto _pfnChangeWindowMessageFilterEx = try_get_ChangeWindowMessageFilterEx())
{
return _pfnChangeWindowMessageFilterEx(_hWnd, _uMessage, _uAction, _pChangeFilterStruct);
}

if (_hWnd == NULL || (_pChangeFilterStruct && _pChangeFilterStruct->cbSize != sizeof(CHANGEFILTERSTRUCT)))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}

DWORD _fFlag;
if (_uAction == MSGFLT_ALLOW || _uAction == MSGFLT_DISALLOW)
{
_fFlag = _uAction;
}
else if (_uAction == MSGFLT_RESET)
{
// 默认情况下大于WM_USER的全部阻止,这是系统规则。
_fFlag = _uMessage >= WM_USER ? MSGFLT_REMOVE : MSGFLT_ADD;
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}

auto _bRet = ChangeWindowMessageFilter(_uMessage, _fFlag);
if (_bRet && _pChangeFilterStruct)
{
_pChangeFilterStruct->ExtStatus = MSGFLTINFO_NONE;
}

return _bRet;
}
#endif
}
47 changes: 47 additions & 0 deletions src/Thunks/ext-ms-win-ntuser-misc.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
namespace YY::Thunks
{
#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 Windows Vista [仅限桌面应用]
// 最低受支持的服务器 Windows Server 2008[仅限桌面应用]
__DEFINE_THUNK(
user32,
4,
BOOL,
WINAPI,
AddClipboardFormatListener,
_In_ HWND _hWnd
)
{
if (const auto _pfnAddClipboardFormatListener = try_get_AddClipboardFormatListener())
{
return _pfnAddClipboardFormatListener(_hWnd);
}

return TRUE;
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 Windows Vista [仅限桌面应用]
// 最低受支持的服务器 Windows Server 2008[仅限桌面应用]
__DEFINE_THUNK(
user32,
4,
BOOL,
WINAPI,
RemoveClipboardFormatListener,
_In_ HWND _hWnd
)
{
if (const auto _pfnRemoveClipboardFormatListener = try_get_RemoveClipboardFormatListener())
{
return _pfnRemoveClipboardFormatListener(_hWnd);
}

return TRUE;
}
#endif
}
70 changes: 62 additions & 8 deletions src/Thunks/ext-ms-win-ntuser-powermanagement.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#if (YY_Thunks_Support_Version < NTDDI_WIN8)
#if (YY_Thunks_Support_Version < NTDDI_WIN8)
#include <winuser.h>
#endif

Expand All @@ -12,7 +12,7 @@ namespace YY

#if (YY_Thunks_Support_Version < NTDDI_WIN8)

// Windows 8 [仅限桌面应用],Windows Server 2012 [仅限桌面应用]
// Windows 8 [仅限桌面应用],Windows Server 2012 [仅限桌面应用]
__DEFINE_THUNK(
user32,
8,
Expand Down Expand Up @@ -45,15 +45,15 @@ namespace YY
}
else if (DEVICE_NOTIFY_WINDOW_HANDLE == _fFlags)
{
// 这种情况需要向窗口发送电源通知,但是老版本系统不支持 现代化睡眠
// 本身就是可以正确处理这种情况的。所以我们忽略参数,直接返回一个标记常量即可。
// 这种情况需要向窗口发送电源通知,但是老版本系统不支持 现代化睡眠
// 本身就是可以正确处理这种情况的。所以我们忽略参数,直接返回一个标记常量即可。
UNREFERENCED_PARAMETER(_hRecipient);

return CONST_DEVICE_NOTIFY_WINDOW_HANDLE;
}
else
{
// 仅支持这二个参数
// 仅支持这二个参数
SetLastError(ERROR_INVALID_PARAMETER);
return nullptr;
}
Expand All @@ -62,7 +62,7 @@ namespace YY

#if (YY_Thunks_Support_Version < NTDDI_WIN8)

// Windows 8 [仅限桌面应用],Windows Server 2012 [仅限桌面应用]
// Windows 8 [仅限桌面应用],Windows Server 2012 [仅限桌面应用]
__DEFINE_THUNK(
user32,
4,
Expand All @@ -84,12 +84,12 @@ namespace YY
}
else if (_hHandle == CONST_DEVICE_NOTIFY_WINDOW_HANDLE)
{
// 忽略,这是 DEVICE_NOTIFY_WINDOW_HANDLE 的常量
// 忽略,这是 DEVICE_NOTIFY_WINDOW_HANDLE 的常量
return TRUE;
}
else
{
// 来自 DEVICE_NOTIFY_CALLBACK的注册
// 来自 DEVICE_NOTIFY_CALLBACK的注册
auto _lStatus = PowerUnregisterSuspendResumeNotificationDownlevel(_hHandle);
if (_lStatus == ERROR_SUCCESS)
{
Expand All @@ -103,5 +103,59 @@ namespace YY
}
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 Windows Vista [仅限桌面应用]
// 最低受支持的服务器 Windows Server 2008[仅限桌面应用]
__DEFINE_THUNK(
user32,
12,
HPOWERNOTIFY,
WINAPI,
RegisterPowerSettingNotification,
IN HANDLE hRecipient,
IN LPCGUID PowerSettingGuid,
IN DWORD Flags
)
{
if (const auto _pfnRegisterPowerSettingNotification = try_get_RegisterPowerSettingNotification())
{
return _pfnRegisterPowerSettingNotification(hRecipient, PowerSettingGuid, Flags);
}

return reinterpret_cast<HPOWERNOTIFY>(5);
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 Windows Vista [仅限桌面应用]
// 最低受支持的服务器 Windows Server 2008[仅限桌面应用]
__DEFINE_THUNK(
user32,
4,
BOOL,
WINAPI,
UnregisterPowerSettingNotification,
IN HPOWERNOTIFY Handle
)
{
if (const auto _pfnUnregisterPowerSettingNotification = try_get_UnregisterPowerSettingNotification())
{
return _pfnUnregisterPowerSettingNotification(Handle);
}

if (Handle == reinterpret_cast<HPOWERNOTIFY>(5))
{
return TRUE;
}

SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
#endif
}
}
78 changes: 78 additions & 0 deletions src/Thunks/ext-ms-win-ntuser-sysparams-ext.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#include <winuser.h>

namespace YY::Thunks
{
#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 在 Windows Vista 和更高版本的 Windows 操作系统中可用。
__DEFINE_THUNK(
user32,
4,
LONG,
WINAPI,
DisplayConfigGetDeviceInfo,
_Inout_ DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket
)
{
if (const auto _pfnDisplayConfigGetDeviceInfo = try_get_DisplayConfigGetDeviceInfo())
{
return _pfnDisplayConfigGetDeviceInfo(requestPacket);
}

return ERROR_NOT_SUPPORTED;
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 在 Windows Vista 和更高版本的 Windows 操作系统中可用。
__DEFINE_THUNK(
user32,
12,
LONG,
WINAPI,
GetDisplayConfigBufferSizes,
_In_ UINT32 flags,
_Out_ UINT32* numPathArrayElements,
_Out_ UINT32* numModeInfoArrayElements
)
{
if (const auto _pfnGetDisplayConfigBufferSizes = try_get_GetDisplayConfigBufferSizes())
{
return _pfnGetDisplayConfigBufferSizes(flags, numPathArrayElements, numModeInfoArrayElements);
}

return ERROR_NOT_SUPPORTED;
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN6)

// 最低受支持的客户端 在 Windows Vista 和更高版本的 Windows 操作系统中可用。
__DEFINE_THUNK(
user32,
24,
LONG,
WINAPI,
QueryDisplayConfig,
_In_ UINT32 flags,
_Inout_ UINT32* numPathArrayElements,
_Out_writes_to_(*numPathArrayElements, *numPathArrayElements) DISPLAYCONFIG_PATH_INFO* pathArray,
_Inout_ UINT32* numModeInfoArrayElements,
_Out_writes_to_(*numModeInfoArrayElements, *numModeInfoArrayElements) DISPLAYCONFIG_MODE_INFO* modeInfoArray,
_When_(!(flags & QDC_DATABASE_CURRENT), _Pre_null_)
_When_(flags & QDC_DATABASE_CURRENT, _Out_)
DISPLAYCONFIG_TOPOLOGY_ID* currentTopologyId
)
{
if (const auto _pfnQueryDisplayConfig = try_get_QueryDisplayConfig())
{
return _pfnQueryDisplayConfig(flags, numPathArrayElements, pathArray, numModeInfoArrayElements, modeInfoArray, currentTopologyId);
}

return ERROR_NOT_SUPPORTED;
}
#endif
}
Loading

0 comments on commit d9d43cc

Please sign in to comment.