* fix for DosGetMessage and better (more accurate) declaration for DosQueryCP

git-svn-id: trunk@28974 -
This commit is contained in:
Tomas Hajny 2014-11-03 13:52:25 +00:00
parent a9dcb9201f
commit 1c74b752c5

View File

@ -1,9 +1,14 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2002 by the Free Pascal development team.
Copyright (c) 1999-2014 by the Free Pascal development team.
Basic OS/2 constants, types and functions
implemented (mostly) in DOSCALL1.DLL.
Basic OS/2 constants, types and functions implemented (mostly)
in DOSCALL1.DLL. Only functions available in all 32-bit OS/2
versions (i.e. starting with OS/2 2.0) are included here
to make sure that programs using this unit could still run on
these old versions. Certain functions supported in later versions
which could be emulated on older versions are provided in unit
DosCall2 (using dynamic loading of the respective entry points).
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
@ -2351,11 +2356,16 @@ function DosQueryCollate(Size:longint;var Country:TCountryCode;
function DosQueryCollate (Size: cardinal; var Country: TCountryCode;
Buf:PByteArray; var TableLen: cardinal): cardinal; cdecl;
{Get the current codepage. The PWordArray is filled with the current code
page followed by alternative codepages.}
function DosQueryCP(Size:longint;CodePages:PWordArray;
{Get the current codepage. The return buffer (CodePages) is filled with the
current code page followed by the list of prepared codepages as specified in
CONFIG.SYS - all of them returned as DWORDs, typically not more than 3 should
be necessary. Return value of 473 indicates that not all values fit into the
provided space.}
function DosQueryCP(Size:longint; PCodePages: PWordArray;
var ActSize:longint):cardinal; cdecl;
function DosQueryCP (Size: cardinal; CodePages: PWordArray;
function DosQueryCP(Size: cardinal; PCodePages: PWordArray;
var ActSize:cardinal):cardinal; cdecl;
function DosQueryCP (Size: cardinal; var CodePages;
var ActSize: cardinal): cardinal; cdecl;
{Change the codepage, but only for the current process.}
@ -2720,7 +2730,7 @@ function DosGetMessage(Table:PInsertTable;TableSize:longint;Buf:PChar;
var MsgSize:longint):cardinal;
function DosGetMessage (Table: PInsertTable; TableSize: cardinal; Buf: PChar;
BufSize, MsgNumber: cardinal; FileName: PChar;
var MsgSize: cardinal): cardinal;
var MsgSize: cardinal): cardinal; cdecl;
{And a variant using strings and open arrays.
function DosGetMessage(const Table:array of PString;var Buf:string;
BufSize,MsgNumber:longint;const FileName:PChar):cardinal;}
@ -3207,6 +3217,16 @@ procedure DosFlatToSel; cdecl;
{typecast result to TFarPtr}
function FlatToSel (APtr: pointer): cardinal;
{Allocate Count dwords in a memory block unique in each thread. A maximum
of 8 dwords can be allocated at a time, the total size of the thread local
memory area is 128 bytes; FPC 1.1+ uses one dword from this for internal
multi-threading support, leaving 124 bytes to programmers.}
function DosAllocThreadLocalMemory (Count: cardinal; var P: pointer): cardinal;
cdecl;
{Deallocate a previously allocated space in the thread local memory area.}
function DosFreeThreadLocalMemory (P: pointer): cardinal; cdecl;
const
{ Values for DosQueryRASInfo Index parameter }
sis_MMIOAddr = 0;
@ -3883,6 +3903,63 @@ function DosQuerySysState (EntityList, EntityLevel, PID, TID: cardinal;
PDataBuf: pointer; cbBuf: cardinal): cardinal; cdecl;
{
Creates a private Read/Write alias or an LDT code segment alias to part
of an existing memory object. The alias object is accessible only to the
process that created it. The original object must be accessible to the caller
of DosAliasMem.
An alias is removed by calling DosFreeMem with the alias address.
Although it is possible to create a Read/Write alias to a code segment
to allow code modification, this is not recommended. On Pentium processors,
and later, pipe-lining techniques used by the processor might allow
the processor not to be aware of the modified code, if appropriate
pipe-line serialization is not performed by the programmer. For further
information see the processor documentation.
Possible return values:
0 No_Error
8 Error_Not_Enough_Memory
87 Error_Invalid_Parameter
95 Error_Interrupt
32798 Error_Crosses_Object_Boundary
pMem = Pointer to the memory to be aliased. It must be on a page boundary
(i.e. aligned to 4 kB), but may specify an address within a memory
object.
Size = Specifies size in bytes for the memory to alias. The entire range
must lie within a single memory object and must be committed
if OBJ_SELMAPALL is specified.
Alias = Pointer where the address of the aliased memory is returned.
The corresponding LDT selector is not explicitly returned but may be
calculated by using the Compatibility Mapping Algorithm
((Alias shr 13) or 7).
Flags = Combination of the following values:
obj_SelMapAll = $800 (Create a Read/Write 32 bit alias
to the address specified. The entire range
must be committed, start on page boundary
and be within the extent of a single memory
object. An LDT selector is created to map
the entire range specified. If obj_SelMapAll
is not specified, then size is rounded up
to a 4K multiple and the alias created
inherits the permissions from the pages
of the original object.)
obj_Tile = $40 (Obj_Tile may be specified, but currently
this is enforced whether or not specified.
This forces LDT selectors to be based
on 64K boundaries.)
sel_Code = 1 (Marks the LDT alias selector(s)
Read-Executable code selectors.)
sel_Use32 = 2 (Used with obj_SelMapAll, otherwise ignored.
Marks the first alias LDT selector
as a 32 bit selector by setting the BIG/C32
bit.)
}
function DosAliasMem (pMem: pointer; Size: cardinal; var Alias: pointer;
Flags: cardinal): cardinal; cdecl;
{***************************************************************************}
implementation
@ -5188,11 +5265,15 @@ function DosQueryCollate (Size: cardinal; var Country: TCountryCode;
Buf: PByteArray; var TableLen: cardinal): cardinal; cdecl;
external 'NLS' index 8;
function DosQueryCP(Size:longint;CodePages:PWordArray;
function DosQueryCP(Size:longint; PCodePages:PWordArray;
var ActSize:longint):cardinal; cdecl;
external 'DOSCALLS' index 291;
function DosQueryCP (Size: cardinal; CodePages: PWordArray;
function DosQueryCP (Size: cardinal; PCodePages: PWordArray;
var ActSize: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 291;
function DosQueryCP (Size: cardinal; var CodePages;
var ActSize: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 291;
@ -5365,20 +5446,10 @@ function DosTrueGetMessage (MsgSeg: pointer; Table: PInsertTable;
var MsgSize: cardinal): cardinal; cdecl;
external 'MSG' index 6;
function DosTrueGetMessage (MsgSeg: pointer; Table: PInsertTable;
TableSize: longint; Buf: PChar;
BufSize, MsgNumber: longint; FileName: PChar;
var MsgSize: longint): cardinal; cdecl;
external 'MSG' index 6;
function DosIQueryMessageCP (var Buf; BufSize: cardinal; FileName: PChar;
var InfoSize: cardinal; MesSeg: pointer): cardinal; cdecl;
external 'MSG' index 8;
function DosIQueryMessageCP (var Buf; BufSize: longint; FileName: PChar;
var InfoSize: longint; MesSeg: pointer): cardinal; cdecl;
external 'MSG' index 8;
procedure MagicHeaderEnd; assembler; forward;
{$ASMMODE INTEL}
@ -5394,18 +5465,21 @@ end;
function DosGetMessage (Table: PInsertTable; TableSize: cardinal; Buf: PChar;
BufSize, MsgNumber: cardinal; FileName: PChar;
var MsgSize: cardinal): cardinal;
begin
DosGetMessage := DosTrueGetMessage(@MagicHeaderStart,Table,TableSize,
Buf,BufSize,MsgNumber,FileName,MsgSize);
var MsgSize: cardinal): cardinal; cdecl; assembler;
nostackframe;
asm
pop eax
push offset MagicHeaderStart
push eax
jmp DosTrueGetMessage
end;
function DosGetMessage (Table: PInsertTable; TableSize:longint;Buf:PChar;
BufSize,MsgNumber:longint;FileName:PChar;
var MsgSize:longint):cardinal;
BufSize,MsgNumber:longint;FileName:PChar;
var MsgSize:longint):cardinal;
begin
DosGetMessage := DosTrueGetMessage(@MagicHeaderStart,Table,TableSize,
Buf,BufSize,MsgNumber,FileName,MsgSize);
DosGetMessage := DosGetMessage (Table, cardinal (TableSize), Buf,
cardinal (BufSize), cardinal (MsgNumber), FileName, cardinal (MsgSize));
end;
function DosQueryMessageCP (var Buf; BufSize: cardinal; FileName: PChar;
@ -5418,8 +5492,8 @@ end;
function DosQueryMessageCP(var Buf;BufSize:longint;FileName:PChar;
var InfoSize:longint):cardinal;
begin
DosQueryMessageCP := DosIQueryMessageCP(Buf, BufSize, FileName, InfoSize,
@MagicHeaderStart);
DosQueryMessageCP := DosIQueryMessageCP(Buf, cardinal (BufSize), FileName,
cardinal (InfoSize), @MagicHeaderStart);
end;
procedure MagicHeaderEnd; assembler;
@ -5733,6 +5807,13 @@ function FlatToSel (APtr: pointer): cardinal; assembler;
pop ebx
end;
function DosAllocThreadLocalMemory (Count: cardinal; var P: pointer): cardinal;
cdecl;
external 'DOSCALLS' index 454;
function DosFreeThreadLocalMemory (P: pointer): cardinal; cdecl;
external 'DOSCALLS' index 455;
function DosQueryRASInfo (Index: cardinal; var PBuffer: pointer): cardinal;
cdecl; external 'DOSCALLS' index 112;
@ -5798,86 +5879,6 @@ external 'DOSCALLS' index 580;
function DosQueryHeaderInfo ...; cdecl;
external 'DOSCALLS' index 582;
WSeB/eCS APIs:
Creates a private Read/Write alias or an LDT code segment alias to part
of an existing memory object. The alias object is accessible only to the
process that created it. The original object must be accessible to the caller
of DosAliasMem.
An alias is removed by calling DosFreeMem with the alias address.
Although it is possible to create a Read/Write alias to a code segment
to allow code modification, this is not recommended. On Pentium processors,
and later, pipe-lining techniques used by the processor might allow
the processor not to be aware of the modified code, if appropriate
pipe-line serialization is not performed by the programmer. For further
information see the processor documentation.
Possible return values:
0 No_Error
8 Error_Not_Enough_Memory
87 Error_Invalid_Parameter
95 Error_Interrupt
32798 Error_Crosses_Object_Boundary
pMem = Pointer to the memory to be aliased. It must be on a page boundary
(i.e. aligned to 4 kB), but may specify an address within a memory
object.
Size = Specifies size in bytes for the memory to alias. The entire range
must lie within a single memory object and must be committed
if OBJ_SELMAPALL is specified.
Alias = Pointer where the address of the aliased memory is returned.
The corresponding LDT selector is not explicitly returned but may be
calculated by using the Compatibility Mapping Algorithm
((Alias shr 13) or 7).
Flags = Combination of the following values:
obj_SelMapAll = $800 (Create a Read/Write 32 bit alias
to the address specified. The entire range
must be committed, start on page boundary
and be within the extent of a single memory
object. An LDT selector is created to map
the entire range specified. If obj_SelMapAll
is not specified, then size is rounded up
to a 4K multiple and the alias created
inherits the permissions from the pages
of the original object.)
obj_Tile = $40 (Obj_Tile may be specified, but currently
this is enforced whether or not specified.
This forces LDT selectors to be based
on 64K boundaries.)
sel_Code = 1 (Marks the LDT alias selector(s)
Read-Executable code selectors.)
sel_Use32 = 2 (Used with obj_SelMapAll, otherwise ignored.
Marks the first alias LDT selector
as a 32 bit selector by setting the BIG/C32
bit.)
functionDosAliasMem (pMem: pointer; Size: cardinal; var Alias: pointer; Flags: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 298;
DosCancelLockRequestL cancels an outstanding DosSetFileLocksL request.
If two threads in a process are waiting on a lock file range, and another
thread issues DosCancelLockRequestL for that lock file range, then both
waiting threads are released.
Not all file-system drivers (FSDs) can cancel an outstanding lock request.
Local Area Network (LAN) servers cannot cancel an outstanding lock request
if they use a version of the operating system prior to OS/2 Version 2.00.
Possible return values:
0 No_Error
6 Error_Invalid_Handle
87 Error_Invalid_Parameter
173 Error_Cancel_Violation
hFile = File handle used in the DosSetFileLocksL function
that is to be cancelled.
pflLockL = Address of the structure describing the lock request to cancel.
function DosCancelLockRequestL (hFile: THandle; pflLock: PFileLockL): cardinal; cdecl;
external 'DOSCALLS' index ???;
function DosCancelLockRequestL (hFile: THandle; const Lock: TFileLockL): cardinal; cdecl;
external 'DOSCALLS' index ???;
DosCreateThread2
DosDumpProcess
DosForceSystemDump
@ -5920,11 +5921,12 @@ function DosQuerySysState (EntityList, EntityLevel, PID, TID: cardinal;
PDataBuf: pointer; cbBuf: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 368;
function DosAliasMem (pMem: pointer; Size: cardinal; var Alias: pointer;
Flags: cardinal): cardinal; cdecl;
external 'DOSCALLS' index 298;
(*
DosQueryThreadAffinity
DosSetFileLocksL
DosSetFilePtrL = DOSCALLS.988
DosSetFileSizeL = DOSCALLS.989
DosSetThreadAffinity
Dos16SysTrace
DosVerifyPidTid