Compare commits

..

No commits in common. "master" and "1.0.1" have entirely different histories.

6 changed files with 35 additions and 22 deletions

View File

@ -20,6 +20,9 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
</MASM>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\compat.c" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>

View File

@ -22,4 +22,9 @@
<Filter>Source Files</Filter>
</MASM>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\compat.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

17
CompatLib/src/compat.c Normal file
View File

@ -0,0 +1,17 @@
/******************************************************************************/
/* CompatLib for Windows XP, by LoRd_MuldeR <MuldeR2@GMX.de> */
/* This work has been released under the CC0 1.0 Universal license! */
/******************************************************************************/
#define WIN32_LEAN_AND_MEAN 1
#include <Windows.h>
BOOL WINAPI XPCompatLib_InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags)
{
return InitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);
}
int WINAPI XPCompatLib_LCMapStringEx(LPCWSTR lpLocaleName, DWORD dwMapFlags, LPCWSTR lpSrcStr, int cchSrc, LPWSTR lpDestStr, int cchDest, LPNLSVERSIONINFO lpVersionInformation, LPVOID lpReserved, LPARAM sortHandle)
{
return LCMapStringW(LOCALE_SYSTEM_DEFAULT, dwMapFlags, lpSrcStr, cchSrc, lpDestStr, cchDest);
}

View File

@ -5,19 +5,13 @@
.data
__imp_CompareStringEx dq __acrt_CompareStringEx
__imp_GetLocaleInfoEx dq __acrt_GetLocaleInfoEx
__imp_InitializeCriticalSectionEx dq __acrt_InitializeCriticalSectionEx
__imp_LCMapStringEx dq __acrt_LCMapStringEx
__imp_InitializeCriticalSectionEx dq XPCompatLib_InitializeCriticalSectionEx
__imp_LCMapStringEx dq XPCompatLib_LCMapStringEx
externdef __imp_CompareStringEx : QWORD
externdef __imp_GetLocaleInfoEx : QWORD
externdef __imp_InitializeCriticalSectionEx : QWORD
externdef __imp_LCMapStringEx : QWORD
extern __acrt_CompareStringEx : proc
extern __acrt_GetLocaleInfoEx : proc
extern __acrt_InitializeCriticalSectionEx : proc
extern __acrt_LCMapStringEx : proc
extern XPCompatLib_InitializeCriticalSectionEx : proc
extern XPCompatLib_LCMapStringEx : proc
end

View File

@ -7,19 +7,13 @@
.data
__imp__CompareStringEx@36 dd ___acrt_CompareStringEx@36
__imp__GetLocaleInfoEx@16 dd ___acrt_GetLocaleInfoEx@16
__imp__InitializeCriticalSectionEx@12 dd ___acrt_InitializeCriticalSectionEx@12
__imp__LCMapStringEx@36 dd ___acrt_LCMapStringEx@36
__imp__InitializeCriticalSectionEx@12 dd _XPCompatLib_InitializeCriticalSectionEx@12
__imp__LCMapStringEx@36 dd _XPCompatLib_LCMapStringEx@36
externdef __imp__CompareStringEx@36 : DWORD
externdef __imp__GetLocaleInfoEx@16 : DWORD
externdef __imp__InitializeCriticalSectionEx@12 : DWORD
externdef __imp__LCMapStringEx@36 : DWORD
extern ___acrt_CompareStringEx@36 : proc
extern ___acrt_GetLocaleInfoEx@16 : proc
extern ___acrt_InitializeCriticalSectionEx@12 : proc
extern ___acrt_LCMapStringEx@36 : proc
extern _XPCompatLib_InitializeCriticalSectionEx@12 : proc
extern _XPCompatLib_LCMapStringEx@36 : proc
end

View File

@ -5,7 +5,7 @@ CompatLib &ndash; compatibility library for re-establishing Windows XP (SP-3) su
C/C++ executables built with VS2019 (Toolset v142) or VS2022 (Toolset v143) do **not** normally run on Windows XP. That is because the executables created by VS2019 (Toolset v142) or VS2022 (Toolset v143) depend on certain functions in the `KERNEL32.DLL` system library that simply did **not** exist in Windows XP yet. Consequently, on the Windows XP system, those executable fail to start with an error message about the missing entry point!
CompatLib provides a workaround for the problem, by eliminating the "problematic" `KERNEL32.DLL` dependencies from the executable, so that the executable will again be able to run on Windows XP. This is achieved by substituting the call to the original (missing) function in `KERNEL32.DLL` with a small "shim" function. The "shim" function is linked directly into the executable file; it tries to emulate the call, by forwarding the call to an adequate function in `KERNEL32.DLL` that *does* exist on Windows XP. Dependencies that must be substituted by CompatLib include `InitializeCriticalSectionEx()`, `LCMapStringEx()`, `CompareStringEx()` and `GetLocaleInfoEx()`.
CompatLib provides a workaround for the problem, by eliminating the "problematic" `KERNEL32.DLL` dependencies from the executable, so that the executable will again be able to run on Windows XP. This is achieved by substituting the call to the original (missing) function in `KERNEL32.DLL` with a small "shim" function. The "shim" function is linked directly into the executable file. Also, the "shim" function tries to emulate the call, by forwarding the call to an adequate function in `KERNEL32.DLL` that *does* exist on Windows XP. There currently are *two* such function dependencies that must be substituted by CompatLib &ndash; `InitializeCriticalSectionEx()` and `LCMapStringEx()`.
### Remarks
@ -14,7 +14,7 @@ CompatLib provides a workaround for the problem, by eliminating the "problematic
* Running x64 (64-Bit) executables is possible, but requires the *Windows XP Professional x64 Edition*
* If your *application code* uses other Win32 API functions unavailable in Windows XP, then CompatLib will **not** help!
* If your *application code* uses Win32 API functions unavailable in Windows XP, then CompatLib will **not** help!
CompatLib **only** removes the "problematic" dependencies induced by Microsoft's C/C++ Runtime.