Skip to content

Commit

Permalink
* Fea #66, 为.NET 8提供XP兼容
Browse files Browse the repository at this point in the history
  - 新增GetProcessGroupAffinity
  - 新增QueryUnbiasedInterruptTime
  - 新增FindStringOrdinal
  - 新增GetEnabledXStateFeatures
  - 新增SetXStateFeaturesMask
  - 新增InitializeContext
  - 新增InitializeContext2
  - 新增LocateXStateFeature
  • Loading branch information
mingkuang-Chuyu committed May 2, 2024
1 parent 4db5161 commit 22d9183
Show file tree
Hide file tree
Showing 7 changed files with 414 additions and 3 deletions.
8 changes: 8 additions & 0 deletions ThunksList.md
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,14 @@
| SetFileCompletionNotificationModes | 不存在时,什么也不做。
| GetQueuedCompletionStatusEx | 不存在时,调用 GetQueuedCompletionStatus。
| FindFirstFileEx(W/A) | Windows XP、Vista兼容 FIND_FIRST_EX_LARGE_FETCH、FindExInfoStandard参数。
| GetProcessGroupAffinity | 不存在时,始终认为只有一组CPU。
| QueryUnbiasedInterruptTime | 不存在时,调用QueryPerformanceCounter。
| FindStringOrdinal | 不存在时,调用CompareStringOrdinal。
| GetEnabledXStateFeatures | 不存在时,调用IsProcessorFeaturePresent。
| SetXStateFeaturesMask | 不存在时,内部实现。
| InitializeContext | 不存在时,内部实现。
| InitializeContext2 | 不存在时,调用InitializeContext。
| LocateXStateFeature | 不存在时,内部实现。

## mfplat.dll
| 函数 | Fallback
Expand Down
99 changes: 98 additions & 1 deletion src/Thunks/api-ms-win-core-libraryloader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -738,5 +738,102 @@ namespace YY
return EnumResourceLanguagesA(_hModule, _lpType, _lpName, _lpEnumFunc, _lParam);
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN7)

// 最低受支持的客户端 Windows 7 [桌面应用 |UWP 应用]
// 最低受支持的服务器 Windows Server 2008 R2[桌面应用 | UWP 应用]
__DEFINE_THUNK(
kernel32,
24,
int,
WINAPI,
FindStringOrdinal,
_In_ DWORD _uFindStringOrdinalFlags,
_In_reads_(_cchSource) LPCWSTR _pStringSource,
_In_ int _cchSource,
_In_reads_(_cchValue) LPCWSTR _pStringValue,
_In_ int _cchValue,
_In_ BOOL _bIgnoreCase
)
{
if (const auto _pfnFindStringOrdinal = try_get_FindStringOrdinal())
{
return _pfnFindStringOrdinal(_uFindStringOrdinalFlags, _pStringSource, _cchSource, _pStringValue, _cchValue, _bIgnoreCase);
}

SetLastError(ERROR_SUCCESS);
if (_pStringSource == nullptr || _cchSource < -1 || _pStringValue == nullptr || _cchValue < -1)
{
SetLastError(ERROR_INVALID_PARAMETER);
return -1;
}

if (_cchSource == -1)
{
_cchSource = wcslen(_pStringSource);
}

if (_cchSource == 0)
{
return -1;
}

if (_cchValue == -1)
{
_cchValue = wcslen(_pStringValue);
}

if (_cchValue == 0 || _cchValue > _cchSource)
{
return -1;
}

switch (_uFindStringOrdinalFlags)
{
case 0:
case FIND_FROMSTART:
for (auto _pStart = _pStringSource; _cchValue <= _cchSource;++_pStart, --_cchSource)
{
if (CompareStringOrdinal(_pStart, _cchValue, _pStringValue, _cchValue, _bIgnoreCase) == CSTR_EQUAL)
{
return _pStart - _pStringSource;
}
}
return -1;
break;
case FIND_FROMEND:
for (auto _pStart = _pStringSource + _cchSource - _cchValue; _cchValue <= _cchSource; --_pStart, --_cchSource)
{
if (CompareStringOrdinal(_pStart, _cchValue, _pStringValue, _cchValue, _bIgnoreCase) == CSTR_EQUAL)
{
return _pStart - _pStringSource;
}
}
return -1;
break;
case FIND_STARTSWITH:
if (CompareStringOrdinal(_pStringSource, _cchValue, _pStringValue, _cchValue, _bIgnoreCase) == CSTR_EQUAL)
{
return 0;
}
return -1;
break;
case FIND_ENDSWITH:
_cchSource -= _cchValue;
if (CompareStringOrdinal(_pStringSource + _cchSource, _cchValue, _pStringValue, _cchValue, _bIgnoreCase) == CSTR_EQUAL)
{
return _cchSource;
}
return -1;
break;
default:
SetLastError(ERROR_INVALID_FLAGS);
return -1;
break;
}
}
#endif
}
}
}
45 changes: 45 additions & 0 deletions src/Thunks/api-ms-win-core-processtopology.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include <processtopologyapi.h>

