Browse Source

* additional API functions available in higher OS/2 versions

git-svn-id: trunk@28994 -
Tomas Hajny 10 years ago
parent
commit
6a83f32486
1 changed files with 375 additions and 73 deletions
  1. 375 73
      rtl/os2/doscall2.pas

+ 375 - 73
rtl/os2/doscall2.pas

@@ -2,12 +2,17 @@
     This file is part of the Free Pascal run time library.
     This file is part of the Free Pascal run time library.
     Copyright (c) 2014 by the Free Pascal development team.
     Copyright (c) 2014 by the Free Pascal development team.
 
 
-    Additional OS/2 API functions for file handling (64-bit functions
-    available in WSeB/MCP/eCS and protected access to exclusively
-    locked files available in OS/2 2.1+) implemented in DOSCALL1.DLL.
+    Additional OS/2 API functions implemented in DOSCALL1.DLL:
+    - File handling (64-bit functions available in WSeB/MCP/eCS and
+      protected access to file handles as available in OS/2 2.1+)
+    - Certain SMP related functions for querying and setting status
+      of processors and thread and system affinity (available
+      in SMP-ready versions of OS/2 kernels)
+    - Support for working with extended LIBPATH (available in
+      OS/2 Warp 4.0 and higher).
     Availability of individual functions is checked dynamically during
     Availability of individual functions is checked dynamically during
     initialization and fake (simulated) functions are used if running
     initialization and fake (simulated) functions are used if running
-    under a lower OS/2 version.
+    under an OS/2 version not providing the respective functionality.
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
     for details about the copyright.
@@ -27,6 +32,19 @@ interface
 uses
 uses
   DosCalls, Strings;
   DosCalls, Strings;
 
 
+const
+(* Status in DosGet/SetProcessorStatus *)
+  PROC_OFFLINE = 0; (* Processor is offline *)
+  PROC_ONLINE = 1;  (* Processor is online *)
+(* Scope in DosQueryThreadAffinity *)
+  AFNTY_THREAD = 0; (* Return the current threads processor affinity mask. *)
+  AFNTY_SYSTEM = 1; (* Return the system's current capable processor affinity
+                       mask. *)
+(* Flags in DosQuery/SetExtLibPath *)
+  BEGIN_LIBPATH = 1; (* The new path is searched before the LIBPATH. *)
+  END_LIBPATH = 2;   (* The new path is searched after the LIBPATH. *)
+
+
 type
 type
   TFileLockL = record
   TFileLockL = record
    case boolean of
    case boolean of
@@ -40,6 +58,12 @@ type
   end;
   end;
   PFileLockL = ^TFileLockL;
   PFileLockL = ^TFileLockL;
 
 
