Skip to content

Commit

Permalink
Fea, 添加一些roapi(PR #142
Browse files Browse the repository at this point in the history
  - 添加 RoFailFastWithErrorContext
  - 添加 RoOriginateLanguageException
  - 添加 RoTransformError
  - 添加 RoTransformErrorW
  - 添加 RoGetAgileReference
  • Loading branch information
HIllya51 authored and mingkuang-Chuyu committed Feb 4, 2025
1 parent aa917e2 commit d118459
Show file tree
Hide file tree
Showing 4 changed files with 291 additions and 140 deletions.
9 changes: 7 additions & 2 deletions ThunksList.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,12 @@
## api-ms-win-core-winrt-error-l1-1-0.dll
| 函数 | Fallback
| ---- | -----------
| RoOriginateError | 返回 TRUE.
| RoOriginateErrorW | 返回 TRUE.
| RoFailFastWithErrorContext | 调用RaiseFailFastException。
| RoOriginateError | 根据error值返回TRUE或者FLASE。
| RoOriginateErrorW | 根据error值返回TRUE或者FLASE。
| RoOriginateLanguageException | 调用RoOriginateError。
| RoTransformError | 根据oldError以及newError值返回TRUE或者FLASE。
| RoTransformErrorW | 根据oldError以及newError值返回TRUE或者FLASE。

## api-ms-win-core-winrt-string-l1-1-0.dll
| 函数 | Fallback
Expand Down Expand Up @@ -624,6 +628,7 @@
| 函数 | Fallback
| ---- | -----------
| CoGetApartmentType | 调用IComThreadingInfo。
| RoGetAgileReference | 返回E_NOINTERFACE。

## pdh.dll
| 函数 | Fallback
Expand Down
1 change: 1 addition & 0 deletions src/Thunks/YY_Thunks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ YY-Thunks支持的控制宏:
_APPLY(api_ms_win_core_winrt_l1_1_0, "api-ms-win-core-winrt-l1-1-0" , 0 ) \
_APPLY(api_ms_win_core_winrt_string_l1_1_0, "api-ms-win-core-winrt-string-l1-1-0", 0 ) \
_APPLY(api_ms_win_core_winrt_error_l1_1_0, "api-ms-win-core-winrt-error-l1-1-0" , 0 ) \
_APPLY(api_ms_win_core_winrt_error_l1_1_1, "api-ms-win-core-winrt-error-l1-1-1" , 0 ) \
_APPLY(api_ms_win_core_path_l1_1_0, "api-ms-win-core-path-l1-1-0" , 0 ) \
_APPLY(api_ms_win_core_synch_l1_2_0, "api-ms-win-core-synch-l1-2-0" , 0 )

Expand Down
187 changes: 110 additions & 77 deletions src/Thunks/api-ms-win-core-com.hpp
Original file line number Diff line number Diff line change
@@ -1,77 +1,110 @@
#if (YY_Thunks_Target < __WindowsNT6_1)
#include <combaseapi.h>
#endif

#if (YY_Thunks_Target < __WindowsNT6_1) && !defined(__Comment_Lib_ole32)
#define __Comment_Lib_ole32
#pragma comment(lib, "ole32.lib")
#endif

namespace YY::Thunks
{
#if (YY_Thunks_Target < __WindowsNT6_1)

// Windows 7 [桌面应用|UWP 应用], Windows Server 2008 R2 [桌面应用|UWP 应用]
__DEFINE_THUNK(
ole32,
8,
HRESULT,
WINAPI,
CoGetApartmentType,
_Out_ APTTYPE* _pAptType,
_Out_ APTTYPEQUALIFIER* _pAptQualifier
)
{
if (auto _pfnCoGetApartmentType = try_get_CoGetApartmentType())
{
return _pfnCoGetApartmentType(_pAptType, _pAptQualifier);
}

if (_pAptType == nullptr || _pAptQualifier == nullptr)
return E_INVALIDARG;

*_pAptType = APTTYPE_CURRENT;
*_pAptQualifier = APTTYPEQUALIFIER_NONE;

IUnknown* _pContextToken;
auto _hr = CoGetContextToken((ULONG_PTR*)&_pContextToken);
if (FAILED(_hr))
return _hr;

IComThreadingInfo* _pComThreadingInfo;
_hr = _pContextToken->QueryInterface(&_pComThreadingInfo);
if (FAILED(_hr))
return _hr;

_hr = _pComThreadingInfo->GetCurrentApartmentType(_pAptType);
_pComThreadingInfo->Release();
if (FAILED(_hr))
return _hr;

switch (*_pAptType)
{
case APTTYPE_STA:
*_pAptQualifier = APTTYPEQUALIFIER_APPLICATION_STA;
break;
case APTTYPE_MTA:
// todo: 无法区分:
// APTTYPEQUALIFIER_NONE
// APTTYPEQUALIFIER_IMPLICIT_MTA
break;
case APTTYPE_NA:
// todo: 无法区分
// APTTYPEQUALIFIER_NA_ON_MTA
// APTTYPEQUALIFIER_NA_ON_STA
// APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA
// APTTYPEQUALIFIER_NA_ON_MAINSTA
break;
case APTTYPE_MAINSTA:
break;
default:
break;
}

return S_OK;
}
#endif
}
#if (YY_Thunks_Target < __WindowsNT6_3)
#include <combaseapi.h>
#endif

#if (YY_Thunks_Target < __WindowsNT6_1) && !defined(__Comment_Lib_ole32)
#define __Comment_Lib_ole32
#pragma comment(lib, "ole32.lib")
#endif

namespace YY::Thunks
{
#if (YY_Thunks_Target < __WindowsNT6_1)

// Windows 7 [桌面应用|UWP 应用], Windows Server 2008 R2 [桌面应用|UWP 应用]
__DEFINE_THUNK(
ole32,
8,
HRESULT,
WINAPI,
CoGetApartmentType,
_Out_ APTTYPE* _pAptType,
_Out_ APTTYPEQUALIFIER* _pAptQualifier
)
{
if (auto _pfnCoGetApartmentType = try_get_CoGetApartmentType())
{
return _pfnCoGetApartmentType(_pAptType, _pAptQualifier);
}

if (_pAptType == nullptr || _pAptQualifier == nullptr)
return E_INVALIDARG;

*_pAptType = APTTYPE_CURRENT;
*_pAptQualifier = APTTYPEQUALIFIER_NONE;

IUnknown* _pContextToken;
auto _hr = CoGetContextToken((ULONG_PTR*)&_pContextToken);
if (FAILED(_hr))
return _hr;

IComThreadingInfo* _pComThreadingInfo;
_hr = _pContextToken->QueryInterface(&_pComThreadingInfo);
if (FAILED(_hr))
return _hr;

_hr = _pComThreadingInfo->GetCurrentApartmentType(_pAptType);
_pComThreadingInfo->Release();
if (FAILED(_hr))
return _hr;

switch (*_pAptType)
{
case APTTYPE_STA:
*_pAptQualifier = APTTYPEQUALIFIER_APPLICATION_STA;
break;
case APTTYPE_MTA:
// todo: 无法区分:
// APTTYPEQUALIFIER_NONE
// APTTYPEQUALIFIER_IMPLICIT_MTA
break;
case APTTYPE_NA:
// todo: 无法区分
// APTTYPEQUALIFIER_NA_ON_MTA
// APTTYPEQUALIFIER_NA_ON_STA
// APTTYPEQUALIFIER_NA_ON_IMPLICIT_MTA
// APTTYPEQUALIFIER_NA_ON_MAINSTA
break;
case APTTYPE_MAINSTA:
break;
default:
break;
}

return S_OK;
}
#endif


#if (YY_Thunks_Target < __WindowsNT6_3)

// 最低受支持的客户端 Windows 8.1 [桌面应用 |UWP 应用]
// 最低受支持的服务器 Windows Server 2012 R2[桌面应用 | UWP 应用]
__DEFINE_THUNK(
ole32,
16,
HRESULT,
WINAPI,
RoGetAgileReference,
_In_ enum AgileReferenceOptions _eOptions,
_In_ REFIID _Id,
_In_ IUnknown* pUnk,
_COM_Outptr_ IAgileReference** _ppAgileReference
)
{
if (const auto _pfnRoGetAgileReference = try_get_RoGetAgileReference())
{
return _pfnRoGetAgileReference(_eOptions, _Id, pUnk, _ppAgileReference);
}

if (!_ppAgileReference)
return E_POINTER;

*_ppAgileReference = nullptr;
if (!pUnk)
return E_POINTER;

return E_NOINTERFACE;
}
#endif
}
Loading

0 comments on commit d118459

Please sign in to comment.