代码拉取完成,页面将自动刷新
同步操作将从 初雨团队/YY-Thunks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
总众所周知Windows XP每个SP都会新增大量API,而Windows 10每次更新又会新增大量API,这使得兼容不同版本的Windows需要大量的判断。
甚至大量开源代码已经不再兼容一些早期的Windows XP版本,比如 Windows XP RTM。难道就没有一种快速高效的方案解决无法定位程序输入点的问题吗?
YY-Thunks(鸭船),存在的目的就是抹平不同系统的差异,编译时单纯添加一个obj即可自动解决这些兼容性问题。让你兼容Windows更轻松!
[ 鸭船交流群 633710173 ]
使用LoadLibrary
以及GetProcAddress
动态加载API,不存在时做出补偿措施,最大限度模拟原始API行为,让你的程序正常运行。
鸭船
内建2级缓存以及按需加载机制,同时自动加密所有函数指针,防止内存爆破攻击。最大程度减少不需要的、不必要的LoadLibrary以及GetProcAddress
调用以及潜在安全风险。鸭船
添砖加瓦。objs\$(PlatformShortName)\YY_Thunks_for_WinXP.obj
。全平台ABI兼容。
/MD
、/MT
、/MDd
、/MTd
)。此表展示了YY-Thunks(鸭船)可以解决的函数不存在问题,欢迎大家扩充!
开头带
*
的函数并不建议使用,仅用于编译通过处理,如果使用可能导致老版本系统无法充分发挥性能。
函数 | Fallback |
---|---|
DecodePointer | 不存在时,返回指针本身。 |
EncodePointer | 不存在时,返回指针本身。 |
RegDeleteKeyExW(A) | 不存在时,调用RegDeleteKeyW(A)。 |
Wow64DisableWow64FsRedirection | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 |
Wow64RevertWow64FsRedirection | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 |
Wow64EnableWow64FsRedirection | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 |
IsWow64Process | 不存在时,返回TRUE,并设置 *Wow64Process = FALSE 。 |
IsWow64Message | 不存在时,返回FALSE。 |
RegSetKeyValueW(A) | 调用RegCreateKeyExW(A)以及RegSetValueExW(A)。 |
RegDeleteKeyValueW(A) | 调用RegOpenKeyExW(A)以及RegDeleteValueW(A)。 |
RegDeleteTreeW(A) | 调用SHDeleteKeyW(A)。 |
RegGetValueW(A) | 不存在时,调用RegQueryValueExW(A)。 |
IsWow64Process2 | 不存在时,调用IsWow64Process。 |
IsWow64GuestMachineSupported | 不存在时,调用GetNativeSystemInfo。 |
GetTickCount64 | 不存在时,调用GetTickCount。 |
GetSystemTimePreciseAsFileTime | 不存在时,调用GetSystemTimeAsFileTime。 |
InitializeCriticalSectionEx | 不存在时,调用InitializeCriticalSectionAndSpinCount。 |
InitOnceInitialize | 初始化为 INIT_ONCE_STATIC_INIT。 |
InitOnceBeginInitialize | 不存在时,调用NtWaitForKeyedEvent。 |
InitOnceComplete | 不存在时,调用NtReleaseKeyedEvent。 |
InitOnceExecuteOnce | 不存在时,调用NtWaitForKeyedEvent以及NtReleaseKeyedEvent。 |
LocaleNameToLCID | 不存在时,查LocaleNameToLcidTable。 |
LCIDToLocaleName | 不存在时,查LcidToLocaleNameTable。 |
GetLocaleInfoEx | 不存在时,调用GetLocaleInfoW。 |
GetDateFormatEx | 不存在时,调用GetDateFormatW。 |
GetTimeFormatEx | 不存在时,调用GetTimeFormatW。 |
GetNumberFormatEx | 不存在时,调用GetNumberFormatW。 |
GetCurrencyFormatEx | 不存在时,调用GetCurrencyFormatW。 |
GetUserDefaultLocaleName | 不存在时,调用LCIDToLocaleName。 |
GetSystemDefaultLocaleName | 不存在时,调用LCIDToLocaleName。 |
EnumCalendarInfoExEx | 不存在时,调用EnumCalendarInfoExW。 |
EnumDateFormatsExEx | 不存在时,调用EnumDateFormatsExW。 |
GetFileInformationByHandleEx | 不存在时,调用NtQueryInformationFile 或者 NtQueryDirectoryFile。 |
SetFileInformationByHandle | 不存在时,调用NtSetInformationFile。 |
GetFinalPathNameByHandleW(A) | 不存在时,调用NtQueryObject以及NtQueryInformationFile。 |
GetLogicalProcessorInformation | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 |
GetLogicalProcessorInformationEx | 不存在时,调用GetLogicalProcessorInformation。 |
InetPtonW(inet_pton) | 不存在时,类似于sscanf手工分析字符串。 |
InetNtopW(inet_ntop) | 不存在时,类似于sprintf手工生成字符串。 |
WSAPoll | 不存在时,调用select。 |
GetNumaHighestNodeNumber | 不存在时,返回0。 |
RaiseFailFastException | 不存在时,调用TerminateProcess。 |
GetThreadId | 不存在时,调用NtQueryInformationThread。 |
GetProcessIdOfThread | 不存在时,调用NtQueryInformationThread。 |
GetProcessId | 不存在时,调用NtQueryInformationProcess。 |
QueryThreadCycleTime | 不存在时,调用GetThreadTimes。 |
QueryProcessCycleTime | 不存在时,调用GetProcessTimes。 |
K32EnumProcessModules | 调用EnumProcessModules。 |
K32EnumProcessModulesEx | 调用EnumProcessModulesEx。 |
K32GetModuleBaseNameW(A) | 调用GetModuleBaseNameW(A)。 |
K32GetModuleFileNameExW(A) | 调用K32GetModuleFileNameExW(A)。 |
K32EmptyWorkingSet | 调用EmptyWorkingSet。 |
K32QueryWorkingSet | 调用QueryWorkingSet。 |
K32QueryWorkingSetEx | 调用QueryWorkingSetEx。 |
K32InitializeProcessForWsWatch | 调用InitializeProcessForWsWatch。 |
K32GetWsChanges | 调用GetWsChanges。 |
K32GetWsChangesEx | 调用GetWsChangesEx。 |
K32GetMappedFileNameW(A) | 调用GetMappedFileNameW(A)。 |
K32EnumDeviceDrivers | 调用EnumDeviceDrivers。 |
K32GetDeviceDriverBaseNameW(A) | 调用GetDeviceDriverBaseNameW(A)。 |
K32GetDeviceDriverFileNameW(A) | 调用GetDeviceDriverFileNameW(A)。 |
K32GetPerformanceInfo | 调用GetPerformanceInfo。 |
K32EnumPageFilesW(A) | 调用EnumPageFilesW(A)。 |
K32GetProcessImageFileNameW(A) | 调用GetProcessImageFileNameW(A)。 |
EnumProcessModulesEx | 不存在时,调用EnumProcessModules。 |
GetWsChangesEx | 不存在时,调用GetWsChanges。 |
QueryFullProcessImageNameW(A) | 不存在时,调用GetProcessImageFileNameW(A) 或者 GetModuleFileNameExW(A)。 |
CreateFile2 | 不存在时,调用CreateFileW。 |
CreateEventExW(A) | 不存在时,调用CreateEventW(A)。 |
CreateMutexExW(A) | 不存在时,调用CreateMutexW(A)。 |
CreateSemaphoreExW | 不存在时,调用CreateSemaphoreW。 |
CreateWaitableTimerExW | 不存在时,调用CreateWaitableTimerW。 |
GetFileVersionInfoExW(A) | 不存在时,调用GetFileVersionInfoW(A)。 |
GetFileVersionInfoSizeExW(A) | 不存在时,调用GetFileVersionInfoSizeW(A)。 |
InterlockedCompareExchange64 | 调用内部函数_InterlockedCompareExchange64。 |
SetThreadErrorMode | 不存在时,调用SetErrorMode。 |
GetThreadErrorMode | 不存在时,调用GetErrorMode。 |
GetErrorMode | 不存在时,调用NtQueryInformationProcess。 |
InitializeSRWLock | 初始化为 RTL_SRWLOCK_INIT。 |
AcquireSRWLockExclusive | 不存在时,调用NtWaitForKeyedEvent。 |
TryAcquireSRWLockExclusive | 不存在时,调用InterlockedBitTestAndSet(64)。 |
ReleaseSRWLockExclusive | 不存在时,调用NtReleaseKeyedEvent。 |
AcquireSRWLockShared | 不存在时,调用NtWaitForKeyedEvent。 |
TryAcquireSRWLockShared | 不存在时,调用InterlockedCompareExchange。 |
ReleaseSRWLockShared | 不存在时,调用NtReleaseKeyedEvent。 |
InitializeConditionVariable | 初始化为 CONDITION_VARIABLE_INIT。 |
SleepConditionVariableCS | 不存在时,调用NtWaitForKeyedEvent。 |
SleepConditionVariableSRW | 不存在时,调用NtWaitForKeyedEvent。 |
WakeConditionVariable | 不存在时,调用NtReleaseKeyedEvent。 |
WakeAllConditionVariable | 不存在时,调用NtReleaseKeyedEvent。 |
InitializeSynchronizationBarrier | 不存在时,调用CreateEvent。 |
EnterSynchronizationBarrier | 不存在时,调用WaitForSingleObject。 |
DeleteSynchronizationBarrier | 不存在时,调用CloseHandle。 |
WaitOnAddress | 不存在时,调用NtWaitForKeyedEvent。警告,此函数请勿跨模块使用!!! |
WakeByAddressSingle | 不存在时,调用NtReleaseKeyedEvent。警告,此函数请勿跨模块使用!!! |
WakeByAddressAll | 不存在时,调用NtReleaseKeyedEvent。警告,此函数请勿跨模块使用!!! |
*GetCurrentProcessorNumber | 不存在时,返回0。 |
*GetCurrentProcessorNumberEx | 不存在时,调用GetCurrentProcessorNumber。 |
*GetNumaNodeProcessorMask | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_PARAMETER。 |
*GetNumaNodeProcessorMaskEx | 不存在时,调用GetNumaNodeProcessorMask。 |
*SetThreadGroupAffinity | 不存在时,调用SetThreadAffinityMask。 |
*CancelIoEx | 不存在时,调用CancelIo(会把此句柄的所有IO操作取消掉!)。 |
*QueryWorkingSetEx | 不存在时,返回FALSE,并设置 LastError = ERROR_INVALID_FUNCTION。 |
SHGetKnownFolderPath | 不存在时,调用SHGetFolderPathW。 |
SHSetKnownFolderPath | 不存在时,调用SHSetFolderPathW。 |
SHGetKnownFolderIDList | 不存在时,调用SHGetFolderLocation。 |
.CRT$XID
,避免VC2008下过早初始化导致atexit崩溃(感谢 死田鸡)。此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。