+  TMPAffinity = record
+   Mask: array [0..1] of cardinal;
+  end;
+  PMPAffinity = ^TMPAffinity;
+
+
 function DosOpenL (FileName: PChar; var Handle: THandle;
 function DosOpenL (FileName: PChar; var Handle: THandle;
                         var Action: cardinal; InitSize: int64;
                         var Action: cardinal; InitSize: int64;
                         Attrib, OpenFlags, FileMode: cardinal;
                         Attrib, OpenFlags, FileMode: cardinal;
@@ -168,16 +192,11 @@ function DosCancelLockRequestL (Handle: THandle;
 DosProtectSetFileLocksL locks and unlocks a range of an open file. 
 DosProtectSetFileLocksL locks and unlocks a range of an open file. 
 
 
 Parameters:
 Parameters:
-
  Handle = file handle
  Handle = file handle
-
  Unlock = record containing the offset and length of a range to be unlocked
  Unlock = record containing the offset and length of a range to be unlocked
-
  Lock = record containing the offset and length of a range to be locked 
  Lock = record containing the offset and length of a range to be locked 
-
  Timeout = the maximum time that the process is to wait for the requested locks
  Timeout = the maximum time that the process is to wait for the requested locks
            (in milliseconds)
            (in milliseconds)
-
  Flags = bit mask specifying action to be taken.
  Flags = bit mask specifying action to be taken.
      Bits 31..2 are reserved.
      Bits 31..2 are reserved.
      Bit 1 (Atomic) means request for atomic locking - if the bit is set
      Bit 1 (Atomic) means request for atomic locking - if the bit is set
@@ -706,30 +725,24 @@ DosProtectSetFilePtrL moves the read or write pointer according to the type
 of move specified.
 of move specified.
 
 
 Parameters:
 Parameters:
-
  Handle = the handle returned by a previous DosOpenL function.
  Handle = the handle returned by a previous DosOpenL function.
-
  Pos = The signed distance (offset) to move, in bytes.
  Pos = The signed distance (offset) to move, in bytes.
-
  Method = The method of moving - location in the file at which the read/write
  Method = The method of moving - location in the file at which the read/write
           pointer starts before adding the Pos offset. The values and their
           pointer starts before adding the Pos offset. The values and their
           meanings are as shown in the following list:
           meanings are as shown in the following list:
-
     0 FILE_BEGIN - move the pointer from the beginning of the file. 
     0 FILE_BEGIN - move the pointer from the beginning of the file. 
     1 FILE_CURRENT - move the pointer from the current location of the
     1 FILE_CURRENT - move the pointer from the current location of the
                      read/write pointer.
                      read/write pointer.
     2 FILE_END - move the pointer from the end of the file; use this method
     2 FILE_END - move the pointer from the end of the file; use this method
                  to determine a file's size.
                  to determine a file's size.
-
  PosActual = address of the new pointer location.
  PosActual = address of the new pointer location.
-
  FileHandleLockID = The filehandle lockid returned by a previous
  FileHandleLockID = The filehandle lockid returned by a previous
                     DosProtectOpenL. 
                     DosProtectOpenL. 
 
 
 Possible return codes:
 Possible return codes:
-0 NO_ERROR
-1 ERROR_INVALID_FUNCTION
-6 ERROR_INVALID_HANDLE
+  0 NO_ERROR
+  1 ERROR_INVALID_FUNCTION
+  6 ERROR_INVALID_HANDLE
 132 ERROR_SEEK_ON_DEVICE
 132 ERROR_SEEK_ON_DEVICE
 131 ERROR_NEGATIVE_SEEK
 131 ERROR_NEGATIVE_SEEK
 130 ERROR_DIRECT_ACCESS_HANDLE
 130 ERROR_DIRECT_ACCESS_HANDLE
@@ -750,20 +763,17 @@ function DosProtectSetFilePtrL (Handle: THandle; Pos: int64;
 DosProtectSetFileSizeL changes the size of a file.
 DosProtectSetFileSizeL changes the size of a file.
 
 
 Parameters:
 Parameters:
-
  Handle = handle of the file whose size to be changed.
  Handle = handle of the file whose size to be changed.
-
  Size = new size, in bytes, of the file.
  Size = new size, in bytes, of the file.
-
  FileHandleLockID = the filehandle lockid obtained from DosProtectOpenL.
  FileHandleLockID = the filehandle lockid obtained from DosProtectOpenL.
 
 
 Possible return codes:
 Possible return codes:
-0 NO_ERROR
-5 ERROR_ACCESS_DENIED
-6 ERROR_INVALID_HANDLE
-26 ERROR_NOT_DOS_DISK
-33 ERROR_LOCK_VIOLATION
-87 ERROR_INVALID_PARAMETER
+  0 NO_ERROR
+  5 ERROR_ACCESS_DENIED
+  6 ERROR_INVALID_HANDLE
+ 26 ERROR_NOT_DOS_DISK
+ 33 ERROR_LOCK_VIOLATION
+ 87 ERROR_INVALID_PARAMETER
 112 ERROR_DISK_FULL
 112 ERROR_DISK_FULL
 
 
 Remarks:
 Remarks:
@@ -779,6 +789,159 @@ bytes are undefined.
 function DosProtectSetFileSizeL (Handle: THandle; Size: int64;
 function DosProtectSetFileSizeL (Handle: THandle; Size: int64;
                                   FileHandleLockID: cardinal): cardinal; cdecl;
                                   FileHandleLockID: cardinal): cardinal; cdecl;
 
 
+(*
+DosGetProcessorStatus allows checking status of individual processors
+in a SMP machine.
+
+Parameters:
+ProcID = Procesor ID numbered 1 through n, where there are n processors in
+         total.
+Status = Returned processor status defined as follows:
+  PROC_OFFLINE 0x00000000 Processor is offline 
+  PROC_ONLINE 0x00000001 Processor is online 
+
+Possible return codes:
+ 0 NO_ERROR
+87 ERROR_INVALID_PARAMETER
+*)
+function DosGetProcessorStatus (ProcID: cardinal;
+                                        var Status: cardinal): cardinal; cdecl;
+
+
+(*
+DosSetProcessorStatus sets the ONLINE or OFFLINE status of a processor on
+an SMP system. The processor status may be queried using DosGetProcessorStatus.
+ONLINE status implies the processor is available for running work. OFFLINE
+status implies the processor is not available for running work. The processor
+that executes DosSetProcessorStatus must be ONLINE.
+
+Parameters:
+ProcID = Processor ID numbered from 1 through n, where there are n processors
+         in total.
+Status = Requested processor status defined as follows:
+  PROC_OFFLINE 0x00000000 Processor is offline. 
+  PROC_ONLINE 0x00000001 Processor is online. 
+
+Possible return codes:
+ 0 NO_ERROR 
+87 ERROR_INVALID_PARAMETER
+*)
+function DosSetProcessorStatus (ProcID: cardinal;
+                                            Status: cardinal): cardinal; cdecl;
+
+(*
+DosQueryThreadAffinity allows a thread to inquire for the current thread's
+processor affinity mask and the system's capable processor affinity mask.
+
+Parameters:
+Scope = Scope of the query defined by one of the following values:
+  AFNTY_THREAD Return the current threads processor affinity mask. 
+  AFNTY_SYSTEM Return the system's current capable processor affinity mask. 
+AffinityMask = Affinity mask is returned here; processors 0..31 are in Mask [0]
+               and processors 32..63 are in Mask [1].
+
+Possible return codes:
+13 ERROR_INVALID_DATA 
+87 ERROR_INVALID_PARAMETER
+*)
+function DosQueryThreadAffinity (Scope: cardinal;
+                               var AffinityMask: TMPAffinity): cardinal; cdecl;
+
+(*
+DosQueryExtLibPath returns the current path to be searched before or after the
+system LIBPATH when locating DLLs.
+
+Parameters:
+ExtLIBPATH = Buffer for receiving the extended LIBPATH string.
+
+???
+If the buffer pointed to by this parameter is not large enough to hold
+the extended LIBPATH or an extended LIBPATH is not currently defined, this
+parameter returns a pointer to a NULL string.
+??? How is it detected if the size is not passed???
+
+Flags - flag indicating when the new path is searched - possible values:
+  BEGIN_LIBPATH - The new path is searched before the LIBPATH.
+  END_LIBPATH - The new path is searched after the LIBPATH.
+
+Possible return codes:
+  0 NO_ERROR 
+ 87 ERROR_INVALID_PARAMETER 
+122 ERROR_INSUFFICIENT_BUFER
+*)
+function DosQueryExtLibPath (ExtLibPath: PChar; Flags: cardinal): cardinal;
+                                                                         cdecl;
+
+(*
+DosSetExtLibPath defines the current path to be searched before or after the
+system LIBPATH when locating DLLs.
+
+Parameters:
+ExtLIBPATH = New extended LIBPATH string. Maximum size is 1024 bytes.
+             A pointer to a NULL string removes the extended LIBPATH.
+Flags = When the new path is searched - possible values:
+  BEGIN_LIBPATH (1) - the new path is searched before the LIBPATH.
+  END_LIBPATH (2) - the new path is searched after the LIBPATH.
+
+The LIBPATH string is an environment variable found in the CONFIG.SYS file
+consisting of a set of paths. If a fully-qualified path is not specified when
+a module is loaded, the system searches these paths to find the DLL.
+
+There are two extended LIBPATH strings, BeginLIBPATH and EndLIBPATH.
+BeginLIBPATH is searched before the system LIBPATH, and EndLIBPATH is searched
+after both BeginLIBPATH and the system LIBPATH. These extended LIBPATHs can be
+set either from the command line using the "SET" command, or by calling
+DosSetExtLIBPATH. When DosSetExtLIBPATH is called, all modifications become
+specific to that process. Initial settings can be set for all processes in the
+system by setting the values in CONFIG.SYS using the "set" command.
+
+Note: The extended LIBPATHs are not true environment variables, and do not
+appear when querying the environment.
+
+Every process inherits the settings of BeginLIBPATH and EndLIBPATH from the
+process that starts it. If the extended library paths are initialized in
+CONFIG.SYS, those extended library paths become the initial settings for new
+processes. If a process changes BeginLIBPATH or EndLIBPATH and starts a new
+process, the new child process inherits the changed contents. Child processes
+that inherit their parent's extended LIBPATHs maintain their own copy.
+Modifications made by the parent after the child has been created have no
+effect on the children.
+
+This function permits the use of two symbols within the path string:
+%BeginLIBPATH% and %EndLIBPATH%. These symbols are replaced with the current
+string settings for the extended library paths.
+
+The LIBPATHs strings are only searched when the specified DLL is not currently
+loaded. The only way to guarantee that the DLL being used is the correct
+version is to set the fully-qualified path in DosLoadModule. When a request is
+made to load a module and a path is not specified, the system searches the
+paths in the LIBPATH string and uses the first instance of the specified DLL it
+finds. If the new paths are added to the search strings, the system does not
+check those directories to see if a different version exists. Consequently, if
+two processes started from different directories use the same DLL, but
+different versions of that DLL exist in both directories, the version of the
+DLL loaded by the first process is the one used by both processes. The only way
+to prevent this from occurring is to specify the path to the DLL when
+DosLoadModule is called.
+
+Consequently, if one process sets its BeginLIBPATH to C:\PROCESS1\DLL and loads
+the DLL MYAPP.DLL from that directory, and then a second process sets its
+BeginLIBPATH to C:\PROCESS2\DLL and there is for a different version of
+MYAPP.DLL in C:\PROCESS2\DLL, the second process will link to the DLL from
+C:\PROCESS1\DLL since it was already loaded.
+
+Both BeginLIBPATH and EndLIBPATH can be set from the command line using the SET
+command.
+
+Possible return codes:
+0 NO_ERROR 
+8 ERROR_NOT_ENOUGH_MEMORY 
+87 ERROR_INVALID_PARAMETER 
+161 ERROR_BAD_PATHNAME 
+*)
+function DosSetExtLibPath (ExtLibPath: PChar; Flags: cardinal): cardinal;
+                                                                         cdecl;
+
 
 
 
 
 {***************************************************************************}
 {***************************************************************************}
@@ -994,6 +1157,59 @@ begin
 end;
 end;
 
 
 
 
+function DummyDosGetProcessorStatus (ProcID: cardinal;
+                                        var Status: cardinal): cardinal; cdecl;
+begin
+  if ProcID = 1 then
+   begin
+    Status := 1;
+    DummyDosGetProcessorStatus := No_Error;
+   end
+  else
+   DummyDosGetProcessorStatus := Error_Invalid_Parameter;
+end;
+
+
+function DummyDosSetProcessorStatus (ProcID: cardinal;
+                                            Status: cardinal): cardinal; cdecl;
+begin
+  DummyDosSetProcessorStatus := Error_Invalid_Parameter;
+end;
+
+
+function DummyDosQueryThreadAffinity (Scope: cardinal;
+                               var AffinityMask: TMPAffinity): cardinal; cdecl;
+begin
+  DummyDosQueryThreadAffinity := Error_Invalid_Function;
+end;
+
+
+function DummyDosSetThreadAffinity (PAffinityMask: PMPAffinity): cardinal; cdecl;
+begin
+  DummyDosSetThreadAffinity := Error_Invalid_Function;
+end;
+
+
+function DummyDosQueryExtLibPath (ExtLibPath: PChar;
+                                             Flags: cardinal): cardinal; cdecl;
+begin
+  if ExtLibPath <> nil then
+   begin
+    ExtLibPath := #0;
+    DummyDosQueryExtLibPath := No_Error;
+   end
+  else
+   DummyDosQueryExtLibPath := Error_Invalid_Parameter;
+end;
+
+
+function DummyDosSetExtLibPath (ExtLibPath: PChar; Flags: cardinal): cardinal;
+                                                                 cdecl; inline;
+begin
+  DummyDosSetExtLibPath := Error_Not_Enough_Memory;
+end;
+
+
 
 
 type
 type
   TDosProtectOpen = function (FileName: PChar; var Handle: THandle;
   TDosProtectOpen = function (FileName: PChar; var Handle: THandle;
@@ -1064,6 +1280,25 @@ type
   TDosProtectSetFileSizeL = function (Handle: THandle; Size: int64;
   TDosProtectSetFileSizeL = function (Handle: THandle; Size: int64;
                                   FileHandleLockID: cardinal): cardinal; cdecl;
                                   FileHandleLockID: cardinal): cardinal; cdecl;
 
 
+  TDosGetProcessorStatus = function (ProcID: cardinal;
+                                        var Status: cardinal): cardinal; cdecl;
+
+  TDosSetProcessorStatus = function (ProcID: cardinal;
+                                            Status: cardinal): cardinal; cdecl;
+
+  TDosQueryThreadAffinity = function (Scope: cardinal;
+                               var AffinityMask: TMPAffinity): cardinal; cdecl;
+
+  TDosSetThreadAffinity = function (PAffinityMask: PMPAffinity): cardinal;
+                                                                         cdecl;
+
+  TDosQueryExtLibPath = function (ExtLibPath: PChar;
+                                             Flags: cardinal): cardinal; cdecl;
+
+  TDosSetExtLibPath = function (ExtLibPath: PChar; Flags: cardinal): cardinal;
+                                                                         cdecl;
+
+
 
 
 const
 const
   Sys_DosCancelLockRequestL: TDosCancelLockRequestL =
   Sys_DosCancelLockRequestL: TDosCancelLockRequestL =
@@ -1094,6 +1329,16 @@ const
                                                  @DummyDosProtectEnumAttribute;
                                                  @DummyDosProtectEnumAttribute;
   Sys_DosProtectSetFileLocks: TDosProtectSetFileLocks =
   Sys_DosProtectSetFileLocks: TDosProtectSetFileLocks =
                                                   @DummyDosProtectSetFileLocks;
                                                   @DummyDosProtectSetFileLocks;
+  Sys_DosGetProcessorStatus: TDosGetProcessorStatus =
+                                                   @DummyDosGetProcessorStatus;
+  Sys_DosSetProcessorStatus: TDosSetProcessorStatus =
+                                                   @DummyDosSetProcessorStatus;
+  Sys_DosQueryThreadAffinity: TDosQueryThreadAffinity =
+                                                  @DummyDosQueryThreadAffinity;
+  Sys_DosSetThreadAffinity: TDosSetThreadAffinity = @DummyDosSetThreadAffinity;
+  Sys_DosQueryExtLibPath: TDosQueryExtLibPath = @DummyDosQueryExtLibPath;
+  Sys_DosSetExtLibPath: TDosSetExtLibPath = @DummyDosSetExtLibPath;
+
 
 
 
 
 function DosOpenL (FileName: PChar; var Handle: THandle;
 function DosOpenL (FileName: PChar; var Handle: THandle;
@@ -1390,62 +1635,46 @@ begin
 end;
 end;
 
 
 
 
-(*
-Todo:
+function DosGetProcessorStatus (ProcID: cardinal;
+                                var Status: cardinal): cardinal; cdecl; inline;
+begin
+  DosGetProcessorStatus := Sys_DosGetProcessorStatus (ProcID, Status);
+end;
 
 
-function DosGetProcessorStatus (...): cardinal; cdecl;
-external 'DOSCALLS' index 447;       - may be simulated on non-SMP
 
 
-DosSetProcessorStatus = DOSCALLS.448 - may be ignored on non-SMP
-DosCreateSpinLock     = DOSCALLS.449 - may be simulated using semaphores on non-SMP
-DosAcquireSpinLock    = DOSCALLS.450 - may be simulated using semaphores on non-SMP
-DosReleaseSpinLock    = DOSCALLS.451 - may be simulated using semaphores on non-SMP
-DosFreeSpinLock       = DOSCALLS.452 - may be simulated using semaphores on non-SMP
+function DosSetProcessorStatus (ProcID: cardinal;
+                                    Status: cardinal): cardinal; cdecl; inline;
+begin
+  DosSetProcessorStatus := Sys_DosSetProcessorStatus (ProcID, Status);
+end;
 
 
- DosQueryModFromEIP - may be simulated by returning empty value if not available
 
 
-___ function Dos16QueryModFromCS (...): ...
-external 'DOSCALLS' index 359;
+function DosQueryThreadAffinity (Scope: cardinal;
+                       var AffinityMask: TMPAffinity): cardinal; cdecl; inline;
+begin
+  DosQueryThreadAffinity := Sys_DosQueryThreadAffinity (Scope, AffinityMask);
+end;
 
 
 
 
- DosQueryThreadAffinity - may be simulated on non-SMP
- DosSetThreadAffinity - may be ignored on non-SMP
- DosVerifyPidTid - may be implemented by analyzing information returned by DosQuerySysState
+function DosSetThreadAffinity (PAffinityMask: PMPAffinity): cardinal; cdecl;
+                                                                        inline;
+begin
+  DosSetThreadAffinity := Sys_DosSetThreadAffinity (PAffinityMask);
+end;
 
 
- DosQueryExtLibPath - may be simulated by providing empty result if not available
- DosSetExtLibPath - may be simulated by returning ERROR_NOT_ENOUGH_MEMORY if not available
 
 
-  Dos32AcquireSpinLock              | DOSCALLS | SMP   | SMP
-  Dos32FreeSpinLock                 | DOSCALLS | SMP   | SMP
-  Dos32GetProcessorStatus           | DOSCALLS | SMP   | SMP
-  Dos32ReleaseSpinLock              | DOSCALLS | SMP   | SMP
-  Dos32SetProcessorStatus           | DOSCALLS | SMP   | SMP
-  Dos32TestPSD                      | DOSCALLS | SMP   | SMP
+function DosQueryExtLibPath (ExtLibPath: PChar; Flags: cardinal): cardinal;
+                                                                 cdecl; inline;
+begin
+  DosQueryExtLibPath := Sys_DosQueryExtLibPath (ExtLibPath, Flags);
+end;
 
 
-  Dos32QueryThreadAffinity          | DOSCALLS | PROC  | 2.45
-  Dos32QueryThreadContext           | DOSCALLS | XCPT  | 2.40
-  Dos32SetThreadAffinity            | DOSCALLS | PROC  | 2.45
 
 
-  Dos32AllocThreadLocalMemory       | DOSCALLS | PROC  | 2.30
-  Dos32FreeThreadLocalMemory        | DOSCALLS | PROC  | 2.30
-  Dos32ListIO                       | DOSCALLS | FILE  | 2.45
-  Dos32ProtectClose                 | DOSCALLS | FILE  | 2.10
-  Dos32ProtectEnumAttribute         | DOSCALLS | FILE  | 2.10
-  Dos32ProtectOpen                  | DOSCALLS | FILE  | 2.10
-  Dos32ProtectQueryFHState          | DOSCALLS | FILE  | 2.10
-  Dos32ProtectQueryFileInfo         | DOSCALLS | FILE  | 2.10
-  Dos32ProtectRead                  | DOSCALLS | FILE  | 2.10
-  Dos32ProtectSetFHState            | DOSCALLS | FILE  | 2.10
-  Dos32ProtectSetFileInfo           | DOSCALLS | FILE  | 2.10
-  Dos32ProtectSetFileLocks          | DOSCALLS | FILE  | 2.10
-  Dos32ProtectSetFilePtr            | DOSCALLS | FILE  | 2.10
-  Dos32ProtectSetFileSize           | DOSCALLS | FILE  | 2.10
-  Dos32ProtectWrite                 | DOSCALLS | FILE  | 2.10
-  Dos32QueryABIOSSupport            | DOSCALLS | MOD   | 2.10
-  Dos32QueryModFromEIP              | DOSCALLS | MOD   | 2.10
-  Dos32SuppressPopUps               | DOSCALLS | MISC  | 2.10
-  Dos32VerifyPidTid                 | DOSCALLS | MISC  | 2.30
-*)
+function DosSetExtLibPath (ExtLibPath: PChar; Flags: cardinal): cardinal;
+                                                                 cdecl; inline;
+begin
+  DosSetExtLibPath := Sys_DosSetExtLibPath (ExtLibPath, Flags);
+end;
 
 
 
 
 var
 var
@@ -1475,6 +1704,10 @@ begin
                                                                        = 0 then
                                                                        = 0 then
      Sys_DosProtectSetFileSizeL := TDosProtectSetFileSizeL (P);
      Sys_DosProtectSetFileSizeL := TDosProtectSetFileSizeL (P);
    end;
    end;
+
+  if DosCallsHandle = THandle (-1) then
+   Exit;
+
   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32ProtectOpen, nil, P) = 0 then
   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32ProtectOpen, nil, P) = 0 then
    begin
    begin
     Sys_DosProtectOpen := TDosProtectOpen (P);
     Sys_DosProtectOpen := TDosProtectOpen (P);
@@ -1511,4 +1744,73 @@ begin
                                                                     P) = 0 then
                                                                     P) = 0 then
      Sys_DosProtectSetFileLocks := TDosProtectSetFileLocks (P);
      Sys_DosProtectSetFileLocks := TDosProtectSetFileLocks (P);
    end;
    end;
+
+   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32GetProcessorStatus, nil,
+                                                                    P) = 0 then
+    Sys_DosGetProcessorStatus := TDosGetProcessorStatus (P);
+   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32SetProcessorStatus, nil,
+                                                                    P) = 0 then
+    Sys_DosSetProcessorStatus := TDosSetProcessorStatus (P);
+   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32QueryThreadAffinity, nil,
+                                                                    P) = 0 then
+    Sys_DosQueryThreadAffinity := TDosQueryThreadAffinity (P);
+   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32SetThreadAffinity, nil,
+                                                                    P) = 0 then
+    Sys_DosSetThreadAffinity := TDosSetThreadAffinity (P);
+   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32QueryExtLibPath, nil,
+                                                                    P) = 0 then
+    Sys_DosQueryExtLibPath := TDosQueryExtLibPath (P);
+   if DosQueryProcAddr (DosCallsHandle, Ord_Dos32SetExtLibPath, nil,
+                                                                    P) = 0 then
+    Sys_DosSetExtLibPath := TDosSetExtLibPath (P);
 end.
 end.
