From 580184e231c3864d489ad2f2bb25dae8189f7fd0 Mon Sep 17 00:00:00 2001 From: mingkuang Date: Wed, 30 Jun 2021 19:12:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0IsThreadAFiber=E3=80=81Conver?= =?UTF-8?q?tThreadToFiberEx=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ThunksList.md | 2 ++ src/Thunks/api-ms-win-core-fibers.hpp | 52 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/ThunksList.md b/ThunksList.md index 81318d0..000f576 100644 --- a/ThunksList.md +++ b/ThunksList.md @@ -222,6 +222,8 @@ | [FlsFree](https://docs.microsoft.com/windows/win32/api/fibersapi/nf-fibersapi-flsfree) | 不存在时,使用Tls实现。警告,此函数请勿跨模块使用!!! | [FlsGetValue](https://docs.microsoft.com/windows/win32/api/fibersapi/nf-fibersapi-flsgetvalue) | 不存在时,使用Tls实现。警告,此函数请勿跨模块使用!!! | [FlsSetValue](https://docs.microsoft.com/windows/win32/api/fibersapi/nf-fibersapi-flssetvalue) | 不存在时,使用Tls实现。警告,此函数请勿跨模块使用!!! +| [IsThreadAFiber](https://docs.microsoft.com/windows/win32/api/fibersapi/nf-fibersapi-isthreadafiber) | 不存在时,调用 GetCurrentFiber。 +| [ConvertThreadToFiberEx](https://docs.microsoft.com/windows/win32/api/winbase/nf-winbase-convertthreadtofiberex) | 不存在时,调用 ConvertThreadToFiber。 | [RoInitialize](https://docs.microsoft.com/windows/win32/api/roapi/nf-roapi-roinitialize) | 不存在时,调用 CoInitializeEx。 | [RoUninitialize](https://docs.microsoft.com/windows/win32/api/roapi/nf-roapi-rouninitialize) | 不存在时,调用 CoUninitialize。 diff --git a/src/Thunks/api-ms-win-core-fibers.hpp b/src/Thunks/api-ms-win-core-fibers.hpp index b9729e6..01dfc68 100644 --- a/src/Thunks/api-ms-win-core-fibers.hpp +++ b/src/Thunks/api-ms-win-core-fibers.hpp @@ -517,5 +517,57 @@ namespace YY } #endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + //Minimum supported client Windows Vista [desktop apps | UWP apps] + //Minimum supported server Windows Server 2008 [desktop apps | UWP apps] + __DEFINE_THUNK( + kernel32, + 0, + BOOL, + WINAPI, + IsThreadAFiber, + VOID + ) + { + if (const auto pIsThreadAFiber = try_get_IsThreadAFiber()) + { + return pIsThreadAFiber(); + } + + //如果当前没有 Fiber,那么我们认为这不是一个纤程 + auto pFiber = GetCurrentFiber(); + + //0x1e00 是一个魔幻数字,似乎所有NT系统都会这样,当前不是一个Fiber时,第一次会返回 0x1e00。 + return pFiber != nullptr && pFiber != (void*)0x1e00; + } +#endif + + +#if (YY_Thunks_Support_Version < NTDDI_WIN6) + + //Minimum supported client Windows Vista [desktop apps | UWP apps] + //Minimum supported server Windows Server 2008 [desktop apps | UWP apps] + __DEFINE_THUNK( + kernel32, + 8, + LPVOID, + WINAPI, + ConvertThreadToFiberEx, + _In_opt_ LPVOID lpParameter, + _In_ DWORD dwFlags + ) + { + if (const auto pConvertThreadToFiberEx = try_get_ConvertThreadToFiberEx()) + { + return pConvertThreadToFiberEx(lpParameter, dwFlags); + } + + //FIBER_FLAG_FLOAT_SWITCH 无法使用,不过似乎关系不大。一些boost基础设施中都不切换浮点状态。 + return ConvertThreadToFiber(lpParameter); + } +#endif } } \ No newline at end of file