mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 22:07:56 +02:00
533 lines
18 KiB
PHP
533 lines
18 KiB
PHP
{
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 2001-2015 by Free Pascal development team
|
|
|
|
This file contains a subset of OS/2 base types and imported OS/2 API
|
|
functions necessary for implementation of unit system.
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
|
|
type
|
|
TByteArray = array [0..$FFFF] of byte;
|
|
PByteArray = ^TByteArray;
|
|
|
|
TSysThreadIB = record
|
|
TID,
|
|
Priority,
|
|
Version: cardinal;
|
|
MCCount,
|
|
MCForceFlag: word;
|
|
end;
|
|
PSysThreadIB = ^TSysThreadIB;
|
|
|
|
TThreadInfoBlock = record
|
|
PExChain,
|
|
Stack,
|
|
StackLimit: pointer;
|
|
TIB2: PSysThreadIB;
|
|
Version,
|
|
Ordinal: cardinal;
|
|
end;
|
|
PThreadInfoBlock = ^TThreadInfoBlock;
|
|
PPThreadInfoBlock = ^PThreadInfoBlock;
|
|
|
|
TProcessInfoBlock = record
|
|
PID,
|
|
ParentPid,
|
|
Handle: cardinal;
|
|
Cmd,
|
|
Env: PByteArray;
|
|
Status,
|
|
ProcType: cardinal;
|
|
end;
|
|
PProcessInfoBlock = ^TProcessInfoBlock;
|
|
PPProcessInfoBlock = ^PProcessInfoBlock;
|
|
|
|
var
|
|
ProcessID: SizeUInt;
|
|
|
|
function GetProcessID: SizeUInt;
|
|
begin
|
|
GetProcessID := ProcessID;
|
|
end;
|
|
|
|
|
|
type
|
|
TSysDateTime=packed record
|
|
Hour,
|
|
Minute,
|
|
Second,
|
|
Sec100,
|
|
Day,
|
|
Month: byte;
|
|
Year: word;
|
|
TimeZone: smallint;
|
|
WeekDay: byte;
|
|
end;
|
|
|
|
|
|
procedure DosGetInfoBlocks (PATIB: PPThreadInfoBlock;
|
|
PAPIB: PPProcessInfoBlock); cdecl;
|
|
external 'DOSCALLS' index 312;
|
|
|
|
function DosLoadModule (ObjName: PAnsiChar; ObjLen: cardinal; DLLName: PAnsiChar;
|
|
var Handle: THandle): cardinal; cdecl;
|
|
external 'DOSCALLS' index 318;
|
|
|
|
function DosFreeModule (Handle: THandle): cardinal; cdecl;
|
|
external 'DOSCALLS' index 322;
|
|
|
|
function DosQueryModuleHandle (DLLName: PAnsiChar; var Handle: THandle): cardinal;
|
|
cdecl;
|
|
external 'DOSCALLS' index 319;
|
|
|
|
function DosQueryProcAddr (Handle, Ordinal: cardinal; ProcName: PAnsiChar;
|
|
var Address: pointer): cardinal; cdecl;
|
|
external 'DOSCALLS' index 321;
|
|
|
|
function DosSetRelMaxFH (var ReqCount: longint; var CurMaxFH: cardinal):
|
|
cardinal; cdecl;
|
|
external 'DOSCALLS' index 382;
|
|
|
|
function DosSetCurrentDir (Name:PAnsiChar): cardinal; cdecl;
|
|
external 'DOSCALLS' index 255;
|
|
|
|
procedure DosQueryCurrentDisk(var DiskNum:cardinal;var Logical:cardinal); cdecl;
|
|
external 'DOSCALLS' index 275;
|
|
|
|
function DosSetDefaultDisk (DiskNum:cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 220;
|
|
|
|
{ This is not real prototype, but is close enough }
|
|
{ for us (the 2nd parameter is actually a pointer }
|
|
{ to a structure). }
|
|
function DosCreateDir (Name: PAnsiChar; P: pointer): cardinal; cdecl;
|
|
external 'DOSCALLS' index 270;
|
|
|
|
function DosDeleteDir (Name: PAnsiChar): cardinal; cdecl;
|
|
external 'DOSCALLS' index 226;
|
|
|
|
function DosQueryCurrentDir(DiskNum:cardinal;var Buffer;
|
|
var BufLen:cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 274;
|
|
|
|
function DosMove(OldFile,NewFile:PAnsiChar):cardinal; cdecl;
|
|
external 'DOSCALLS' index 271;
|
|
|
|
function DosDelete(FileName:PAnsiChar):cardinal; cdecl;
|
|
external 'DOSCALLS' index 259;
|
|
|
|
procedure DosExit(Action, Result: cardinal); cdecl;
|
|
external 'DOSCALLS' index 234;
|
|
|
|
// EAs not used in System unit
|
|
function DosOpen(FileName:PAnsiChar;var Handle: THandle;var Action:cardinal;
|
|
InitSize,Attrib,OpenFlags,FileMode:cardinal;
|
|
EA:Pointer): cardinal; cdecl;
|
|
external 'DOSCALLS' index 273;
|
|
|
|
function DosClose(Handle: THandle): cardinal; cdecl;
|
|
external 'DOSCALLS' index 257;
|
|
|
|
function DosRead(Handle: THandle; Buffer: Pointer; Count: cardinal;
|
|
var ActCount: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 281;
|
|
|
|
function DosWrite(Handle: THandle; Buffer: Pointer;Count: cardinal;
|
|
var ActCount: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 282;
|
|
|
|
function DosSetFilePtr(Handle: THandle; Pos:longint; Method:cardinal;
|
|
var PosActual: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 256;
|
|
|
|
function DosSetFileSize(Handle: THandle; Size: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 272;
|
|
|
|
function DosQueryHType(Handle: THandle; var HandType: cardinal;
|
|
var Attr: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 224;
|
|
|
|
function DosQueryModuleName (Handle: THandle; NameLen: cardinal; Name: PAnsiChar):
|
|
cardinal; cdecl;
|
|
external 'DOSCALLS' index 320;
|
|
|
|
function DosGetDateTime(var Buf:TSysDateTime): cardinal; cdecl;
|
|
external 'DOSCALLS' index 230;
|
|
|
|
|
|
{
|
|
Already declared in interface part:
|
|
type
|
|
TDosOpenL = function (FileName: PAnsiChar; var Handle: THandle;
|
|
var Action: cardinal; InitSize: int64;
|
|
Attrib, OpenFlags, FileMode: cardinal;
|
|
EA: pointer): cardinal; cdecl;
|
|
|
|
TDosSetFilePtrL = function (Handle: THandle; Pos: int64; Method: cardinal;
|
|
var PosActual: int64): cardinal; cdecl;
|
|
|
|
TDosSetFileSizeL = function (Handle: THandle; Size: int64): cardinal; cdecl;
|
|
}
|
|
|
|
function DummyDosOpenL (FileName: PAnsiChar; var Handle: THandle;
|
|
var Action: cardinal; InitSize: int64;
|
|
Attrib, OpenFlags, FileMode: cardinal;
|
|
EA: pointer): cardinal; cdecl;
|
|
begin
|
|
DummyDosOpenL := DosOpen (FileName, Handle, Action, InitSize, Attrib,
|
|
OpenFlags, FileMode, EA);
|
|
end;
|
|
|
|
|
|
function DummyDosSetFilePtrL (Handle: THandle; Pos: int64; Method: cardinal;
|
|
var PosActual: int64): cardinal; cdecl;
|
|
var
|
|
PosAct0: cardinal;
|
|
begin
|
|
DummyDosSetFilePtrL := DosSetFilePtr (Handle, Pos, Method, PosAct0);
|
|
PosActual := PosAct0;
|
|
end;
|
|
|
|
|
|
function DummyDosSetFileSizeL (Handle: THandle; Size: int64): cardinal; cdecl;
|
|
begin
|
|
DummyDosSetFileSizeL := DosSetFileSize (Handle, Size);
|
|
end;
|
|
|
|
|
|
const
|
|
OrdDosOpenL = 981;
|
|
OrdDosSetFilePtrL = 988;
|
|
OrdDosSetFileSizeL = 989;
|
|
|
|
{ converts an OS/2 error code to a TP compatible error }
|
|
{ code. Same thing exists under most other supported }
|
|
{ systems. }
|
|
{ Only call for OS/2 DLL imported routines }
|
|
Procedure Errno2InOutRes;
|
|
Begin
|
|
{ errors 1..18 are the same as in DOS }
|
|
case InOutRes of
|
|
{ simple offset to convert these error codes }
|
|
{ exactly like the error codes in Win32 }
|
|
19..31 : InOutRes := InOutRes + 131;
|
|
{ gets a bit more complicated ... }
|
|
32..33 : InOutRes := 5;
|
|
38 : InOutRes := 100;
|
|
39 : InOutRes := 101;
|
|
112 : InOutRes := 101;
|
|
110 : InOutRes := 5;
|
|
114 : InOutRes := 6;
|
|
206 : InOutRes := 3; (* TH: Path too long *)
|
|
290 : InOutRes := 4;
|
|
end;
|
|
{ all other cases ... we keep the same error code }
|
|
end;
|
|
|
|
|
|
(* Types and constants for exception handler support *)
|
|
const
|
|
deHardErr = 1; {Pop-ups for hard errors are enabled, to disable
|
|
do not give this switch.}
|
|
deDisableExceptions = 2; {Pop-ups for exceptions are disabled, to enable
|
|
do not give this switch.}
|
|
MaxExceptionParameters = 4; {Enough for all system exceptions.}
|
|
|
|
Xcpt_Continue_Search = $00000000;
|
|
Xcpt_Continue_Execution = $ffffffff;
|
|
Xcpt_Continue_Stop = $00716668;
|
|
|
|
Xcpt_Signal_Intr = 1;
|
|
Xcpt_Signal_KillProc = 3;
|
|
Xcpt_Signal_Break = 4;
|
|
|
|
Xcpt_Fatal_Exception = $c0000000;
|
|
Xcpt_Severity_Code = $c0000000;
|
|
Xcpt_Customer_Code = $20000000;
|
|
Xcpt_Facility_Code = $1fff0000;
|
|
Xcpt_Exception_Code = $0000ffff;
|
|
|
|
Xcpt_Unknown_Access = $00000000;
|
|
Xcpt_Read_Access = $00000001;
|
|
Xcpt_Write_Access = $00000002;
|
|
Xcpt_Execute_Access = $00000004;
|
|
Xcpt_Space_Access = $00000008;
|
|
Xcpt_Limit_Access = $00000010;
|
|
Xcpt_Data_Unknown = $ffffffff;
|
|
|
|
Xcpt_Guard_Page_Violation = $80000001;
|
|
Xcpt_Unable_To_Grow_Stack = $80010001;
|
|
Xcpt_Access_Violation = $c0000005;
|
|
Xcpt_In_Page_Error = $c0000006;
|
|
Xcpt_Illegal_Instruction = $c000001c;
|
|
Xcpt_Invalid_Lock_Sequence = $c000001d;
|
|
Xcpt_Noncontinuable_Exception = $c0000024;
|
|
Xcpt_Invalid_Disposition = $c0000025;
|
|
Xcpt_Unwind = $c0000026;
|
|
Xcpt_Bad_Stack = $c0000027;
|
|
Xcpt_Invalid_Unwind_Target = $c0000028;
|
|
Xcpt_Array_Bounds_Exceeded = $c0000093;
|
|
Xcpt_Float_Denormal_Operand = $c0000094;
|
|
Xcpt_Float_Divide_By_Zero = $c0000095;
|
|
Xcpt_Float_Inexact_Result = $c0000096;
|
|
Xcpt_Float_Invalid_Operation = $c0000097;
|
|
Xcpt_Float_Overflow = $c0000098;
|
|
Xcpt_Float_Stack_Check = $c0000099;
|
|
Xcpt_Float_Underflow = $c000009a;
|
|
Xcpt_Integer_Divide_By_Zero = $c000009b;
|
|
Xcpt_Integer_Overflow = $c000009c;
|
|
Xcpt_Privileged_Instruction = $c000009d;
|
|
Xcpt_Datatype_Misalignment = $c000009e;
|
|
Xcpt_Breakpoint = $c000009f;
|
|
Xcpt_Single_Step = $c00000a0;
|
|
Xcpt_Process_Terminate = $c0010001;
|
|
Xcpt_Async_Process_Terminate = $c0010002;
|
|
Xcpt_Signal = $c0010003;
|
|
|
|
Context_Control = $00000001; { SS:ESP, CS:EIP, EFLAGS and EBP set }
|
|
Context_Integer = $00000002; { EAX, EBX, ECX, EDX, ESI and EDI set }
|
|
Context_Segments = $00000004; { DS, ES, FS, and GS set }
|
|
Context_Floating_Point = $00000008; { numeric coprocessor state set }
|
|
Context_Full = Context_Control or
|
|
Context_Integer or
|
|
Context_Segments or
|
|
Context_Floating_Point;
|
|
|
|
type
|
|
PExceptionRegistrationRecord = ^TExceptionRegistrationRecord;
|
|
PExceptionReportRecord = ^TExceptionReportRecord;
|
|
PContextRecord = ^TContextRecord;
|
|
|
|
TExceptionHandler = function (Report: PExceptionReportRecord;
|
|
RegRec: PExceptionRegistrationRecord;
|
|
Context: PContextRecord;
|
|
DispContext: pointer): cardinal; cdecl;
|
|
|
|
TExceptionRegistrationRecord = record
|
|
Prev_Structure: PExceptionRegistrationRecord;
|
|
ExceptionHandler: TExceptionHandler;
|
|
end;
|
|
|
|
TExceptionReportRecord = record
|
|
Exception_Num,
|
|
HandlerFlags: cardinal;
|
|
Nested_RepRec: PExceptionReportRecord;
|
|
Address: pointer;
|
|
ParamCount: cardinal;
|
|
Parameters: array [0..Pred (MaxExceptionParameters)] of cardinal;
|
|
end;
|
|
|
|
TContextRecord = packed record
|
|
ContextFlags: cardinal;
|
|
Env: array [1..7] of cardinal;
|
|
FPUStack: array [0..7] of extended;
|
|
Reg_GS,
|
|
Reg_FS,
|
|
Reg_ES,
|
|
Reg_DS,
|
|
Reg_EDI,
|
|
Reg_ESI,
|
|
Reg_EAX,
|
|
Reg_EBX,
|
|
Reg_ECX,
|
|
Reg_EDX,
|
|
Reg_EBP,
|
|
Reg_EIP,
|
|
Reg_CS,
|
|
Flags,
|
|
Reg_ESP,
|
|
Reg_SS: cardinal;
|
|
end;
|
|
|
|
|
|
function DosSetExceptionHandler (var RegRec: TExceptionRegistrationRecord):
|
|
cardinal; cdecl;
|
|
external 'DOSCALLS' index 354;
|
|
|
|
function DosUnsetExceptionHandler (var RegRec: TExceptionRegistrationRecord):
|
|
cardinal; cdecl;
|
|
external 'DOSCALLS' index 355;
|
|
|
|
{Full screen applications can get Ctrl-C and Ctrl-Break focus. For all
|
|
processes sharing one screen, only one can have Ctrl-C focus.
|
|
Enable = 0 = Release focus, 1 = Get focus.
|
|
Times = Number of times focus has been get minus number of times it
|
|
has been released.}
|
|
function DosSetSignalExceptionFocus (Enable: cardinal;
|
|
var Times: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 378;
|
|
|
|
{Tell we want further signal exceptions.
|
|
SignalNum = Signal number to acknowlegde.}
|
|
function DosAcknowledgeSignalException (SignalNum: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 418;
|
|
|
|
function DosError (Error: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 212;
|
|
|
|
|
|
type
|
|
TWinMessageBox = function (Parent, Owner: cardinal;
|
|
BoxText, BoxTitle: PAnsiChar; Identity, Style: cardinal): cardinal; cdecl;
|
|
TWinInitialize = function (Options: cardinal): cardinal; cdecl;
|
|
TWinCreateMsgQueue = function (Handle: cardinal; cmsg: longint): cardinal;
|
|
cdecl;
|
|
|
|
const
|
|
ErrorBufferLength = 1024;
|
|
mb_OK = $0000;
|
|
mb_Error = $0040;
|
|
mb_Moveable = $4000;
|
|
MBStyle = mb_OK or mb_Error or mb_Moveable;
|
|
|
|
mfPag_Read = $00001; {Give read access to memory.}
|
|
mfPag_Write = $00002; {Give write access to memory.}
|
|
mfPag_Execute = $00004; {Allow code execution in memory.}
|
|
mfPag_Guard = $00008; {Used for dynamic memory growing. Create
|
|
uncommitted memory and make the first
|
|
page guarded. Once it is accessed it
|
|
will be made committed, and the next
|
|
uncommitted page will be made guarded.}
|
|
mfPag_Commit = $00010; {Make the memory committed.}
|
|
mfPag_Decommit = $00020; {Decommit the page.}
|
|
mfObj_Tile = $00040; {Also allocate 16-bit segments of 64k
|
|
which map the memory. (Makes 16<>32 bit
|
|
pointer conversion possible.}
|
|
mfObj_Protected = $00080;
|
|
mfObj_Gettable = $00100;
|
|
mfObj_Giveable = $00200;
|
|
mfObj_Any = $00400; {Allow using high memory (> 512 MB).}
|
|
mfPag_Default = $00400;
|
|
mfPag_Shared = $02000;
|
|
mfPag_Free = $04000;
|
|
mfPag_Base = $10000;
|
|
|
|
mfSub_Init = $00001; {Use base, if not set, choose a base
|
|
address yourself.}
|
|
mfSub_Grow = $00002; {Grow the specified heap, instead of
|
|
allocating it. Ignore mfSub_Init.}
|
|
mfSub_Sparse = $00004;
|
|
mfSub_Serialize = $00008;
|
|
|
|
function DosQueryMem (P: pointer; var Size, Flag: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 306;
|
|
|
|
function DosQuerySysInfo (First, Last: cardinal; var Buf; BufSize: cardinal):
|
|
cardinal; cdecl;
|
|
external 'DOSCALLS' index 348;
|
|
|
|
type
|
|
TCPArray = array [0..2] of cardinal;
|
|
PCPArray = ^TCPArray;
|
|
|
|
function DosQueryCP (Size: cardinal; CodePages: PCPArray;
|
|
var ActSize: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 291;
|
|
|
|
function DosSetProcessCP (CP: cardinal): cardinal; cdecl;
|
|
external 'DOSCALLS' index 289;
|
|
|
|
type
|
|
TCountryCode = record
|
|
Country, {Country to query info about (0=current).}
|
|
CodePage: cardinal; {Code page to query info about (0=current).}
|
|
end;
|
|
|
|
function DosMapCase (Size: cardinal; var Country: TCountryCode;
|
|
AString: PAnsiChar): cardinal; cdecl;
|
|
external 'NLS' index 7;
|
|
|
|
function DosQueryDBCSEnv (Size: cardinal; var Country: TCountryCode;
|
|
Buf: PAnsiChar): cardinal; cdecl;
|
|
external 'NLS' index 6;
|
|
|
|
function DosQueryCollate (Size: cardinal; var Country: TCountryCode;
|
|
Buf: PByteArray; var TableLen: cardinal): cardinal; cdecl;
|
|
external 'NLS' index 8;
|
|
|
|
type
|
|
TTimeFmt = (Clock12, Clock24);
|
|
|
|
TCountryInfo = record
|
|
Country, CodePage: cardinal; {Country and codepage requested.}
|
|
DateFormat: cardinal; {1=ddmmyy 2=yymmdd 3=mmddyy}
|
|
CurrencyUnit: array [0..4] of AnsiChar;
|
|
ThousandSeparator: AnsiChar; {Thousands separator.}
|
|
Zero1: byte; {Always zero.}
|
|
DecimalSeparator: AnsiChar; {Decimals separator,}
|
|
Zero2: byte;
|
|
DateSeparator: AnsiChar; {Date separator.}
|
|
Zero3: byte;
|
|
TimeSeparator: AnsiChar; {Time separator.}
|
|
Zero4: byte;
|
|
CurrencyFormat, {Bit field:
|
|
Bit 0: 0=indicator before value
|
|
1=indicator after value
|
|
Bit 1: 1=insert space after indicator.
|
|
Bit 2: 1=Ignore bit 0&1, replace
|
|
decimal separator with
|
|
indicator.}
|
|
DecimalPlace: byte; {Number of decimal places used in
|
|
currency indication.}
|
|
TimeFormat: TTimeFmt; {12/24 hour.}
|
|
Reserve1: array [0..1] of word;
|
|
DataSeparator: AnsiChar; {Data list separator}
|
|
Zero5: byte;
|
|
Reserve2: array [0..4] of word;
|
|
end;
|
|
|
|
const
|
|
CurrentCountry: TCountryCode = (Country: 0; CodePage: 0);
|
|
|
|
function DosQueryCtryInfo (Size: cardinal; var Country: TCountryCode;
|
|
var Res: TCountryInfo; var ActualSize: cardinal): cardinal; cdecl;
|
|
external 'NLS' index 5;
|
|
|
|
type
|
|
PInsertTable = ^TInsertTable;
|
|
TInsertTable = array [1..9] of PAnsiChar;
|
|
|
|
function DosTrueGetMessage (MsgSeg: pointer; Table: PInsertTable;
|
|
TableSize: cardinal; Buf: PAnsiChar;
|
|
BufSize, MsgNumber: cardinal; FileName: PAnsiChar;
|
|
var MsgSize: cardinal): cardinal; cdecl;
|
|
external 'MSG' index 6;
|
|
|
|
procedure MagicHeaderEnd; assembler; forward;
|
|
|
|
{$ASMMODE INTEL}
|
|
|
|
{start of _MSGSEG32 segment}
|
|
procedure MagicHeaderStart; assembler;
|
|
asm
|
|
db $0FF
|
|
db $4D,$53,$47,$53,$45,$47,$33,$32, 0 //'MSGSEG32'
|
|
dd $8001
|
|
dd MagicHeaderEnd
|
|
end;
|
|
|
|
function DosGetMessage (Table: PInsertTable; TableSize: cardinal; Buf: PAnsiChar;
|
|
BufSize, MsgNumber: cardinal; FileName: PAnsiChar;
|
|
var MsgSize: cardinal): cardinal; cdecl; assembler;
|
|
nostackframe;
|
|
asm
|
|
pop eax
|
|
push offset MagicHeaderStart
|
|
push eax
|
|
jmp DosTrueGetMessage
|
|
end;
|
|
|
|
procedure MagicHeaderEnd; assembler;
|
|
asm
|
|
dd $0FFFF0000
|
|
end;
|
|
{$ASMMODE DEFAULT}
|