Compare commits

..

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

6 changed files with 53 additions and 18 deletions

View File

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

View File

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

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

@ -0,0 +1,27 @@
/******************************************************************************/
/* 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);
}
int WINAPI XPCompatLib_GetLocaleInfoEx(LPCWSTR lpLocaleName, LCTYPE LCType, LPWSTR lpLCData, int cchData)
{
return GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LCType, lpLCData, cchData);
}
int WINAPI XPCompatLib_CompareStringEx(LPCWSTR lpLocaleName, DWORD dwCmpFlags, LPCWCH lpString1, int cchCount1, LPCWCH lpString2, int cchCount2, LPNLSVERSIONINFO lpVersionInformation, LPVOID lpReserved, LPARAM lParam)
{
return CompareStringW(LOCALE_SYSTEM_DEFAULT, dwCmpFlags, lpString1, cchCount1, lpString2, cchCount2);
}

View File

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

View File

@ -7,19 +7,19 @@
.data .data
__imp__CompareStringEx@36 dd ___acrt_CompareStringEx@36 __imp__CompareStringEx@36 dd _XPCompatLib_CompareStringEx@36
__imp__GetLocaleInfoEx@16 dd ___acrt_GetLocaleInfoEx@16 __imp__GetLocaleInfoEx@16 dd _XPCompatLib_GetLocaleInfoEx@16
__imp__InitializeCriticalSectionEx@12 dd ___acrt_InitializeCriticalSectionEx@12 __imp__InitializeCriticalSectionEx@12 dd _XPCompatLib_InitializeCriticalSectionEx@12
__imp__LCMapStringEx@36 dd ___acrt_LCMapStringEx@36 __imp__LCMapStringEx@36 dd _XPCompatLib_LCMapStringEx@36
externdef __imp__CompareStringEx@36 : DWORD externdef __imp__CompareStringEx@36 : DWORD
externdef __imp__GetLocaleInfoEx@16 : DWORD externdef __imp__GetLocaleInfoEx@16 : DWORD
externdef __imp__InitializeCriticalSectionEx@12 : DWORD externdef __imp__InitializeCriticalSectionEx@12 : DWORD
externdef __imp__LCMapStringEx@36 : DWORD externdef __imp__LCMapStringEx@36 : DWORD
extern ___acrt_CompareStringEx@36 : proc extern _XPCompatLib_CompareStringEx@36 : proc
extern ___acrt_GetLocaleInfoEx@16 : proc extern _XPCompatLib_GetLocaleInfoEx@16 : proc
extern ___acrt_InitializeCriticalSectionEx@12 : proc extern _XPCompatLib_InitializeCriticalSectionEx@12 : proc
extern ___acrt_LCMapStringEx@36 : proc extern _XPCompatLib_LCMapStringEx@36 : proc
end 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! 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 ### 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* * 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. CompatLib **only** removes the "problematic" dependencies induced by Microsoft's C/C++ Runtime.