The Free Pascal Compiler development team has discovered after 2.4.2 release that the Free Pascal Compiler does not support Windows 95 Operating System anymore.
The following patch allows to fix the 2.4.2 RTL sources in such a way as to be able to run applications compiled with that patched RTL on Windows 95 operating system.
--- systhrd.ori 2010-12-17 16:24:41.375768700 +0100 +++ systhrd.inc 2010-12-17 16:24:47.490979500 +0100 @@ -66,9 +66,6 @@ procedure WinDoneCriticalSection(var cs procedure WinEnterCriticalSection(var cs : TRTLCriticalSection); {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'EnterCriticalSection'; -function WinTryEnterCriticalSection(var cs : TRTLCriticalSection):longint; - {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'TryEnterCriticalSection'; - procedure WinLeaveCriticalSection(var cs : TRTLCriticalSection); {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'LeaveCriticalSection'; @@ -80,6 +77,15 @@ CONST WAIT_ABANDONED = $80; WAIT_FAILED = $ffffffff; +{$ifndef SUPPORT_WIN95} +function WinTryEnterCriticalSection(var cs : TRTLCriticalSection):longint; + {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'TryEnterCriticalSection'; +{$else SUPPORT_WIN95} +type + TTryEnterCriticalSection = function(var cs : TRTLCriticalSection):longint; stdcall; +var + WinTryEnterCriticalSection : TTryEnterCriticalSection; +{$endif SUPPORT_WIN95} {***************************************************************************** Threadvar support @@ -149,10 +155,10 @@ CONST var dataindex : pointer; errorsave : dword; - begin + begin {$ifdef dummy} { it least in the on windows 7 x64, this still doesn't not work, fs:(0x2c) is - self referencing on this system (FK) + self referencing on this system (FK) MVC: It also does not work on Windows Vista 32-bit, Home Premium, SP 1. Results in a crash} asm movl TLSKey,%edx @@ -352,6 +358,35 @@ begin WinEnterCriticalSection(PRTLCriticalSection(@cs)^); end; +{$ifdef SUPPORT_WIN95} +function Win95TryEnterCriticalSection(var cs : TRTLCriticalSection):longint;stdcall; +var + MyThreadID : DWORD; +begin + MyThreadId:=GetCurrentThreadId(); + if InterlockedIncrement(cs.LockCount)=0 then + begin + cs.OwningThread:=MyThreadId; + cs.RecursionCount:=1; + result:=1; + end + else + begin + if cs.OwningThread=MyThreadId then + begin + InterlockedDecrement(cs.LockCount); + InterlockedIncrement(cs.RecursionCount); + result:=1; + end + else + begin + InterlockedDecrement(cs.LockCount); + result:=0; + end; + end; +end; +{$endif SUPPORT_WIN95} + function SysTryEnterCriticalSection(var cs):longint; begin result:=WinTryEnterCriticalSection(PRTLCriticalSection(@cs)^); @@ -456,6 +491,10 @@ Var WinThreadManager : TThreadManager; Procedure InitSystemThreads; +{$IFDEF SUPPORT_WIN95} +var + KernelHandle : THandle; +{$ENDIF SUPPORT_WIN95} begin With WinThreadManager do begin @@ -497,5 +536,16 @@ begin ThreadID := GetCurrentThreadID; if IsLibrary then SysInitMultithreading; +{$IFDEF SUPPORT_WIN95} + { Try to find TryEnterCriticalSection function } + KernelHandle:=LoadLibrary(KernelDLL); + if KernelHandle<>0 then + begin + WinTryEnterCriticalSection:=TTryEnterCriticalSection(GetProcAddress(KernelHandle,'TryEnterCriticalSection')); + FreeLibrary(KernelHandle); + end; + if not assigned(WinTryEnterCriticalSection) then + WinTryEnterCriticalSection:=@Win95TryEnterCriticalSection; +{$ENDIF SUPPORT_WIN95} end;
You first need to install the sources of 2.4.2 RTL. After, just copy the content of the patch above to a file, named systhread.patch. Copy that file into the directory rtl/win, and apply the patch using:
patch -p 0 -i systhread.patchMove back to rtl directory level, and recompile the RTL, using make: with -dSUPPORT_WIN95 option:
make clean all OPT=-dSUPPORT_WIN95If you want to be able to compile applications that should run on Windows 95 operating system, you should probably install the new rtl over the existing one.
Pierre Muller, 2010-12-17