# YY-Thunks **Repository Path**: sofeware/YY-Thunks ## Basic Information - **Project Name**: YY-Thunks - **Description**: 优雅的解决Windows XP RTM无法定位程序输入点 DecodePointer、EncodePointer、RegDeleteKeyEx等,让你兼容Windows XP更轻松。 - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2019-11-13 - **Last Updated**: 2022-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README  # YY-Thunks——让兼容Windows更轻松 ## 1. 关于YY-Thunks 总众所周知Windows XP每个SP都会新增大量API,而Windows 10每次更新又会新增大量API,这使得兼容不同版本的Windows需要大量的判断。 甚至大量开源代码已经不再兼容一些早期的Windows XP版本,比如 Windows XP RTM。难道就没有一种快速高效的方案解决无法定位程序输入点的问题吗? YY-Thunks(鸭船),存在的目的就是抹平不同系统的差异,编译时单纯添加一个obj即可自动解决这些兼容性问题。让你兼容Windows更轻松! [ [鸭船交流群 633710173](https://shang.qq.com/wpa/qunwpa?idkey=21d51d8ad1d77b99ea9544b399e080ec347ca6a1bc04267fb59cebf22644a42a) ] ### 1.1. 原理 使用`LoadLibrary`以及`GetProcAddress`动态加载API,不存在时做出补偿措施,最大限度模拟原始API行为,让你的程序正常运行。 ### 1.2. 亮点 * 更快!更安全!`鸭船`内建2级缓存以及按需加载机制,同时自动加密所有函数指针,防止内存爆破攻击。最大程度减少不需要的、不必要的`LoadLibrary以及GetProcAddress`调用以及潜在安全风险。 * 轻松兼容Windows XP,让你安心专注于业务逻辑。 * 完全的开放代码,广泛的接受用户意见,希望大家能踊跃的 pull requests,为`鸭船`添砖加瓦。 ## 2. 使用YY-Thunks 1. 下载[YY-Thunks-Binary](https://github.com/Chuyu-Team/YY-Thunks/releases),然后解压到你的工程目录。
2. 【链接器】-【输入】-【附加依赖项】,添加`objs\$(PlatformShortName)\YY_Thunks_for_WinXP.obj`。
3. 重新编译代码。 ## 3. YY-Thunks兼容性 ### 3.1. 支持的编译器 全平台ABI兼容。 * 所有Visual Studio版本均支持(比如:VC6.0、VS2008、VS2010、VS2015、VS2017、VS2019等等)。 * 所有运行库模式均支持(比如:`/MD`、`/MT`、`/MDd`、`/MTd`)。 ### 3.2. Thunks清单 此表展示了YY-Thunks(鸭船)可以解决的函数不存在问题,欢迎大家扩充! > 开头带`*`的函数并不建议使用,仅用于编译通过处理,如果使用可能导致老版本系统无法充分发挥性能。 | 函数 | Fallback | ---- | ----------- | [DecodePointer](https://msdn.microsoft.com/library/bb432242.aspx) | 不存在时,返回指针本身。 | [EncodePointer](https://msdn.microsoft.com/library/bb432254.aspx) | 不存在时,返回指针本身。 | [RegDeleteKeyExW(A)](https://msdn.microsoft.com/library/windows/desktop/ms724847.aspx) | 不存在时,调用RegDeleteKeyW(A)。 | [Wow64DisableWow64FsRedirection](https://msdn.microsoft.com/library/windows/desktop/aa365743.aspx) | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 | [Wow64RevertWow64FsRedirection](https://msdn.microsoft.com/library/windows/desktop/aa365745.aspx) | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 | [Wow64EnableWow64FsRedirection](https://msdn.microsoft.com/library/windows/desktop/aa365744.aspx) | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 | [IsWow64Process](https://msdn.microsoft.com/library/windows/desktop/ms684139.aspx) | 不存在时,返回TRUE,并设置 `*Wow64Process = FALSE`。 | [IsWow64Message](https://msdn.microsoft.com/library/windows/desktop/ms684136.aspx) | 不存在时,返回FALSE。 | [RegSetKeyValueW(A)](https://msdn.microsoft.com/library/ms724921.aspx) | 调用RegCreateKeyExW(A)以及RegSetValueExW(A)。 | [RegDeleteKeyValueW(A)](https://msdn.microsoft.com/library/ms724848.aspx) | 调用RegOpenKeyExW(A)以及RegDeleteValueW(A)。 | [RegDeleteTreeW(A)](https://msdn.microsoft.com/library/aa379776.aspx) | 调用SHDeleteKeyW(A)。 | [RegGetValueW(A)](https://msdn.microsoft.com/library/aa379776.aspx) | 不存在时,调用RegQueryValueExW(A)。 | [IsWow64Process2](https://msdn.microsoft.com/library/windows/desktop/mt804318.aspx) | 不存在时,调用IsWow64Process。 | [IsWow64GuestMachineSupported](https://msdn.microsoft.com/library/windows/desktop/mt804321.aspx) | 不存在时,调用GetNativeSystemInfo。 | [GetTickCount64](https://msdn.microsoft.com/library/windows/desktop/ms724411.aspx) | 不存在时,调用GetTickCount。 | [GetSystemTimePreciseAsFileTime](https://msdn.microsoft.com/library/windows/desktop/hh706895.aspx) | 不存在时,调用GetSystemTimeAsFileTime。 | [InitializeCriticalSectionEx](https://msdn.microsoft.com/library/ms683477.aspx) | 不存在时,调用InitializeCriticalSectionAndSpinCount。 | [InitOnceInitialize](https://msdn.microsoft.com/library/ms683495.aspx) | 初始化为 INIT_ONCE_STATIC_INIT。 | [InitOnceBeginInitialize](https://msdn.microsoft.com/library/ms683487.aspx) | 不存在时,调用NtWaitForKeyedEvent。 | [InitOnceComplete](https://msdn.microsoft.com/library/ms683491.aspx) | 不存在时,调用NtReleaseKeyedEvent。 | [InitOnceExecuteOnce](https://msdn.microsoft.com/library/windows/desktop/ms683493.aspx) | 不存在时,调用NtWaitForKeyedEvent以及NtReleaseKeyedEvent。 | [LocaleNameToLCID](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-localenametolcid) | 不存在时,查LocaleNameToLcidTable。 | [LCIDToLocaleName](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-lcidtolocalename) | 不存在时,查LcidToLocaleNameTable。 | [GetLocaleInfoEx](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-getlocaleinfoex) | 不存在时,调用GetLocaleInfoW。 | [GetDateFormatEx](https://docs.microsoft.com/windows/desktop/api/datetimeapi/nf-datetimeapi-getdateformatex) | 不存在时,调用GetDateFormatW。 | [GetTimeFormatEx](https://docs.microsoft.com/windows/desktop/api/datetimeapi/nf-datetimeapi-gettimeformatex) | 不存在时,调用GetTimeFormatW。 | [GetNumberFormatEx](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-getnumberformatex) | 不存在时,调用GetNumberFormatW。 | [GetCurrencyFormatEx](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-getcurrencyformatex) | 不存在时,调用GetCurrencyFormatW。 | [GetUserDefaultLocaleName](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-getuserdefaultlocalename) | 不存在时,调用LCIDToLocaleName。 | [GetSystemDefaultLocaleName](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-getsystemdefaultlocalename) | 不存在时,调用LCIDToLocaleName。 | [EnumCalendarInfoExEx](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-enumcalendarinfoexex) | 不存在时,调用EnumCalendarInfoExW。 | [EnumDateFormatsExEx](https://docs.microsoft.com/windows/desktop/api/winnls/nf-winnls-enumdateformatsexex) | 不存在时,调用EnumDateFormatsExW。 | [GetFileInformationByHandleEx](https://docs.microsoft.com/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex) | 不存在时,调用NtQueryInformationFile 或者 NtQueryDirectoryFile。 | [SetFileInformationByHandle](https://docs.microsoft.com/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex) | 不存在时,调用NtSetInformationFile。 | [GetFinalPathNameByHandleW(A)](https://docs.microsoft.com/windows/desktop/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew) | 不存在时,调用NtQueryObject以及NtQueryInformationFile。 | [GetLogicalProcessorInformation](https://msdn.microsoft.com/library/ms683194.aspx) | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 | [GetLogicalProcessorInformationEx](https://msdn.microsoft.com/library/dd405488.aspx) | 不存在时,调用GetLogicalProcessorInformation。 | [InetPtonW(inet_pton)](https://docs.microsoft.com/windows/desktop/api/ws2tcpip/nf-ws2tcpip-inetptonw) | 不存在时,类似于sscanf手工分析字符串。 | [InetNtopW(inet_ntop)](https://docs.microsoft.com/windows/desktop/api/ws2tcpip/nf-ws2tcpip-inetntopw) | 不存在时,类似于sprintf手工生成字符串。 | [WSAPoll](https://docs.microsoft.com/windows/win32/api/winsock2/nf-winsock2-wsapoll) | 不存在时,调用select。 | [GetNumaHighestNodeNumber](https://msdn.microsoft.com/library/windows/desktop/ms683203.aspx) | 不存在时,返回0。 | [RaiseFailFastException](https://msdn.microsoft.com/library/windows/desktop/dd941688.aspx) | 不存在时,调用TerminateProcess。 | [GetThreadId](https://docs.microsoft.com/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getthreadid) | 不存在时,调用NtQueryInformationThread。 | [GetProcessIdOfThread](https://msdn.microsoft.com/library/ms683216.aspx) | 不存在时,调用NtQueryInformationThread。 | [GetProcessId](https://docs.microsoft.com/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getprocessid) | 不存在时,调用NtQueryInformationProcess。 | [QueryThreadCycleTime](https://docs.microsoft.com/windows/desktop/api/realtimeapiset/nf-realtimeapiset-querythreadcycletime) | 不存在时,调用GetThreadTimes。 | [QueryProcessCycleTime](https://docs.microsoft.com/windows/desktop/api/realtimeapiset/nf-realtimeapiset-queryprocesscycletime) | 不存在时,调用GetProcessTimes。 | [K32EnumProcessModules](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-enumprocessmodules) | 调用EnumProcessModules。 | [K32EnumProcessModulesEx](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-enumprocessmodulesex) | 调用EnumProcessModulesEx。 | [K32GetModuleBaseNameW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getmodulebasenamea) | 调用GetModuleBaseNameW(A)。 | [K32GetModuleFileNameExW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getmodulefilenameexw) | 调用K32GetModuleFileNameExW(A)。 | [K32EmptyWorkingSet](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-emptyworkingset) | 调用EmptyWorkingSet。 | [K32QueryWorkingSet](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-queryworkingset) | 调用QueryWorkingSet。 | [K32QueryWorkingSetEx](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-queryworkingsetex) | 调用QueryWorkingSetEx。 | [K32InitializeProcessForWsWatch](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-initializeprocessforwswatch) | 调用InitializeProcessForWsWatch。 | [K32GetWsChanges](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getwschanges) | 调用GetWsChanges。 | [K32GetWsChangesEx](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getwschangesex) | 调用GetWsChangesEx。 | [K32GetMappedFileNameW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getmappedfilenamew) | 调用GetMappedFileNameW(A)。 | [K32EnumDeviceDrivers](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-enumdevicedrivers) | 调用EnumDeviceDrivers。 | [K32GetDeviceDriverBaseNameW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getdevicedriverbasenamew) | 调用GetDeviceDriverBaseNameW(A)。 | [K32GetDeviceDriverFileNameW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getdevicedriverfilenamew) | 调用GetDeviceDriverFileNameW(A)。 | [K32GetPerformanceInfo](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getperformanceinfo) | 调用GetPerformanceInfo。 | [K32EnumPageFilesW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-enumpagefilesw) | 调用EnumPageFilesW(A)。 | [K32GetProcessImageFileNameW(A)](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-enumpagefilesw) | 调用GetProcessImageFileNameW(A)。 | [EnumProcessModulesEx](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-enumprocessmodulesex) | 不存在时,调用EnumProcessModules。 | [GetWsChangesEx](https://docs.microsoft.com/windows/desktop/api/psapi/nf-psapi-getwschangesex) | 不存在时,调用GetWsChanges。 | [QueryFullProcessImageNameW(A)](https://docs.microsoft.com/windows/desktop/api/winbase/nf-winbase-queryfullprocessimagenamew) | 不存在时,调用GetProcessImageFileNameW(A) 或者 GetModuleFileNameExW(A)。 | [CreateFile2](https://docs.microsoft.com/windows/desktop/api/fileapi/nf-fileapi-createfile2) | 不存在时,调用CreateFileW。 | [CreateEventExW(A)](https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-createeventexw) | 不存在时,调用CreateEventW(A)。 | [CreateMutexExW(A)](https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-createmutexexw) | 不存在时,调用CreateMutexW(A)。 | [CreateSemaphoreExW](https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-createsemaphoreexw) | 不存在时,调用CreateSemaphoreW。 | [CreateWaitableTimerExW](https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-createwaitabletimerexw) | 不存在时,调用CreateWaitableTimerW。 | [GetFileVersionInfoExW(A)](https://docs.microsoft.com/windows/desktop/api/winver/nf-winver-getfileversioninfosizeexw) | 不存在时,调用GetFileVersionInfoW(A)。 | [GetFileVersionInfoSizeExW(A)](https://docs.microsoft.com/windows/desktop/api/winver/nf-winver-getfileversioninfosizeexw) | 不存在时,调用GetFileVersionInfoSizeW(A)。 | [InterlockedCompareExchange64](https://docs.microsoft.com/windows/desktop/api/winnt/nf-winnt-interlockedcompareexchange64) | 调用内部函数_InterlockedCompareExchange64。 | [SetThreadErrorMode](https://docs.microsoft.com/windows/desktop/api/errhandlingapi/nf-errhandlingapi-setthreaderrormode) | 不存在时,调用SetErrorMode。 | [GetThreadErrorMode](https://docs.microsoft.com/windows/desktop/api/errhandlingapi/nf-errhandlingapi-getthreaderrormode) | 不存在时,调用GetErrorMode。 | [GetErrorMode](https://docs.microsoft.com/windows/desktop/api/errhandlingapi/nf-errhandlingapi-geterrormode) | 不存在时,调用NtQueryInformationProcess。 | [InitializeSRWLock](https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-initializesrwlock) | 初始化为 RTL_SRWLOCK_INIT。 | [AcquireSRWLockExclusive](https://docs.microsoft.com/windows/desktop/api/synchapi/nf-synchapi-acquiresrwlockexclusive) | 不存在时,调用NtWaitForKeyedEvent。 | [TryAcquireSRWLockExclusive](https://msdn.microsoft.com/library/Dd405523.aspx) | 不存在时,调用InterlockedBitTestAndSet(64)。 | [ReleaseSRWLockExclusive](https://msdn.microsoft.com/library/ms685076.aspx) | 不存在时,调用NtReleaseKeyedEvent。 | [AcquireSRWLockShared](https://msdn.microsoft.com/library/ms681934.aspx) | 不存在时,调用NtWaitForKeyedEvent。 | [TryAcquireSRWLockShared](https://msdn.microsoft.com/library/Dd405524.aspx) | 不存在时,调用InterlockedCompareExchange。 | [ReleaseSRWLockShared](https://msdn.microsoft.com/library/ms685080.aspx) | 不存在时,调用NtReleaseKeyedEvent。 | [InitializeConditionVariable](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-initializeconditionvariable) | 初始化为 CONDITION_VARIABLE_INIT。 | [SleepConditionVariableCS](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-sleepconditionvariablecs) | 不存在时,调用NtWaitForKeyedEvent。 | [SleepConditionVariableSRW](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-sleepconditionvariablesrw) | 不存在时,调用NtWaitForKeyedEvent。 | [WakeConditionVariable](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-wakeconditionvariable) | 不存在时,调用NtReleaseKeyedEvent。 | [WakeAllConditionVariable](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-wakeallconditionvariable) | 不存在时,调用NtReleaseKeyedEvent。 | [InitializeSynchronizationBarrier](https://msdn.microsoft.com/library/hh706890.aspx) | 不存在时,调用CreateEvent。 | [EnterSynchronizationBarrier](https://msdn.microsoft.com/library/hh706889.aspx) | 不存在时,调用WaitForSingleObject。 | [DeleteSynchronizationBarrier](https://msdn.microsoft.com/library/hh706887.aspx) | 不存在时,调用CloseHandle。 | [WaitOnAddress](https://docs.microsoft.com/windows/desktop/api/SynchAPI/nf-synchapi-waitonaddress) | 不存在时,调用NtWaitForKeyedEvent。警告,此函数请勿跨模块使用!!! | [WakeByAddressSingle](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-wakebyaddresssingle) | 不存在时,调用NtReleaseKeyedEvent。警告,此函数请勿跨模块使用!!! | [WakeByAddressAll](https://docs.microsoft.com/windows/win32/api/synchapi/nf-synchapi-wakebyaddressall) | 不存在时,调用NtReleaseKeyedEvent。警告,此函数请勿跨模块使用!!! | *[GetCurrentProcessorNumber](https://msdn.microsoft.com/library/windows/desktop/ms683181.aspx) | 不存在时,返回0。 | *[GetCurrentProcessorNumberEx](https://msdn.microsoft.com/library/windows/desktop/dd405487.aspx) | 不存在时,调用GetCurrentProcessorNumber。 | *[GetNumaNodeProcessorMask](https://msdn.microsoft.com/library/windows/desktop/ms683204.aspx) | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_PARAMETER。 | *[GetNumaNodeProcessorMaskEx](https://msdn.microsoft.com/library/windows/desktop/dd405493.aspx) | 不存在时,调用GetNumaNodeProcessorMask。 | *[SetThreadGroupAffinity](https://msdn.microsoft.com/library/windows/desktop/dd405516.aspx) | 不存在时,调用SetThreadAffinityMask。 | *[CancelIoEx](https://docs.microsoft.com/windows/desktop/FileIO/cancelioex-func) | 不存在时,调用CancelIo(会把此句柄的所有IO操作取消掉!)。 | *[QueryWorkingSetEx](https://docs.microsoft.com/windows/desktop/api/Psapi/nf-psapi-getwschangesex) | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 | [SHGetKnownFolderPath](https://docs.microsoft.com/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath) | 不存在时,调用SHGetFolderPathW。 | [SHSetKnownFolderPath](https://docs.microsoft.com/windows/win32/api/shlobj_core/nf-shlobj_core-shsetknownfolderpath) | 不存在时,调用SHSetFolderPathW。 | [SHGetKnownFolderIDList](https://docs.microsoft.com/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderidlist) | 不存在时,调用SHGetFolderLocation。 ## Changes ### 1.0.0.1 - 第一版(2018-05-17 19:00) * YY-Thunks第一版 ### 1.0.0.2 - 补充API支持(2018-06-01 18:30) * 添加RegSetKeyValueW(A) * 添加RegDeleteKeyValueW(A) * 添加RegDeleteTreeW(A) ### 1.0.0.3 - 让兼容Windows ARM64更轻松(2018-06-18 11:30) * 添加IsWow64Process2 * 添加IsWow64GuestMachineSupported * 添加GetTickCount64 * 添加GetSystemTimePreciseAsFileTime * 添加InitializeCriticalSectionEx * 添加InitOnceExecuteOnce * 添加GetCurrentProcessorNumber * 添加GetCurrentProcessorNumberEx * 添加GetNumaNodeProcessorMask * 添加GetNumaNodeProcessorMaskEx * 添加SetThreadGroupAffinity ### 1.0.0.4 - 兼容性更新(2018-09-08 18:00) * 解决Bug,将初始化时机推迟到`.CRT$XID`,避免VC2008下过早初始化导致atexit崩溃(感谢 死田鸡)。 ### 1.0.0.7 - 功能更新(2019-01-02 15:10) * 添加RegGetValueW(A) * 添加LocaleNameToLCID * 添加LCIDToLocaleName * 添加GetLocaleInfoEx * 添加GetDateFormatEx * 添加GetTimeFormatEx * 添加GetNumberFormatEx * 添加GetCurrencyFormatEx * 添加GetUserDefaultLocaleName * 添加GetSystemDefaultLocaleName * 重新编译,解决潜在符号修饰问题。 ### 1.0.1.1 - 功能更新(2019-04-01 17:00) * 添加EnumCalendarInfoExEx * 添加EnumDateFormatsExEx * 添加GetFileInformationByHandleEx * 添加SetFileInformationByHandle * 添加GetFinalPathNameByHandleW(A) * 解决Bug,1.0.0.10版意外引入ntdll.lib问题(感谢 小古)。 * 添加GetLogicalProcessorInformation * 添加GetLogicalProcessorInformationEx * 添加InetPtonW(inet_pton) * 添加InetNtopW(inet_ntop) * 添加GetNumaHighestNodeNumber ### 1.0.1.5 - 功能更新(2019-05-26 19:00) * 添加RaiseFailFastException(感谢 过客) * 添加GetThreadId(感谢 过客) * 添加GetProcessIdOfThread * 添加QueryThreadCycleTime(感谢 过客) * 添加QueryProcessCycleTime * 添加K32EnumProcessModules * 添加K32EnumProcessModulesEx * 添加K32GetModuleBaseNameW(A) * 添加K32GetModuleFileNameExW(A) * 添加K32EmptyWorkingSet * 添加K32QueryWorkingSet * 添加K32QueryWorkingSetEx * 添加K32InitializeProcessForWsWatch * 添加K32GetWsChanges * 添加K32GetWsChangesEx * 添加K32GetMappedFileNameW(A) * 添加K32EnumDeviceDrivers * 添加K32GetDeviceDriverBaseNameW(A) * 添加K32GetDeviceDriverFileNameW(A) * 添加K32GetPerformanceInfo * 添加K32EnumPageFilesW(A) * 添加K32GetProcessImageFileNameW(A) * 添加EnumProcessModulesEx * 添加GetWsChangesEx * 添加QueryFullProcessImageNameW(A) * 添加CreateFile2 * 添加CreateEventExW(A) * 添加CreateMutexExW(A) * 添加CreateSemaphoreExW * 添加CreateWaitableTimerExW * 添加GetFileVersionInfoExW(A) * 添加GetFileVersionInfoSizeExW(A) * 添加QueryFullProcessImageNameW(A) * 添加InterlockedCompareExchange64 * 添加GetProcessId * 添加SetThreadErrorMode * 添加GetThreadErrorMode * 添加GetErrorMode * 添加CancelIoEx ### 1.0.1.7 - 功能更新(2019-06-04 13:00) * 添加InitializeSRWLock * 添加AcquireSRWLockExclusive * 添加ReleaseSRWLockExclusive * 添加AcquireSRWLockShared * 添加ReleaseSRWLockShared * 添加TryAcquireSRWLockExclusive * 添加TryAcquireSRWLockShared ### 1.0.1.9 - 优化实现(2019-06-23 13:00) * 优化代码结构,减少不必要的全局对象引入。 * 内部函数采用__fastcall约定,减少栈操作。 * 增加YY-Thunks版本互斥。 * 改进与联想一键影音的兼容性,由于联想一键影音错会乱Hook,导致LoadLibraryExW行为异常。这样将导致YY-Thunks等在没有安装KB2533623的系统上无法正常使用问题。 * 改进Windows 7 RTM以及以下系统的兼容性,由于这些老版本系统由于在LoadLibraryExW期间不会恢复重定向,因此当目标线程关闭重定向时可能导致YY-Thunks无法正常工作。 * 添加QueryWorkingSetEx ### 1.0.1.17 - 优化实现 (2019-09-06 21:00) * 解决Bug,VS2010无法使用问题(感谢 柒零)。 * 改进 SRWLock 以及 One-Time Initialization调整为KeyedEvent实现。 * 添加WSAPoll * 添加InitializeConditionVariable * 添加SleepConditionVariableCS * 添加SleepConditionVariableSRW * 添加WakeConditionVariable * 添加WakeAllConditionVariable * 添加InitOnceInitialize * 添加InitOnceBeginInitialize * 添加InitOnceComplete * 添加InitializeSynchronizationBarrier * 添加EnterSynchronizationBarrier * 添加DeleteSynchronizationBarrier * 添加WaitOnAddress * 添加WakeByAddressSingle * 添加WakeByAddressAll * 添加SHGetKnownFolderPath * 添加SHSetKnownFolderPath * 添加SHGetKnownFolderIDList