namespace YY
{
namespace Thunks
{
#if (YY_Thunks_Support_Version < NTDDI_WIN7)

//Minimum supported client Windows 7 [desktop apps only]
//Minimum supported server Windows Server 2008 R2 [desktop apps only]
__DEFINE_THUNK(
kernel32,
12,
BOOL,
WINAPI,
GetProcessGroupAffinity,
_In_ HANDLE _hProcess,
_Inout_ PUSHORT _pGroupCount,
_Out_writes_(*_pGroupCount) PUSHORT _pGroupArray
)
{
if (const auto _pfnGetProcessGroupAffinity = try_get_GetProcessGroupAffinity())
{
return _pfnGetProcessGroupAffinity(_hProcess, _pGroupCount, _pGroupArray);
}

// 更低版本系统不支持 CPU组,所以我们可以视为系统只有一组处理器。
if (_pGroupCount == nullptr || _pGroupArray == nullptr)
{
SetLastError(ERROR_NOACCESS);
return FALSE;
}

if (*_pGroupCount < 1)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
*_pGroupCount = 1;
_pGroupArray[0] = 0;
return TRUE;
}
#endif
} // namespace Thunks
} // namespace YY
49 changes: 47 additions & 2 deletions src/Thunks/api-ms-win-core-realtime.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,56 @@ namespace YY

((ULARGE_INTEGER*)CycleTime)->LowPart = UserTime.dwLowDateTime;
((ULARGE_INTEGER*)CycleTime)->HighPart = UserTime.dwHighDateTime;

return TRUE;
}
#endif


#if (YY_Thunks_Support_Version < NTDDI_WIN7)

// 最低受支持的客户端 Windows 7、Windows 8 [桌面应用 |UWP 应用]
// 最低受支持的服务器 Windows Server 2008 R2[桌面应用 | UWP 应用]
__DEFINE_THUNK(
kernel32,
4,
BOOL,
WINAPI,
QueryUnbiasedInterruptTime,
_Out_ PULONGLONG _puUnbiasedTime
)
{
if (const auto _pfnQueryUnbiasedInterruptTime = try_get_QueryUnbiasedInterruptTime())
{
return _pfnQueryUnbiasedInterruptTime(_puUnbiasedTime);
}

if (!_puUnbiasedTime)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}

// 使用中断时间模拟非中断时间,先合凑合吧……
static LARGE_INTEGER _Frequency;
if (_Frequency.QuadPart == 0ll)
{
if (!QueryPerformanceFrequency(&_Frequency))
{
return FALSE;
}
}

LARGE_INTEGER _PerformanceCount;
if (!QueryPerformanceCounter(&_PerformanceCount))
{
return FALSE;
}

// 单位需要转换到 100纳秒
*_puUnbiasedTime = _PerformanceCount.QuadPart * 1'000'000'0 / _Frequency.QuadPart;
return TRUE;
}
#endif
}//namespace Thunks

} //namespace YY
} //namespace YY
Loading

0 comments on commit 22d9183

Please sign in to comment.