+
+(*
+Todo:
+DosCreateSpinLock     = DOSCALLS.449 - might be simulated using semaphores on non-SMP
+DosAcquireSpinLock    = DOSCALLS.450 - might be simulated using semaphores on non-SMP
+DosReleaseSpinLock    = DOSCALLS.451 - might be simulated using semaphores on non-SMP
+DosFreeSpinLock       = DOSCALLS.452 - might be simulated using semaphores on non-SMP
+
+ DosQueryModFromEIP - may be simulated by returning empty value if not available or possibly by using data returned by DosQuerySysState (if they are equal across different OS/2 versions?)
+
+___ function Dos16QueryModFromCS (...): ...
+external 'DOSCALLS' index 359;
+
+
+ DosVerifyPidTid - may be implemented by analyzing information returned by DosQuerySysState
+
+x DosQueryExtLibPath - may be simulated by providing empty result if not available
+x DosSetExtLibPath - may be simulated by returning ERROR_NOT_ENOUGH_MEMORY if not available
+
+  Dos32AcquireSpinLock              | DOSCALLS | SMP   | SMP
+  Dos32FreeSpinLock                 | DOSCALLS | SMP   | SMP
+x  Dos32GetProcessorStatus           | DOSCALLS | SMP   | SMP
+  Dos32ReleaseSpinLock              | DOSCALLS | SMP   | SMP
+x  Dos32SetProcessorStatus           | DOSCALLS | SMP   | SMP
+  Dos32TestPSD                      | DOSCALLS | SMP   | SMP
+
+x  Dos32QueryThreadAffinity          | DOSCALLS | PROC  | 2.45
+  Dos32QueryThreadContext           | DOSCALLS | XCPT  | 2.40
+x  Dos32SetThreadAffinity            | DOSCALLS | PROC  | 2.45
+
+  Dos32AllocThreadLocalMemory       | DOSCALLS | PROC  | 2.30
+  Dos32FreeThreadLocalMemory        | DOSCALLS | PROC  | 2.30
+  Dos32ListIO                       | DOSCALLS | FILE  | 2.45
+x  Dos32ProtectClose                 | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectEnumAttribute         | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectOpen                  | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectQueryFHState          | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectQueryFileInfo         | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectRead                  | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectSetFHState            | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectSetFileInfo           | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectSetFileLocks          | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectSetFilePtr            | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectSetFileSize           | DOSCALLS | FILE  | 2.10
+x  Dos32ProtectWrite                 | DOSCALLS | FILE  | 2.10
+  Dos32QueryABIOSSupport            | DOSCALLS | MOD   | 2.10
+  Dos32QueryModFromEIP              | DOSCALLS | MOD   | 2.10
+  Dos32SuppressPopUps               | DOSCALLS | MISC  | 2.10
+  Dos32VerifyPidTid                 | DOSCALLS | MISC  | 2.30
+*)