Remove same version check in MSVCRT.DLL \ MSVCIRT.DLL (Visual C++ Runtime Libraries) during start-up of Windows XP/2003
msvcirt-version-unlock
Purpose/History
When Windows boots, it compares the (kernel) version of Windows, typically NT 5.2, running with the version of MSVCRT.DLL \ MSVCIRT.DLL , the (main) Visual C++ Runtime (function) Library. If it doesn't match, it shuts download Windows immedialy or will show this BSOD:
STOP: c000021a {Fatal System Error}
The Windows Logon Process system process terminated unexpectedly with a status of 0x00000080 (0x00000000) 0x00000000).
The system has been shut down
The comments in the header of the file we will update clearly state this happens, but doesn't say that it causes a BSOD.
Add test to preclude msvcrt.dll loading on anything other than the OS it ships with.
It is necessary to apply this when changing the Windows versions values in \public\sdk\inc\ntverp.h
and not booting the same (kernel) Windows NT version as the version that MSVCRT.DLL \ MSVCIRT.DLL is reporting
Relevant information here: https://blog.enrii.com/2008/07/06/troubleshooting-window-xp-c000021a-error-blue-screen/
Requirements
A x86 version of Windows 2003 / XP SP1 with source code available: see https://rentry.co/build-win2k3
Changes
- In
\base\crts\crtw32\dllstuff\crtlib.c
look for the _CRTDLL_INIT
function, below This routine does the C runtime initialization.:
| BOOL WINAPI _CRTDLL_INIT(
HANDLE hDllHandle,
DWORD dwReason,
LPVOID lpreserved
)
{
if ( dwReason == DLL_PROCESS_ATTACH ) {
OSVERSIONINFOA *posvi;
#if defined(_SYSCRT)
// The app may have set Win32VersionValue in the PE header to change
// GetVersionEx. Ask NTDLL for the real version and bail if we don't match.
DWORD NtMajorVersion;
DWORD NtMinorVersion;
#ifdef _WIN64
NTVERSION_INFO_FCN GetNtVersionInfo = (NTVERSION_INFO_FCN) GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetNtVersionNumbers");
if (!GetNtVersionInfo)
GetNtVersionInfo = (NTVERSION_INFO_FCN) GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetNtVersionInfo");
if (!GetNtVersionInfo)
return FALSE;
GetNtVersionInfo(&NtMajorVersion, &NtMinorVersion, NULL);
#else
void __declspec(dllimport) __stdcall RtlGetNtVersionNumbers(PDWORD, PDWORD, PDWORD);
RtlGetNtVersionNumbers(&NtMajorVersion, &NtMinorVersion, NULL);
#endif
if ((NtMajorVersion != VER_PRODUCTMAJORVERSION) || (NtMinorVersion != VER_PRODUCTMINORVERSION))
return FALSE;
#endif
}
⋮
|
- and comment the beginning of the function body out, like so:
| BOOL WINAPI _CRTDLL_INIT(
HANDLE hDllHandle,
DWORD dwReason,
LPVOID lpreserved
)
{
if ( dwReason == DLL_PROCESS_ATTACH ) {
OSVERSIONINFOA *posvi;
#if defined(_SYSCRT)
/* // The app may have set Win32VersionValue in the PE header to change
// GetVersionEx. Ask NTDLL for the real version and bail if we don't match.
DWORD NtMajorVersion;
DWORD NtMinorVersion;
#ifdef _WIN64
NTVERSION_INFO_FCN GetNtVersionInfo = (NTVERSION_INFO_FCN) GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetNtVersionNumbers");
if (!GetNtVersionInfo)
GetNtVersionInfo = (NTVERSION_INFO_FCN) GetProcAddress(GetModuleHandle("ntdll.dll"), "RtlGetNtVersionInfo");
if (!GetNtVersionInfo)
return FALSE;
GetNtVersionInfo(&NtMajorVersion, &NtMinorVersion, NULL);
#else
void __declspec(dllimport) __stdcall RtlGetNtVersionNumbers(PDWORD, PDWORD, PDWORD);
RtlGetNtVersionNumbers(&NtMajorVersion, &NtMinorVersion, NULL);
#endif
if ((NtMajorVersion != VER_PRODUCTMAJORVERSION) || (NtMinorVersion != VER_PRODUCTMINORVERSION))
return FALSE;*/
#endif
}
⋮
|
- Run
bcz
in \base\crts
- Overwrite the created
\base\crts\crtw32\iostream\dll\obj\i386\MSVCIRT.DLL
in the C:\WINDOWS\SYSTEM32
folder of your Windows XP installation