mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-05 16:12:30 +02:00
3981 lines
147 KiB
ObjectPascal
3981 lines
147 KiB
ObjectPascal
{Set tabsize to 4.}
|
|
{****************************************************************************
|
|
|
|
$Id$
|
|
|
|
DOSCALLS interface unit
|
|
FPC Pascal Runtime Library for OS/2
|
|
Copyright (c) 1999-2000 by Florian Klaempfl
|
|
Copyright (c) 1999-2000 by Daniel Mantione
|
|
|
|
The Free Pascal runtime library is distributed under the Library GNU Public
|
|
License v2. So is this unit. The Library GNU Public License requires you to
|
|
distribute the source code of this unit with any product that uses it.
|
|
Because the EMX library isn't under the LGPL, we grant you an exception to
|
|
this, and that is, when you compile a program with the Free Pascal Compiler,
|
|
you do not need to ship source code with that program, AS LONG AS YOU ARE
|
|
USING UNMODIFIED CODE! If you modify this code, you MUST change the next
|
|
line:
|
|
|
|
<This an official, unmodified Free Pascal source code file.>
|
|
|
|
Send us your modified files, we can work together if you want!
|
|
|
|
Free Pascal 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. See the
|
|
Library GNU General Public License for more details.
|
|
|
|
You should have received a copy of the Library GNU General Public License
|
|
along with Free Pascal; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
Boston, MA 02111-1307, USA.
|
|
|
|
****************************************************************************}
|
|
|
|
unit DosCalls;
|
|
|
|
{This unit was called bsedos in the original OS/2 runtime library.
|
|
Changed, because it's an interface library to DOSCALLS.DLL.
|
|
|
|
The goal was to make this unit a real Pascal unit instead of a C unit in
|
|
Pascal clothes. Not that I want to make every translated statement look
|
|
exactly like other Pascal code, but in this case, it was too crazy.
|
|
Therefore typenames, constants etc. have names like the ones in IBM's
|
|
documentation (which is C oriented), but do not match exactly. In general
|
|
constants do now use the common two letter prefix, followed by the constant
|
|
description. Type names use a capital T in front of their name, handles do
|
|
not have separate types, longints are used, and whenever possible pointers
|
|
were replaced by var parameters. All constructions like 'type LONG=longint'
|
|
have been removed. Furthermore, most of the procedures also accept strings
|
|
instead of just a PChar, thanks to that cool feature of procedure
|
|
overloading.
|
|
|
|
Daniel Mantione,
|
|
June 1997
|
|
|
|
Please, note, that all calls of the original functions from DOSCALLS.DLL must
|
|
be declared using cdecl (C calling convention)! This doesn't apply to wrapped
|
|
around functions, of course (like equivalents of some functions with string
|
|
instead of PChar).
|
|
|
|
Changelog:
|
|
|
|
People:
|
|
KOMH - KO Myung-Hun ( komh@chollian.net )
|
|
|
|
Date: Description of change: Changed by:
|
|
|
|
Type of parameter is corrected, KOMH
|
|
'word' to 'longint'.
|
|
People:
|
|
|
|
DM - Daniel Mantione
|
|
TH - Tomas Hajny (XHajT03@mbox.vol.cz on Internet)
|
|
|
|
Date: Description of change: Changed by:
|
|
|
|
- First released version 0.1. DM
|
|
98/11/21 Mostly cosmetic changes - higher TH
|
|
level of compatibility with other
|
|
OS/2 compilers, some Dutch names of
|
|
parameters changed to English ones,
|
|
better readability of identifiers,
|
|
some mistypings corrected etc.
|
|
|
|
Coding style:
|
|
|
|
It may be well possible that coding style feels a bit strange to you.
|
|
Nevertheless I friendly ask you to try to make your changes not look all
|
|
too different. To make life easier, set your IDE to use tab characters,
|
|
turn optimal fill, autoindent and backspace unindents on and set a
|
|
tabsize of 4.}
|
|
|
|
{****************************************************************************
|
|
|
|
Preprocessor definitions
|
|
|
|
****************************************************************************}
|
|
|
|
|
|
{$IFNDEF FVISION_PSTRING}
|
|
{$IFNDEF OWN_PSTRING}
|
|
{$DEFINE FVISION_PSTRING} {Get the PString type from Free Vision.}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
{***************************************************************************}
|
|
interface
|
|
{***************************************************************************}
|
|
|
|
{$IFDEF OWN_PSTRING}
|
|
uses Strings;
|
|
|
|
type PString=^string;
|
|
{$ELSE}
|
|
{$IFDEF FVISION_PSTRING}
|
|
uses Strings,Objects;
|
|
{$ELSE}
|
|
{$ERROR PString source unknown.}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
{$IFDEF FPC}
|
|
{$PACKRECORDS 1}
|
|
{$ENDIF FPC}
|
|
|
|
type TByteArray=array[0..$fff0] of byte;
|
|
PByteArray=^TByteArray;
|
|
TCharArray=array[0..$fff0] of char;
|
|
PCharArray=^TCharArray;
|
|
TWordArray=array[0..$7ff8] of word;
|
|
PWordArray=^TWordArray;
|
|
|
|
{****************************************************************************
|
|
|
|
Thread related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
type TThreadEntry=procedure(Param:pointer); cdecl;
|
|
ThreadEntry=TThreadEntry;
|
|
|
|
|
|
const dtSuspended =1; {Thread is started suspended instead of
|
|
started at once.}
|
|
dtStack_Commited =2; {Allocate all stack space at once. The
|
|
operating system normally allocates more
|
|
memory to the stack if the stack grows with
|
|
the given stacksize as limit. This has the
|
|
restriction that you cannot create a stack
|
|
frame > 4 kb. at once. If you want to do
|
|
this, or for other reasons you can allocate
|
|
the complete stack at once with this flag.}
|
|
|
|
dtWait =0; {Wait until termination.}
|
|
dtNoWait =1; {Do not wait. Return with error if not yet
|
|
terminated.}
|
|
|
|
{Create a new thread.
|
|
TID = Thread ID of new thread is returned here.
|
|
Address = Thread entry point. The new thread starts executing here.
|
|
AParam = This one is passed to the thread entry procedure.
|
|
Flags = Flags. Either dtsuspended or dt_stackcommited.
|
|
StackSize = Size of the stack of the new thread.}
|
|
function DosCreateThread(var TID:longint;Address:TThreadEntry;
|
|
AParam:pointer;Flags,StackSize:longint):longint; cdecl;
|
|
|
|
{Suspend a running thread.}
|
|
function DosSuspendThread(TID:longint):longint; cdecl;
|
|
|
|
{Resume a suspended thread.}
|
|
function DosResumeThread(TID:longint):longint; cdecl;
|
|
|
|
{Terminate a specific thread.}
|
|
function DosKillThread(TID:longint):longint; cdecl;
|
|
|
|
{Wait until a specific thread has ended.
|
|
TID = Thread to terminate. Can also be zero. In that case we
|
|
wait until the next thread terminates. Its thread ID is
|
|
returned back.
|
|
Option = Flags. Either dtWait or dtNoWait.}
|
|
function DosWaitThread(var TID:longint;Option:longint):longint; cdecl;
|
|
|
|
{All other threads in the same process are suspended until a
|
|
DosExitCritSec.}
|
|
function DosEnterCritSec:longint; cdecl;
|
|
|
|
{Resume the other threads again.}
|
|
function DosExitCritSec:longint; cdecl;
|
|
|
|
const deThread=0; {Terminate thread only.}
|
|
deProcess=1; {Terminate the whole process.}
|
|
|
|
{Terminate the thread or the program. Never returns, so it's defined as
|
|
procedure.}
|
|
procedure DosExit(Action,Result:longint); cdecl;
|
|
|
|
type PThreadInfoBlock=^TThreadInfoBlock;
|
|
PPThreadInfoBlock=^PThreadInfoBlock;
|
|
PSysThreadIB=^TSysThreadIB;
|
|
PProcessInfoBlock=^TProcessInfoBlock;
|
|
PPProcessInfoBlock=^PProcessInfoBlock;
|
|
|
|
TThreadInfoBlock=record
|
|
Exh_Chain, {Head of exeption handler chain.}
|
|
Stack, {Pointer to the thread's stack.}
|
|
StackLimit:pointer; {Pointer to the thread's stack-end.}
|
|
TIB2:PSysThreadIB; {Pointer to system specific thread info.}
|
|
Version, {Version of this datastructure.}
|
|
Ordinal:longint; {Thread ordinal number.}
|
|
end;
|
|
ThreadInfoBlock=TThreadInfoBlock;
|
|
|
|
TSysThreadIB=record
|
|
TID, {Thread ID.}
|
|
Priority, {Low byte of low word: thread priority.
|
|
High byte of low word: thread class
|
|
1 = Idle
|
|
2 = Regular
|
|
3 = Time critical
|
|
4 = Server}
|
|
Version:longint; {Version of this datastructure.}
|
|
MCCount, {Must complete count. ??? Info wanted!}
|
|
MCForceFlag:word; {Must complete force flag. Info wanted!}
|
|
end;
|
|
SysThreadIB=TSysThreadIB;
|
|
|
|
TProcessInfoBlock=record
|
|
PID, {Process ID.}
|
|
ParentPID, {Parent's process ID.}
|
|
HMTE:longint; {Module handle of executable program.
|
|
??? Info wanted!}
|
|
Cmd, {Command line options.}
|
|
Env:PByteArray; {Environment strings.}
|
|
flStatus, {1 means that the process is in exit list
|
|
processing.}
|
|
tType:longint; {Type of process:
|
|
0: Full screen protected mode.
|
|
1: DOS emulation.
|
|
2: Windowable full screen protected
|
|
mode program.
|
|
3: Presentation manager program.
|
|
4: Detached mode process.}
|
|
end;
|
|
ProcessInfoBlock=TProcessInfoBlock;
|
|
|
|
{OS/2 keeps information about the current process and the current thread
|
|
is the datastructures Tprocessinfoblock and Tthreadinfoblock. All data
|
|
can both be read and be changed. Use DosGetInfoBlocks to get their
|
|
address. The service cannot fail, so it is defined as procedure.
|
|
The second version of the call might be useful if you only want address
|
|
of one of those datastructures, since you can supply nil for the other
|
|
parameter then.}
|
|
|
|
{procedure DosGetInfoBlocks(var ATIB:PThreadInfoBlock;
|
|
var APIB:PProcessInfoBlock); cdecl;}
|
|
procedure DosGetInfoBlocks(PATIB:PPThreadInfoBlock;
|
|
PAPIB:PPProcessInfoBlock); cdecl;
|
|
|
|
{Wait a number of microseconds. Cannot fail, so it is defined as procedure.}
|
|
procedure DosSleep(MSec:longint); cdecl;
|
|
|
|
{Beep the speaker. You do not need to check for an error if you can
|
|
guarantee that the frequency is correct.}
|
|
function DosBeep(Freq,MS:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
Process handling routines.
|
|
|
|
****************************************************************************}
|
|
|
|
{You need a heavy manual if you want to know how this procedure works. Used
|
|
for writing debuggers.}
|
|
function DosDebug(DebugBuf:pointer):longint; cdecl;
|
|
|
|
const TC_exit = 0;
|
|
TC_harderror = 1;
|
|
TC_trap = 2;
|
|
TC_killprocess = 3;
|
|
TC_exception = 4;
|
|
|
|
ExLst_Add = 1;
|
|
ExLst_Remove = 2;
|
|
ExLst_Exit = 3;
|
|
|
|
type TExitProc=procedure(Reason:longint); cdecl;
|
|
|
|
{Add/remove an exitprocedure to the exit list. Also used to terminate an
|
|
exit procedure. An exit procedure will be called on exiting of the program.
|
|
|
|
OrderCode = One of the EXLST_XXXX constants.
|
|
Proc = Address of the exit procedure.
|
|
|
|
An exit procedure is called with one of the TC_XXXX constants. When it is
|
|
done it must call DosExitList with ExLst_Exit.
|
|
|
|
Exit procedures are called in random order.}
|
|
function DosExitList(OrderCode:longint;Proc:TExitProc):longint; cdecl;
|
|
|
|
const deSync = 0; {Wait until program terminates.}
|
|
deAsync = 1; {Do not wait.}
|
|
deAsyncResult = 2; {Do not wait. DosWaitChild will follow to
|
|
check if process has been terminated. If
|
|
you use this, you must use DosWaitChild,
|
|
because OS/2 will not free memory that is
|
|
allocated for the result codes if you don't.}
|
|
deTrace = 3; {Trace-able. Info Wanted!}
|
|
deBackground = 4; {Do not run as child. Run in a separate
|
|
session.}
|
|
deSuspended = 5; {Child will be loaded, but not executed.}
|
|
deAsyncResultDb = 6; {?? Info wanted.}
|
|
|
|
type TResultCodes=record
|
|
TerminateReason, {0 = Normal termionation.
|
|
1 = Critical error.
|
|
2 = Trapped. (GPE, etc.)
|
|
3 = Killed by DosKillProcess.}
|
|
ExitCode:longint; {Exit code of child.}
|
|
end;
|
|
|
|
{Execute a program.
|
|
|
|
ObjName = If a DLL cannot be found, its name will be returned here.
|
|
ObjLen = Size of your ObjName buffer.
|
|
ExecFlag = One of the deXXXX constants.
|
|
Res = See TResultcodes.
|
|
Args = Arguments. ASCIIZ strings. End of Args given by an empty
|
|
string (#0). First arg must be filename without path and
|
|
extension. nil is also allowed.
|
|
Env = Environment. ASCIIZ strings. A variable has the format
|
|
NAME=CONTENTS. End of Env given by an empty string (#0).
|
|
nil is also allowed.
|
|
FileName = Filename with full path and extension. Is not sensitive
|
|
for the PATH environment variable.}
|
|
function DosExecPgm(ObjName:PChar;ObjLen,ExecFlag:longint;
|
|
Args,Env:PByteArray;var Res:TResultCodes;
|
|
FileName:PChar):longint; cdecl;
|
|
function DosExecPgm(var ObjName:string;ExecFlag:longint;
|
|
Args,Env:PByteArray;var Res:TResultCodes;
|
|
const FileName:string):longint;
|
|
|
|
{Wait until a child process terminated. Sometimes called DosCWait.
|
|
|
|
Action = 0 = Wait until child terminates.
|
|
1 = Wait until child and all its childs terminate.
|
|
Option = Flags. Either dtWait or dtNoWait.
|
|
Res = See TResultCodes.
|
|
TermPID = Process ID that has been terminated. Usefull when
|
|
terminating a random process.
|
|
PID = Process ID of process to terminate. Use a zero to
|
|
terminate a random process.}
|
|
function DosWaitChild(Action,Option:longint;var Res:TResultCodes;
|
|
var TermPID:longint;PID:longint):longint; cdecl;
|
|
|
|
const dpProcess = 0;
|
|
dpProcessChilds = 1;
|
|
dpThread = 2;
|
|
|
|
dpSameClass = 0;
|
|
dpIdleClass = 1;
|
|
dpRegular = 2;
|
|
dpTimeCritical = 3;
|
|
|
|
{Set priority of a thread or all threads in another process.
|
|
|
|
Scope = 0 = Set for all threads of a process.
|
|
1 = Set for all threads of a process and its childs.
|
|
2 = Set for a thread of the current process.
|
|
TrClass = 0 = Do not change class.
|
|
1 = Change to idle time class.
|
|
2 = Change to regular class.
|
|
3 = Change to time-critical class.
|
|
Delta = Value to add to priority. Resulting priority must be in
|
|
the range 0..31.
|
|
PortID = Process ID when Scope=0 or 1, thread ID when Scope=2.}
|
|
function DosSetPriority(Scope,TrClass,Delta,PortID:longint):longint; cdecl;
|
|
|
|
{Terminate a process. If the process isn't a child process, it can refuse
|
|
to terminate.
|
|
|
|
Action = 0 = Terminate process and all its childs.
|
|
1 = Terminate process only.
|
|
PID = Process ID of process to terminate.}
|
|
function DosKillProcess(Action,PID:longint):longint; cdecl;
|
|
|
|
const AppTyp_NotSpec = $0000; {Apptype is unknown.}
|
|
AppTyp_NotWindowCompat = $0001; {App cannot run in a window.}
|
|
AppTyp_WindowCompat = $0002; {App can run in a window.}
|
|
AppTyp_WindowAPI = $0003; {App uses PM}
|
|
AppTyp_Bound = $0008; {App uses Family API.}
|
|
AppTyp_DLL = $0010; {File is a DLL.}
|
|
AppTyp_DOS = $0020; {App is a PC-DOS program.}
|
|
AppTyp_PhysDrv = $0040; {App is a physical device driver.}
|
|
AppTyp_VirtDrv = $0080; {App is virtual device driver.}
|
|
AppTyp_ProtDLL = $0100; {File is a protected mode DLL.}
|
|
AppTyp_WindowsReal = $0200; {M$ Winslows app, real mode.}
|
|
AppTyp_WindowsProt = $0400; {M$ Winslows app, protected mode.}
|
|
AppTyp_32bit = $4000; {App is 32 bit.}
|
|
|
|
{Get the application type of an executable file on disk.
|
|
FileName = Name of file to get type from.
|
|
Flags = Receives a bitfield using the AppTyp constants.}
|
|
function DosQueryAppType(FileName:PChar;var Flags:longint):longint; cdecl;
|
|
|
|
const diPrinter = 0; {Get number of printer (parallel) ports.}
|
|
diRS232 = 1; {Get number of serial ports.}
|
|
diFloppy = 2; {Get number of floppy drives.}
|
|
diCopro = 3; {Get number of FPU's installed (either 0 or 1).}
|
|
diSubModel = 4; {??? System submodel type?}
|
|
diModel = 5; {??? System model type?}
|
|
diAdapter = 6; {0=Monochrome display, 1=other. ??? Does OS/2
|
|
support monochrome displays?}
|
|
|
|
{Get information about attached devices.
|
|
DevInfo = Receives requested information.
|
|
Item = One of the dixxxx constants.}
|
|
function DosDevConfig(var DevInfo:byte;Item:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
File handling related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
const MaxPathLength=260;
|
|
MaxPathComponent=256;
|
|
|
|
type TFileLock=record
|
|
Offset,Range:longint;
|
|
end;
|
|
PFileLock=^TFileLock;
|
|
FileLock=TFileLock;
|
|
|
|
{Lock or unlock an area of a file. Other processes may not access that part
|
|
of the file.
|
|
|
|
Unlock = Area to unlock. (0,0) = Do not unlock.
|
|
Lock = Area to lock. (0,0) = Do not lock.
|
|
Timeout = Number of miliseconds to wait if another process has locked
|
|
the file.
|
|
Flags = Bitfield:
|
|
Bit 0: 0 = Other processes are denied access.
|
|
1 = Other processes may still read from the area.
|
|
Bit 1: 0 = Normal locking mode.
|
|
1 = Atomic mode. Refer IBM's documentation.}
|
|
function DosSetFileLocks(Handle:longint;var Unlock,Lock:TFileLock;
|
|
Timeout,Flags:longint):longint; cdecl;
|
|
|
|
{Cancel a filelock area.
|
|
|
|
Handle = File handle.
|
|
Lock = Area that is locked now.}
|
|
function DosCancelLockRequest(Handle:longint;var Lock:TFileLock):longint;
|
|
cdecl;
|
|
|
|
{Data structures for extended attributes. Reading IBM's documentation is
|
|
highly recommended before experimenting with EAs.}
|
|
|
|
const fEA_needEA=$80;
|
|
|
|
eaBinary = $fffe;
|
|
eaASCII = $fffd;
|
|
eaBitmap = $fffb;
|
|
eaMetaFile = $fffa;
|
|
eaIcon = $fff9;
|
|
eaEA = $ffee;
|
|
eaMVMT = $ffdf;
|
|
eaMVST = $ffde;
|
|
eaASN1 = $ffdd;
|
|
|
|
type TgEA=record
|
|
NameLen:byte;
|
|
Name:array[0..9999] of char;
|
|
end;
|
|
PgEA=^TgEA;
|
|
|
|
TgEAList=record
|
|
ListLen:longint;
|
|
List:array[0..9999] of TgEA;
|
|
end;
|
|
PgEAList=^TgEAList;
|
|
|
|
TfEA=record
|
|
EA,
|
|
NameLen:byte;
|
|
Value:word;
|
|
end;
|
|
PfEA=^TfEA;
|
|
|
|
TfEAList=record
|
|
Size:longint;
|
|
List:array[0..9999] of TfEA;
|
|
end;
|
|
PfEAList=^TfEAlist;
|
|
|
|
TEAOp=record
|
|
gEAList:PgEAList;
|
|
fEAList:PfEAList;
|
|
Error:longint;
|
|
end;
|
|
PEAOp=^TEAOp;
|
|
|
|
TfEA2=record
|
|
NextEntry:longint;
|
|
Flags,
|
|
NameLen:byte;
|
|
Value:word;
|
|
szName:array[0..9999] of char;
|
|
end;
|
|
PfEA2=^TfEA2;
|
|
|
|
TfEA2List=record
|
|
ListLen:longint;
|
|
List:array[0..9999] of TfEA2;
|
|
end;
|
|
PfEA2List=^TfEA2List;
|
|
|
|
TgEA2=record
|
|
NextEntry:longint;
|
|
NameLen:byte;
|
|
Name:array[0..9999] of char;
|
|
end;
|
|
PgEA2=^TgEA2;
|
|
|
|
TgEA2list=record
|
|
ListLen:longint;
|
|
List:array[0..9999] of TgEA2;
|
|
end;
|
|
PgEA2List=^TgEA2List;
|
|
|
|
TEAOp2=record
|
|
gEA2List:PgEA2List;
|
|
fEA2List:PfEA2List;
|
|
Error:longint;
|
|
end;
|
|
PEAOp2=^TEAOp2;
|
|
|
|
TEASizeBuf=record
|
|
MaxEASize:word;
|
|
MaxEAListSize:longint;
|
|
end;
|
|
PEASizeBuf=^TEASizeBuf;
|
|
|
|
|
|
{*******************End of extented attribute datastructures.***************}
|
|
|
|
{Usefull constanst for Action parameter.}
|
|
const doOpened = 1;
|
|
doCreated = 2;
|
|
doOverwritten = 3;
|
|
|
|
{Usefull constants for OpenFlags parameter.}
|
|
const doFail = 0;
|
|
doOpen = 1;
|
|
doOverwrite = 2;
|
|
(*
|
|
fixed by KO M.H. on 1999.07.04
|
|
contents : Creation flags is 10 hex not 10 dec.
|
|
*)
|
|
doCreate = 16;
|
|
|
|
{Usefull constants for openmode parameter.}
|
|
|
|
const doRead = 0;
|
|
doWrite = 1;
|
|
doReadWrite = 2;
|
|
doDenyRW = 16;
|
|
doDenyWrite = 32;
|
|
doDenyRead = 48;
|
|
doDenyNone = 64;
|
|
doNoInherit = 128;
|
|
doSequential = 256;
|
|
doRandom = 512;
|
|
doNoCache = 4096;
|
|
doFailOnErr = 8192;
|
|
doWriteThru = 16384;
|
|
doDASD = 32768;
|
|
|
|
{ Open a file.
|
|
|
|
FileName = Name of file.
|
|
Handle = Receives filehandle.
|
|
Action = Receives result of opening.
|
|
1 = Existing file opened.
|
|
2 = File did not exist. Created.
|
|
3 = File existed. Overwritten.
|
|
InitSize = Initial size of file when creating or overwriting.
|
|
Ignored when you do not. Must be zero when the file is
|
|
created or overwritten in read-only mode.
|
|
Attrib = Attributes when creating or overwriting files.
|
|
OpenFlags = Bitfield describing what to do when file exists or doesn't
|
|
exist.
|
|
OpenMode = Bitfield describing describing how to open a file.
|
|
EA = Extended attributes to give file when created. Use a nil
|
|
pointer if you don't want to give it extended attributes.
|
|
Use it only when creating or overwriting file. Use nil
|
|
when not. Only the FEA list will be used.
|
|
|
|
The bits in the openflags parameter have the following meanings:
|
|
|
|
Bit 0-3: Action to take when file exists. 0000 = Return with error.
|
|
0001 = Open it.
|
|
0010 = Overwrite it.
|
|
Bit 4-7: Action to take when file does not 0000 = Return with error.
|
|
exist. 0001 = Create it.
|
|
|
|
The bits in the filemode parameter have the following meanings:
|
|
|
|
Bit 0-2: Access mode: 000 = Read-only
|
|
001 = Write-only
|
|
010 = Read/Write
|
|
Bit 3: Reserved.
|
|
Bit 4-6: Sharing mode. 001 = Deny all
|
|
010 = Deny write
|
|
011 = Deny read
|
|
100 = Deny none
|
|
Bit 7: Inheritance. 0 = Handle will be inherited by childs.
|
|
1 = Handle will not be inherited.
|
|
Bit 8-11: Reserved.
|
|
Bit 12: Cache flag. 0 = Use caching.
|
|
1 = Disable both read and write caching.
|
|
Bit 13: Error handling. 0 = Use critical error handler.
|
|
1 = Return just an error code.
|
|
Bit 14: Write cache flag. 0 = Write operations may be cached.
|
|
1 = Write operations must be executed
|
|
before write operation functions return.
|
|
Bit 15: DASD flag. 0 = Open a file or device.
|
|
1 = Open a drive as file.
|
|
|
|
When the DASD flag is set, the whole drive is read as a single file. The
|
|
file starts with 512 bytes of bootsector, then 512 bytes of the second sector etc.
|
|
The filename must consist of the driveletter followed by a semicolon.}
|
|
function DosOpen(FileName:PChar;var Handle,Action:longint;
|
|
InitSize:longint;Attrib,OpenFlags,FileMode:longint;
|
|
EA:PEAOp2):longint; cdecl;
|
|
{This variant of DosOpen always creates or overwrites a file.}
|
|
function DosCreate(FileName:PChar;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
{This variant of DosOpen always opens an existing file.}
|
|
function DosOpen(FileName:PChar;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
{There are also string variants.}
|
|
function DosOpen(const FileName:string;var Handle,Action:longint;
|
|
InitSize,Attrib,OpenFlags,OpenMode:longint;
|
|
ea:PEAOp2):longint;
|
|
function DosCreate(const FileName:string;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
function DosOpen(const FileName:string;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
|
|
|
|
{Close a file.
|
|
Cannot fail if handle does exist.}
|
|
function DosClose(Handle:longint):longint; cdecl;
|
|
|
|
{Read from a file or other type of handle.
|
|
|
|
Handle = File handle.
|
|
Buffer = The read data is stored here.
|
|
Count = Number of bytes to read.
|
|
ActCount = Number of bytes actually read.}
|
|
function DosRead(Handle:longint;var Buffer;Count:longint;
|
|
var ActCount:longint):longint; cdecl;
|
|
|
|
{Write to a file or other type of handle.
|
|
|
|
Handle = File handle.
|
|
Buffer = The data to be written.
|
|
Count = Number of bytes to write.
|
|
ActCount = Number of bytes actually written.}
|
|
function DosWrite(Handle:longint;var Buffer;Count:longint;
|
|
var ActCount:longint):longint; cdecl;
|
|
|
|
const dsZeroBased=0; {Set filepointer from begin of file.}
|
|
dsRelative=1; {Set filepointer relative to the current one.}
|
|
dsEndBased=2; {Set filepointer from end of file.}
|
|
|
|
{Change the filepointer of a file.}
|
|
function DosSetFilePtr(Handle:Longint;Pos,Method:longint;
|
|
var PosActual:longint):Longint; cdecl;
|
|
{This variant seeks always from begin of file and does not return the
|
|
actual position.}
|
|
function DosSetFilePtr(Handle:longint;Pos:longint):longint; cdecl;
|
|
{This variant returns the current filepointer.}
|
|
function DosGetFilePtr(Handle:longint;var PosActual:longint):longint;
|
|
|
|
{Use DosQueryFileInfo or DosQueryPathInfo to get the size of a file.}
|
|
|
|
{Change the size of a file.}
|
|
function DosSetFileSize(Handle,Size:longint):longint; cdecl;
|
|
|
|
{Flush update the changes to a file to disk.}
|
|
function DosResetBuffer(Handle:longint):longint; cdecl;
|
|
|
|
{Duplicate or redirect a handle.
|
|
To duplicate a handle: Fill handle with source handle and duplicate with -1.
|
|
Copy of handle will be returned in duplicate.
|
|
To redirect a handle: Fill handle with handle to which the handle to
|
|
redirect will be redirected. The handle that will be
|
|
redirected should be placed in duplicate.}
|
|
function DosDupHandle(Handle:longint;var Duplicate:longint):longint; cdecl;
|
|
|
|
{Return information about a specific handle. See DosOpen for a
|
|
description of FileMode.}
|
|
function DosQueryFHState(Handle:longint;var FileMode:longint):longint; cdecl;
|
|
|
|
{Set information about a specific handle. See DosOpen for a description
|
|
of FileMode.}
|
|
function DosSetFHState(Handle,FileMode:longint):longint; cdecl;
|
|
|
|
{Usefull constants for the handle type.}
|
|
const dhFile = 0;
|
|
dhDevice = 1;
|
|
dhPipe = 2;
|
|
dhNetwork = 8192;
|
|
|
|
{Determine if a handle belongs to a file, a device or a pipe.
|
|
Handle = Handle tp query info about.
|
|
HandType = Bits 0-1: 00 = File
|
|
01 = Device
|
|
02 = Pipe
|
|
Bit 15: 0 = Local.
|
|
1 = On network.}
|
|
function DosQueryHType(Handle:longint;var HandType:longint;
|
|
var Attr:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
File management related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
|
|
{Edit a filename using wildcard.
|
|
|
|
Example editing CONFIG.SYS with *.BAK becomes CONFIG.BAK.
|
|
Usefull when parsing commands like 'copy config.sys *.bak'.
|
|
All filename characters are casemapped.'
|
|
|
|
MetaLevel = 0 Use modern semantics
|
|
MetaLevel = 1 Use OS/2 1.2 semantics
|
|
Source = string to edit
|
|
Edit = editstring
|
|
Target = destination buffer
|
|
TargetLen = size of the destination buffer}
|
|
function DosEditName(MetaLevel:longint;Source,Edit:PChar;
|
|
Target:PChar;TargetLen:longint):longint; cdecl;
|
|
function DosEditName(MetaLevel:longint;const Source,Edit:string;
|
|
var Target:string):longint;
|
|
|
|
{Move or rename a file.
|
|
OldFile = old name of file
|
|
NewFile = new name of file}
|
|
function DosMove(OldFile,NewFile:PChar):longint; cdecl;
|
|
function DosMove(const OldFile,NewFile:string):longint;
|
|
|
|
|
|
const dcExisting=1; {Overwrite existing files.}
|
|
dcAppend=2; {Append to existing file.}
|
|
dcFailAs=4; {?? Info wanted!}
|
|
|
|
{Copy a file.
|
|
OldFile = source file
|
|
NewFile = destination file}
|
|
function DosCopy(OldFile,NewFile:PChar;Option:longint):longint; cdecl;
|
|
function DosCopy(const OldFile,NewFile:string;Option:longint):longint;
|
|
|
|
{Delete a file from disk.}
|
|
function DosDelete(FileName:PChar):longint; cdecl;
|
|
function DosDelete(const FileName:string):longint;
|
|
|
|
{Destroy a file on disk. DosForceDelete makes sure that the file cannot
|
|
be unerased anymore.}
|
|
function DosForceDelete(FileName:PChar):longint; cdecl;
|
|
function DosForceDelete(const FileName:string):longint;
|
|
|
|
{Create a new directory.
|
|
|
|
Name = Name of directory to create.
|
|
EA = Extented attributes to give the directory. Use nil if you
|
|
do not want do give it extented attributes. Only the FEA
|
|
list is used.}
|
|
function DosCreateDir(Name:PChar;EA:PEAOp2):longint; cdecl;
|
|
function DosCreateDir(const Name:string;EA:PEAOp2):longint;
|
|
{Variants without the EA parameter (nil is used).}
|
|
function DosCreateDir(Name:PChar):longint;
|
|
function DosCreateDir(const Name:string):longint;
|
|
|
|
{Remove a directory.}
|
|
function DosDeleteDir(Name:PChar):longint; cdecl;
|
|
function DosDeleteDir(const Name:string):longint;
|
|
|
|
{Set the current drive. Cannot fail if the driveletter is correct.}
|
|
function DosSetDefaultDisk(DiskNum:longint):longint; cdecl;
|
|
|
|
{Get the current drive. Because it cannot fail, it is declared as procedure.}
|
|
procedure DosQueryCurrentDisk(var DiskNum:longint;var Logical:longint); cdecl;
|
|
|
|
{Set the current directory.}
|
|
function DosSetCurrentDir(Name:PChar):longint; cdecl;
|
|
function DosSetCurrentDir(const Name:string):longint;
|
|
|
|
{Get the current directory.}
|
|
function DosQueryCurrentDir(DiskNum:longint;var Buffer;
|
|
var BufLen:longint):longint; cdecl;
|
|
function DosQueryCurrentDir(DiskNum:longint;var Buffer:string):longint;
|
|
|
|
{Send/receive information to a device.
|
|
|
|
Handle = A file handle to a device, instead of a file.
|
|
Category = The category of functions the function is in.
|
|
Func = Function to call.
|
|
Params = Parameters for the function.
|
|
ParamLen = Size of the params buffer.
|
|
ParamSize = Size of the parametrs to send to the device
|
|
Receives size of the returned parameters.
|
|
Data = Data to send to device.
|
|
DataLen = Size of your data buffer.
|
|
DataSize = Size of the data to send to device.
|
|
Receives size of the data returned by the device.}
|
|
function DosDevIOCtl(Handle,Category,Func:longint;var Params;
|
|
ParamLen:longint;var ParamSize:longint;
|
|
var Data;var DataLen:longint;var DataSize:
|
|
longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
File searching related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
const faReadOnly = 1;
|
|
faHidden = 2;
|
|
faSystem = 4;
|
|
faReserve = 8;
|
|
faDirectory = 16;
|
|
faArchive = 32;
|
|
|
|
ilStandard = 1;
|
|
ilQueryEAsize = 2;
|
|
ilQueryEAs = 3;
|
|
ilQueryFullName = 5;
|
|
|
|
{Format of date records:
|
|
|
|
Bit 0..4: day
|
|
Bit 5..8: month
|
|
Bit 9..15: year minus 1980
|
|
|
|
Format of time records:
|
|
|
|
Bit 0..4: seconds divided by 2
|
|
Bit 5..10: minutes
|
|
Bit 11..15: hours}
|
|
|
|
type
|
|
(*
|
|
added by KO Myung-Hun on 1999.07.04
|
|
for compatible with previous source code
|
|
*)
|
|
TFileStatus = object
|
|
end;
|
|
PFileStatus = ^TFileStatus;
|
|
|
|
(*
|
|
modified TFileStatus to TFileStatus0 by KO M.H. on 1999.07.04
|
|
because TFileStatus3 included a new field, NextEntryOffset and
|
|
new TFileStatus3 needed compatibility with previous source code.
|
|
*)
|
|
TFileStatus0 = object( TFileStatus )
|
|
DateCreation, {Date of file creation.}
|
|
TimeCreation, {Time of file creation.}
|
|
DateLastAccess, {Date of last access to file.}
|
|
TimeLastAccess, {Time of last access to file.}
|
|
DateLastWrite, {Date of last modification of file.}
|
|
TimeLastWrite:word; {Time of last modification of file.}
|
|
FileSize, {Size of file.}
|
|
FileAlloc:longint; {Amount of space the file really
|
|
occupies on disk.}
|
|
end;
|
|
PFileStatus0=^TFileStatus0;
|
|
|
|
TFileStatus1=object(TFileStatus0)
|
|
AttrFile:word; {Attributes of file.}
|
|
end;
|
|
PFileStatus1=^TFileStatus1;
|
|
|
|
TFileStatus2=object(TFileStatus0)
|
|
AttrFile:word;
|
|
cbList:longint;
|
|
end;
|
|
PFileStatus2=^TFileStatus2;
|
|
|
|
(*
|
|
fixed by KO Myung-Hun on 1999.07.04
|
|
|
|
contents : NextEntryOffset field is not included
|
|
*)
|
|
TFileStatus3 = object( TFileStatus )
|
|
NextEntryOffset : Longint; {Offset of next entry}
|
|
DateCreation, {Date of file creation.}
|
|
TimeCreation, {Time of file creation.}
|
|
DateLastAccess, {Date of last access to file.}
|
|
TimeLastAccess, {Time of last access to file.}
|
|
DateLastWrite, {Date of last modification of file.}
|
|
TimeLastWrite:word; {Time of last modification of file.}
|
|
FileSize, {Size of file.}
|
|
FileAlloc:longint; {Amount of space the file really
|
|
occupies on disk.}
|
|
AttrFile:longint; {Attributes of file.}
|
|
end;
|
|
PFileStatus3=^TFileStatus3;
|
|
|
|
TFileStatus4=object(TFileStatus0)
|
|
AttrFile:longint;
|
|
cbList:longint;
|
|
end;
|
|
PFileStatus4=^TFileStatus4;
|
|
|
|
TFileFindBuf1=object(TFileStatus1)
|
|
Name:string; {Also possible to use as ASCIIZ.
|
|
The byte following the last string
|
|
character is always zero.}
|
|
end;
|
|
PFileFindBuf1=^TFileFindBuf1;
|
|
|
|
|
|
TFileFindBuf2=object(TFileStatus2)
|
|
Name:string; {Also possible to use as ASCIIZ.
|
|
The byte following the last string
|
|
character is always zero.}
|
|
end;
|
|
PFileFindBuf2=^TFileFindBuf2;
|
|
|
|
TFileFindBuf3=object(TFileStatus3)
|
|
Name:string; {Also possible to use as ASCIIZ.
|
|
The byte following the last string
|
|
character is always zero.}
|
|
end;
|
|
PFileFindBuf3=^TFileFindBuf3;
|
|
|
|
TFileFindBuf4=object(TFileStatus4)
|
|
Name:string; {Also possible to use as ASCIIZ.
|
|
The byte following the last string
|
|
character is always zero.}
|
|
end;
|
|
PFileFindBuf4=^TFileFindBuf4;
|
|
|
|
{Find first file matching a filemask. In contradiction to DOS, a search
|
|
handle is returned which should be closed with FindClose when done.
|
|
FileMask = Filemask to search.
|
|
Handle = Search handle will be returned here, fill with -1 before
|
|
call.
|
|
Attrib = File attributes to search for.
|
|
AFileStatus = Return buffer.
|
|
FileStatusLen = Size of return buffer.
|
|
Count = Fill with maximum number of files to search for, the
|
|
actual number of matching files found is returned here.
|
|
InfoLevel = One of the ilXXXX constants. Consult IBM documentation
|
|
for exact meaning. For normal use: Use ilStandard and
|
|
use PFileFindBuf3 for AFileStatus.}
|
|
function DosFindFirst(FileMask:PChar;var Handle:longint;Attrib:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen:longint;
|
|
var Count:longint;InfoLevel:longint):longint; cdecl;
|
|
function DosFindFirst(const FileMask:string;var Handle:longint;
|
|
Attrib:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint;var Count:longint;
|
|
InfoLevel:longint):longint;
|
|
|
|
{Find next matching file.}
|
|
function DosFindNext(Handle:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint;var Count:longint):longint; cdecl;
|
|
|
|
{Close a search handle. Cannot fail if handle does exist.}
|
|
function DosFindClose(Handle:longint):longint; cdecl;
|
|
|
|
{Get info about a file.
|
|
|
|
Handle = Handle of file.
|
|
InfoLevel = One of the ilXXXX constants. Consult IBM documentation
|
|
for exect meaning. For normal use: Use ilStandard and
|
|
PFileFindBuf3 for AFileStatus.
|
|
AFileStatus = An info return buffer.
|
|
FileStatusLen = Size of info buffer.}
|
|
function DosQueryFileInfo(Handle,InfoLevel:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint):longint; cdecl;
|
|
|
|
{Set info about a file. File must be opened with write permissions. See
|
|
above fo the parameters.}
|
|
function DosSetFileInfo(Handle,InfoLevel:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint):longint; cdecl;
|
|
|
|
{Return info about a file. In contradiction to the above functions, the
|
|
file does not have to be open.}
|
|
function DosQueryPathInfo(FileName:PChar;InfoLevel:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen:longint):longint; cdecl;
|
|
function DosQueryPathInfo(const FileName:string;InfoLevel:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen:longint):longint;
|
|
|
|
{Set information about a file.}
|
|
function DosSetPathInfo(FileName:PChar;InfoLevel:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen,
|
|
Options:longint):longint; cdecl;
|
|
|
|
{Get info about the names and lengths of the EA's for a file or directory.
|
|
|
|
RefType = 0 = AFile is a pointer to a file-handle.
|
|
1 = AFile is a pointer to an ASCIIZ string.
|
|
AFile = Pointer file's name or handle.
|
|
Entry = Number of EA to query inof about. (1 = first EA).
|
|
Buf = Buffer where requested info is returned. For InfoLevel
|
|
1, the buffer is a TfEA2 datastructure.
|
|
BufLen = Size of buf in bytes.
|
|
Count = Number of EA's to return info for. Number of EA's that
|
|
actually fitted in buf is returned here.
|
|
InfoLevel = Level of information to return. Only level 1 is
|
|
currently allowed.}
|
|
|
|
function DosEnumAttribute(RefType:longint;AFile:pointer;
|
|
Entry:longint;var Buf;BufSize:longint;
|
|
var Count:longint;InfoLevel:longint):longint; cdecl;
|
|
function DosEnumAttribute(Handle,Entry:longint;var Buf;BufSize:longint;
|
|
var Count:longint;InfoLevel:longint):longint;
|
|
function DosEnumAttribute(const FileName:string;
|
|
Entry:longint;var Buf;BufSize:longint;
|
|
var Count:longint;InfoLevel:longint):longint;
|
|
|
|
{Get an environment variable.
|
|
Name = Name of environment variable to get.
|
|
Value = Receives pointer to environment string.}
|
|
function DosScanEnv(Name:PChar;var Value:PChar):longint; cdecl;
|
|
{There is, of course a string variant.}
|
|
function DosScanEnv(const Name:string;var Value:string):longint;
|
|
|
|
const dsPathOnly = 0; {Do not search current dir. (Unless it is
|
|
in the directory list.)}
|
|
dsCurrentDir = 1; {Search in the current direcotry and in the
|
|
directory list.}
|
|
dsEnvironment = 2; {The dirlist parameter is not a directory
|
|
list, but an environment variable
|
|
containing one.}
|
|
dsIgnoreNetErrs = 4; {Ignore network errors when searching.}
|
|
|
|
{Search for a file in a given number of directories.
|
|
Flags = A combination of the dsXXXX constants.
|
|
DirList = Directory list or environment variable containing list
|
|
to search in.
|
|
FileName = Filename to search for. May contain wildcards.
|
|
FullName = Receives filename found, including path.
|
|
FullLen = Length of your fullname buffer.}
|
|
function DosSearchPath(Flag:longint;DirList,FileName:PChar;
|
|
FullName:PChar;FullLen:longint):longint; cdecl;
|
|
function DosSearchPath(Flag:longint;const DirList,FileName:string;
|
|
var FullName:string):longint;
|
|
|
|
{****************************************************************************
|
|
|
|
File system related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
type TFSInfo=record
|
|
case word of
|
|
1:
|
|
(File_Sys_ID,
|
|
Sectors_Per_Cluster,
|
|
Total_Clusters,
|
|
Free_Clusters:longint;
|
|
Bytes_Per_Sector:word);
|
|
2: {For date/time description,
|
|
see file searching realted
|
|
routines.}
|
|
(Label_Date, {Date when volumelabel created.}
|
|
Label_Time:word; {Time when volumelabel created.}
|
|
VolumeLabel:string); {Volume label. Can also be used
|
|
as ASCIIZ, because the byte
|
|
following the last character of
|
|
the string is always zero.}
|
|
end;
|
|
PFSInfo=^TFSInfo;
|
|
|
|
TAttachData=record
|
|
case integer of {Flag in [0,1,2].}
|
|
0,1: {Flag = 0.}
|
|
(Count:word;
|
|
Data:TCharArray);
|
|
2: {Flag = 2.}
|
|
(PipeHandle:longint;
|
|
{Handle of named pipe opened by spooler.}
|
|
SpoolName:string);
|
|
{Name of spooler object. Can also be used
|
|
as ASCIIZ, because the bute following
|
|
the last character is always zero.}
|
|
end;
|
|
PAttachData=^TAttachData;
|
|
|
|
TFSQBuffer2=record
|
|
_Type:word;
|
|
NameLen:word;
|
|
FSDNameLen:word;
|
|
FSADataLen:word;
|
|
Name:char;
|
|
Nul1:byte;
|
|
FSDName:char;
|
|
Nul2:byte;
|
|
FSAData:char;
|
|
Nul3:byte;
|
|
end;
|
|
PFSQBuffer2=^TFSQBuffer2;
|
|
|
|
const fsAttach = 0; {Attach a drive.}
|
|
fsDetach = 1; {Detach a drive.}
|
|
fsSpoolAttach = 2; {Attach a spool device.}
|
|
fsSpoolDetach = 3; {Detach a spool device.}
|
|
|
|
{IBM DOCS: "DosFSAttach attaches or detaches a drive to or from a remote file
|
|
system driver (FSD), or a pseudocharacter device name to or from a local or
|
|
remote FSD."
|
|
|
|
DevName = When flag is 0 or 1, the name of a drive or a pseudo-
|
|
character device. When using a drivename use the drive-
|
|
letter followed by a colon.
|
|
When flag is 2 or 3, the name of a spooled device.
|
|
FileSystem = Name of the driver that should be attached or detached
|
|
to DevName. Use nil when flag is 2 or 3.
|
|
Data = Should contain a number of ASCIIZ strings that will
|
|
be passed to the filesystem driver when flag is 0 or 1.
|
|
Should contain de pipehandle and spoolname when flag is
|
|
2. Should be nil when flag is 3.
|
|
DataLen = Number of bytes in data parameter.
|
|
Flag = One of the dsXXXX constants. See above}
|
|
function DosFSAttach(DevName,FileSystem:PChar;var Data:TAttachData;
|
|
DataLen,Flag:longint):longint; cdecl;
|
|
function DosFSAttach(const DevName,FileSystem:string;var Data:TAttachData;
|
|
DataLen,Flag:longint):longint;
|
|
|
|
{IBMDOCS: "DosQueryFSAttach obtains information about an attached file system
|
|
(local or remote), or about a character device or pseudocharacter device
|
|
attached to the file system."
|
|
|
|
DevName = Name info drive or pseudo character device to query
|
|
info about. Ignored for InfoLevels 2 and 3.
|
|
Ordinal = Index into list of character/pseudo-character
|
|
devices. Starts at 1. Ignored for infolevel 1.
|
|
InfoLevel = 1 = Return information about a drive or device named
|
|
by DevName.
|
|
2 = Return information about a (pseudo) charachter
|
|
device numbered by Ordinal.
|
|
3 = Return information about a drive numbered by
|
|
Ordinal.
|
|
Buffer = Will be filled with infomation.
|
|
BufLen = Size of your buffer in bytes. Number of bytes filled
|
|
in your buffer is returned here.}
|
|
function DosQueryFSAttach(DevName:PChar;Ordinal,InfoLevel:longint;
|
|
var Buffer:TFSQBuffer2;var BufLen:longint):longint; cdecl;
|
|
function DosQueryFSAttach(const DevName:string;Ordinal,InfoLevel:longint;
|
|
var Buffer:TFSQBuffer2;var BufLen:longint):longint;
|
|
|
|
const FSCtl_Handle=1;
|
|
FSCtl_PathName=2;
|
|
FSCtl_FSDName=3;
|
|
FSCtl_Error_Info=1;
|
|
FSCtl_Max_EASize=2;
|
|
|
|
{IBMDOCS: "DosFSCtl provides an extended standard interface between an
|
|
application and a file-system driver (FSD).
|
|
|
|
Consult IBM documentation about this function..}
|
|
function DosFSCtl(Data:pointer;DataLen:longint;var ResDataLen:longint;
|
|
Parms:pointer;ParmsLen:longint;var ResParmsLen:longint;
|
|
_Function:longint;Route:PChar;
|
|
Handle,Method:longint):longint; cdecl;
|
|
function DosFSCtl(Data:pointer;DataLen:longint;var ResDataLen:longint;
|
|
Parms:pointer;ParmsLen:longint;var ResParmsLen:longint;
|
|
_Function:longint;const Route:string;
|
|
Handle,Method:longint):longint;
|
|
|
|
{Get information about a drive.
|
|
InfoLevels:
|
|
1 Get total/free space etc.
|
|
2 Get volumelabel.}
|
|
function DosQueryFSInfo(DiskNum,InfoLevel:longint;var Buffer:TFSInfo;
|
|
BufLen:longint):longint; cdecl;
|
|
|
|
{Set information about a drive.}
|
|
function DosSetFSInfo(DiskNum,InfoLevel:longint;var Buffer:TFSinfo;
|
|
BufLen:longint):longint; cdecl;
|
|
|
|
{Check if verify mode is enabled.}
|
|
function DosQueryVerify(var Enabled:longint):longint; cdecl;
|
|
|
|
{Turn the verify mode on or off.}
|
|
function DosSetVerify(Enable:longint):longint; cdecl;
|
|
|
|
{Change the number of filehandles our program can open. (Default=50). It
|
|
won't hurt if there are files open when you are calling this.}
|
|
function DosSetMaxFH(Count:longint):longint; cdecl;
|
|
|
|
{Ask for more filehandles (or dump filehandles). It won't hurt if there are
|
|
files open when you are calling this.
|
|
ReqCount = Number of filehandles to ask for. (Negative to dump them.)
|
|
CurMaxFH = Receives the total number of filehandles your program has
|
|
access to.}
|
|
function DosSetRelMaxFH(var ReqCount,CurMaxFH:longint):longint; cdecl;
|
|
|
|
const dsFull=0; {IBM DOCS: "Perform full system shutdown and
|
|
file-system lock."}
|
|
dsQuiescient=1; {IBM DOCS: "Perform buffer and cache flushing to
|
|
make system quiescent."}
|
|
|
|
{Prepare the system for shutdown.}
|
|
function DosShutdown(Flags:longint):longint; cdecl;
|
|
|
|
|
|
{Usefull constants fo DosQuerySysInfo.}
|
|
const svMaxPathLength = 1; {Maximum length of a pathname.}
|
|
svMaxTextSessions = 2; {Maximum number of text sessions.}
|
|
svMaxPMSessions = 3; {Maximum number of PM sessions.}
|
|
svMaxVDMSessions = 4; {Maximum number of DOS sessions.}
|
|
svBootDrive = 5; {Get the boot drive. (A=1, B=2 etc.)}
|
|
svDynPriVariation = 6;
|
|
svMaxWait = 7;
|
|
svMinSlice = 8;
|
|
svMaxSlice = 9;
|
|
svPageSize = 10; {Size of a page. (Always 4096 bytes.)}
|
|
svMajorVersion = 11; {Major version number of kernel:
|
|
10 for OS/2 1.0 and 1.1,
|
|
20 for OS/2 2.0 .. OS/2 4.0.}
|
|
svMinorVersion = 12; {Minor version of kernel:
|
|
OS/2 2.0: 00, 2.1: 10, 2.11: 11,
|
|
3.0: 30, 4.0: 40.}
|
|
svRevision = 13; {Revision of kernel. Until now all
|
|
OS/2 versions return 0.}
|
|
svMsCount = 14; {Uptime in milliseconds.}
|
|
svTimeLow = 15; {System time in seconds since
|
|
1 January 1970 0:00:00, low dword.}
|
|
svTimeHigh = 16; {System time in seconds since
|
|
1 January 1970 0:00:00, high dword.}
|
|
svPhysMem = 17; {Amount in bytes of physical memory
|
|
in system.}
|
|
svResMem = 18; {Amount in bytes of resident memory
|
|
in system.}
|
|
svAvailMem = 19; {Amount in bytes of available
|
|
memory.}
|
|
svPrMem = 20; {Maximum amount of memory the current
|
|
process can request for its
|
|
private use.}
|
|
svShMem = 21; {Maximum amount of memory the current
|
|
process can request for shared
|
|
purposes.}
|
|
svTimerInterval = 22; {Timer interval in tenths of a
|
|
millisecond.}
|
|
svMaxCompLength = 23; {Maxmimum length of a component in a
|
|
pathname.}
|
|
svForegroundSession = 24; {Returns the session ID of the fore-
|
|
ground session. The presentation
|
|
manager has ID 1.}
|
|
svForegroundProcess = 25; {Returns the process ID of the
|
|
current foreground process.}
|
|
|
|
{Get one or more system parameters.
|
|
First = First variable to get.
|
|
Last = Last variable to get.
|
|
Buf = Receives variables.
|
|
BufSize - Size of the buffer/}
|
|
function DosQuerySysInfo(First,Last:longint;var Buf;BufSize:longint):longint;
|
|
cdecl;
|
|
|
|
{Return information about a partitionable disk.}
|
|
function DosPhysicalDisk(Func:longint;Buf:pointer;BufSize:longint;
|
|
Params:pointer;ParamSize:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
Memory allocation related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
const 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;
|
|
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;
|
|
|
|
{Get some memory.
|
|
P = Pointer to memory will be returned here.
|
|
Size = Number of bytes to get. The size is rounded up to a multiple
|
|
of 4096. This is probably not the case on non-intel 386
|
|
versions of OS/2.
|
|
Flags = One or more of the mfXXXX constants.}
|
|
function DosAllocMem(var P:pointer;Size,Flag:longint):longint; cdecl;
|
|
|
|
{Free a memory block.}
|
|
function DosFreeMem(P:pointer):longint; cdecl;
|
|
|
|
{Set settings for a block of memory.
|
|
P = Pointer to the memory. Doesn't need to be the start of the
|
|
memory block allocated with DosAllocMem, but must be a multiple
|
|
of 4096.
|
|
Size = Number of bytes to change settings for. Is rounded up to a
|
|
multile of 4096.
|
|
Flags = New flags for the memory.}
|
|
function DosSetMem(P:pointer;Size,Flag:longint):longint; cdecl;
|
|
|
|
{Give another process access to a shared memory block.
|
|
|
|
P = Pointer to the shared memory object.
|
|
PID = Process of destination process.
|
|
Flag = Permissions the the destination process gets.}
|
|
function DosGiveSharedMem(P:pointer;PID,Flag:longint):longint; cdecl;
|
|
|
|
{Get access to a shared memory object.
|
|
|
|
P = Pointer to shared memory object.
|
|
Flag = Permissions to ask.}
|
|
function DosGetSharedMem(P:pointer;Flag:longint):longint; cdecl;
|
|
|
|
{Get access to a shared memory object that has a name.
|
|
|
|
P = Pointer to shared memory object.
|
|
Name = Name of the memory object. (Starting with '\SHAREMEM\'.
|
|
Flag = Permissions to ask.}
|
|
function DosGetNamedSharedMem(var P:pointer;Name:PChar;Flag:longint):longint;
|
|
cdecl;
|
|
function DosGetNamedSharedMem(var P:pointer;const Name:string;
|
|
Flag:longint):longint;
|
|
|
|
{Allocate memory so that it can later be shared with another program.
|
|
P = Reveives pointer to memory.
|
|
Name = Optional: name to give memory. Must start with '\SHAREMEM\'.
|
|
Use nil for the PChar or '' for the string variant for no name.
|
|
Size = Number of bytes to allocate.}
|
|
function DosAllocSharedMem(var P:pointer;Name:PChar;Size,Flag:longint):longint;
|
|
cdecl;
|
|
function DosAllocSharedMem(var P:pointer;const Name:string;Size,
|
|
Flag:longint):longint;
|
|
|
|
{Get the size and flags of a block of memory.
|
|
|
|
P = Pointer to the block of memory.
|
|
Size = Receives block size.
|
|
Flag = Receives the flags.}
|
|
function DosQueryMem(P:pointer;var Size,Flag:longint):longint; cdecl;
|
|
|
|
{Allocate a block of memory in a heap.
|
|
Base = Pointer to the start of the heap.
|
|
P = Receives pointer to the memory bock.
|
|
Size = Number of bytes to allocate.}
|
|
function DosSubAllocMem(Base:pointer;var P:pointer;Size:longint):longint;
|
|
cdecl;
|
|
|
|
{Free a block of memory in a heap.
|
|
Base = Pointer to the start of the heap.
|
|
P = Pointer to memory block to free.
|
|
Size = Number of bytes to free.}
|
|
function DosSubFreeMem(Base,P:pointer;Size:longint):longint; cdecl;
|
|
|
|
{Turn a block of memory into a heap.
|
|
|
|
Base = Pointer to memory block to turn into a heap.
|
|
Flag = One or more of the mfSub_XXXX flags.
|
|
Size = Size of the requested heap.}
|
|
function DosSubSetMem(Base:pointer;Flag,Size:longint):longint; cdecl;
|
|
|
|
{Destroy a heap. (Memory remains allocated).
|
|
|
|
Base = Pointer to the heap to destroy.}
|
|
function DosSubUnsetMem(Base:pointer):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
Semaphore related routines
|
|
|
|
****************************************************************************}
|
|
|
|
const smShared = $0001; {Semaphore is shared.}
|
|
smMWWaitAny = $0002; {MuxWait only: Wait until a semaphore
|
|
is cleared.}
|
|
smMWWaitAll = $0004; {MuxWait only: Wait until all semaphores
|
|
are cleared.}
|
|
|
|
type PSemRecord=^TSemRecord;
|
|
TSemRecord=record
|
|
Semaphore, {Handle of semaphore to link.}
|
|
User:longint;
|
|
end;
|
|
|
|
PSemArray=^TSemArray;
|
|
TSemArray=array[0..$ffff] of TSemRecord;
|
|
|
|
{Create an event semaphore.
|
|
Name = Optional: Name of semaphore to create. Must start with '\SEM32\.
|
|
Use nil for PChar or '' for string variant for noname. A
|
|
unnamed semaphore is not shared unless the sm_Shared flag is
|
|
set.
|
|
Handle = Receives handle of semaphore.
|
|
Attr = One or more of the smXXXX constants.
|
|
State = Initial state: 0 = Reset (false), 1 = Posted (true).}
|
|
function DosCreateEventSem(Name:PChar;var Handle:longint;
|
|
Attr,State:longint):longint; cdecl;
|
|
function DosCreateEventSem(const Name:string;var Handle:longint;
|
|
Attr,State:longint):longint;
|
|
|
|
{Open a semaphore created by another process or thread.
|
|
|
|
Name = Name of semaphore.
|
|
Handle = Receives handle of semaphore.}
|
|
function DosOpenEventSem(Name:PChar;var Handle:longint):longint; cdecl;
|
|
function DosOpenEventSem(const Name:string;var Handle:longint):longint;
|
|
|
|
{Close an event semaphore.
|
|
Handle = Handle of a semaphore to close.}
|
|
function DosCloseEventSem(Handle:longint):longint; cdecl;
|
|
|
|
{Reset an event semaphore: *** probeer *** operation.
|
|
Handle = Handle of semaphore.
|
|
PostCount = Number of times DosPostEventSem has been called since last
|
|
reset.
|
|
|
|
Note: Returns errorcode 300 if semaphore is already reset.}
|
|
function DosResetEventSem(Handle:longint;var PostCount:longint):longint; cdecl;
|
|
|
|
{Post an event semaphore: *** verhoog *** operation.
|
|
Handle = Handle of semaphore.
|
|
|
|
Note: Returns errorcode 299 if semaphore is already posted.}
|
|
function DosPostEventSem(Handle:longint):longint; cdecl;
|
|
|
|
{Wait until an event semaphore is posted (wait until *** verhoog *** operation).
|
|
Handle = Handle of semaphore.
|
|
Timeout = Return with errorcode if timeout milliseconds have past and the
|
|
semaphore is still reset. To return immediately use 0,
|
|
to wait forever use -1.}
|
|
function DosWaitEventSem(Handle,Timeout:longint):longint; cdecl;
|
|
|
|
{Check if an event semaphore is posted (if a *** verhoog *** operation has been done).
|
|
Handle = Handle of semaphore.
|
|
Posted = Receives number of times DosPostEventSem was called since
|
|
the last reset.}
|
|
function DosQueryEventSem(Handle:longint;var Posted:longint):longint; cdecl;
|
|
|
|
{Create a Mutual Exclusion semaphore (mutex).
|
|
Name = Optional: Name to give to semaphore. Must start with '\SEM32\'.
|
|
Use nil for PChar or '' for string variant to use no name.
|
|
If a name if used the semaphore is shared.
|
|
Handle = Receives handle of semaphore.
|
|
Attr = One or more of the smXXXX constants.
|
|
State = Initial state: (0=Unowned, 1=Owned.)}
|
|
function DosCreateMutExSem(Name:PChar;var Handle:longint;
|
|
Attr,State:longint):longint; cdecl;
|
|
function DosCreateMutExSem(const Name:string;var Handle:longint;
|
|
Attr,State:longint):longint;
|
|
|
|
{Open a shared mutex semaphore.
|
|
Name = Name of semaphore to open, always starts with '\SEM32\'.
|
|
Handle = Receives handle to semaphore.}
|
|
function DosOpenMutExSem(Name:PChar;var Handle:longint):longint; cdecl;
|
|
function DosOpenMutExSem(const Name:string;var Handle:longint):longint;
|
|
|
|
{Close a mutex semaphore.
|
|
handle = Handle of semaphore to close.}
|
|
function DosCloseMutExSem(Handle:longint):longint; cdecl;
|
|
|
|
{Request ownership of a mutex semaphore. If the semaphore is already owned the
|
|
process is halted until the semaphore is released.
|
|
Handle = Handle of semaphore.
|
|
Timeout = Return with errorcode if the semaphore is still owned after
|
|
timeout milliseconds.}
|
|
function DosRequestMutExSem(Handle,Timeout:longint):longint; cdecl;
|
|
|
|
{Release the ownership of a mutex semaphore.
|
|
Handle = Handle of semaphore to release.}
|
|
function DosReleaseMutExSem(Handle:longint):longint; cdecl;
|
|
|
|
{Query the PID and TIB of the owner of a mutex semaphore.
|
|
Handle = Handle of semaphore.
|
|
PID = Receives process ID of owner.
|
|
TID = Receives thread ID of owner.
|
|
Count = Number of threads (within and outside current process) waiting
|
|
for ownership of semaphore.}
|
|
function DosQueryMutExSem(Handle:longint;var PID,TID,Count:longint):longint;
|
|
cdecl;
|
|
|
|
{Create a Multiple Wait (MuxWait) semaphore.
|
|
Name = Optional: Name to give semaphore. Must start with '\SEM32\'.
|
|
Use nil for PChar or '' for string variant to use no name.
|
|
If a name if used the semaphore is shared.
|
|
Handle = Receives handle of semaphore.
|
|
CSemRec = Number of semaphores to link muxwait semaphore with.
|
|
SemArray = Array of semaphore records to link with muxwait semaphore.
|
|
Attr = One or more of the smXXXX constants.}
|
|
function DosCreateMuxWaitSem(Name:PChar;var Handle:longint;CSemRec:longint;
|
|
var SemArray:TSemArray;Attr:longint):longint; cdecl;
|
|
function DosCreateMuxWaitSem(const Name:string;var Handle:longint;
|
|
CSemRec:longint;var SemArray:TSemArray;
|
|
Attr:longint):longint;
|
|
|
|
{Open a MuxWait semaphore.
|
|
Name = Name of semaphore to open.
|
|
Handle = Receives handle of semaphore.}
|
|
function DosOpenMuxWaitSem(Name:PChar;var Handle:longint):longint; cdecl;
|
|
function DosOpenMuxWaitSem(const Name:string;var Handle:longint):longint;
|
|
|
|
{Close a MuxWait semaphore.}
|
|
function DosCloseMuxWaitSem(Handle:longint):longint; cdecl;
|
|
|
|
{Wait for the MuxWait semaphore to be cleared.
|
|
Handle = Handle of semaphore.
|
|
Timeout = Timeout. See above.
|
|
User = Receives user value of the semaphore that caused the muxwait
|
|
semaphore to be cleared.}
|
|
function DosWaitMuxWaitSem(Handle,Timeout:longint;var User:longint):longint;
|
|
cdecl;
|
|
|
|
{Add a semaphore to the MuxWait semaphore.
|
|
|
|
Handle = Handle of semaphore.
|
|
SemRec = The semaphore to add.}
|
|
function DosAddMuxWaitSem(Handle:longint;var SemRec:TSemRecord):longint; cdecl;
|
|
|
|
{Remove a semaphore from the MuxWait semaphore.
|
|
Handle = Handle of muxwait semaphore.
|
|
Sem = Handle of semaphore to remove.}
|
|
function DosDeleteMuxWaitSem(Handle,Sem:longint):longint; cdecl;
|
|
|
|
{Query the semaphores from a MuxWait semaphore.
|
|
Handle = Handle of semaphore.
|
|
CSemRec = Input: Size of our array. Output: Number of items in array.
|
|
SemRecs = Array where TSemRecords are stored.
|
|
Attr = Flags used by creation of semaphore.}
|
|
function DosQueryMuxWaitSem(Handle:longint;var CSemRec:longint;
|
|
var SemRecs:TSemArray;var Attr:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
Timing related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
|
|
type TDateTime=record
|
|
Hour,
|
|
Minute,
|
|
Second,
|
|
Sec100,
|
|
Day,
|
|
Month:byte;
|
|
Year:word;
|
|
TimeZone:integer;
|
|
WeekDay:byte;
|
|
end;
|
|
PDateTime=^TDateTime;
|
|
|
|
|
|
{Get the date and time.}
|
|
function DosGetDateTime(var Buf:TDateTime):longint; cdecl;
|
|
|
|
{Set the date and time.}
|
|
function DosSetDateTime(var Buf:TDateTime):longint; cdecl;
|
|
|
|
{Start a one shot timer.
|
|
MSec = Number of miliseconds the timer will run.
|
|
HSem = Handle of event semaphore that is posted when time has expired.
|
|
TimHandle = Receives timer handle.}
|
|
function DosAsyncTimer(MSec,HSem:longint;
|
|
var TimHandle:longint):longint; cdecl;
|
|
|
|
{Start a cyclic timer.
|
|
MSec = Number of miliseconds the timer will run.
|
|
HSem = Handle of event semaphore that is posted when time has expired.
|
|
TimHandle = Receives timer handle.}
|
|
function DosStartTimer(MSec,HSem:longint;
|
|
var TimHandle:longint):longint; cdecl;
|
|
|
|
{Stop a timer and destroy its handle. There is no need to check for an
|
|
error code if you know your timer handle is correct.}
|
|
function DosStopTimer(TimHandle:longint):longint; cdecl;
|
|
|
|
{Get the frequency of the high resolution timer.}
|
|
function DosTmrQueryFreq(var Freq:longint):longint; cdecl;
|
|
|
|
{Get the current value of the high resolution timer.}
|
|
function DosTmrQueryTime(var Time:comp):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
DLL specific routines.
|
|
|
|
****************************************************************************}
|
|
|
|
{Load a DLL in memory if it is not yet loaded.
|
|
ObjName = When the DLL cannot be found, or one of the DLL's it needs
|
|
cannot be found, the name of the DLL will be put here.
|
|
ObjLen = Size of the ObjName result buffer.
|
|
DLLName = Name of DLL to load. Do not give an extension or a path,
|
|
just the name. OS/2 will automatically search through the
|
|
LIBPATH for the DLL.
|
|
Handle = Receives DLL handle.}
|
|
function DosLoadModule(ObjName:PChar;ObjLen:longint;DLLName:PChar;
|
|
var Handle:longint):longint; cdecl;
|
|
function DosLoadModule(var ObjName:string;ObjLen:longint;
|
|
const DLLName:string;var Handle:longint):longint;
|
|
|
|
{Let OS/2 know that we do not need a DLL anymore. If we were the only process
|
|
using the DLL, it is unloaded.}
|
|
function DosFreeModule(Handle:longint):longint; cdecl;
|
|
|
|
{Get the address of a procedure.
|
|
Handle = DLL handle,
|
|
Ordinal = Procedure to get address for. 0=Use its name.
|
|
ProcName = Name of the procedure to query address for. Must be nil
|
|
for PChar or '' for string variant if Ordinal is nonzero.
|
|
Address = Receives address of procedure.}
|
|
function DosQueryProcAddr(Handle,Ordinal:longint;ProcName:PChar;
|
|
var Address:pointer):longint; cdecl;
|
|
function DosQueryProcAddr(Handle,Ordinal:longint;const ProcName:string;
|
|
var Address:pointer):longint;
|
|
|
|
{Get the handle of a loaded DLL or a loaded executable.
|
|
DLLName = Name of DLL.
|
|
Handle = Receives DLL handle if present.}
|
|
function DosQueryModuleHandle(DLLName:PChar;var Handle:longint):longint; cdecl;
|
|
function DosQueryModuleHandle(const DLLName:string;var Handle:longint):longint;
|
|
|
|
{Get the pathname of a loaded DLL or a loaded executable.
|
|
|
|
Handle = Handle of DLL.
|
|
NameLen = Maximum length of char array.
|
|
Name = PChar (or string) where name is returned.}
|
|
function DosQueryModuleName(Handle,NameLen:longint;Name:Pchar):longint; cdecl;
|
|
{function DosQueryModuleName(Handle:longint;var Name:OpenString):longint;}
|
|
|
|
const pt16bit=0;
|
|
pt32bit=1;
|
|
|
|
{Return if a procedure is either 16 or 32 bit.
|
|
Handle = Handle of DLL.
|
|
Ordinal = DLL index number. 0 means use Name.
|
|
Name = Must be nil for PChar or '' for string variant if Ordinal
|
|
is zero. Otherwise it contains the procedure name.
|
|
ProcType = One of the ptXXXX constants.}
|
|
function DosQueryProcType(Handle,Ordinal:longint;Name:PChar;
|
|
var ProcType:longint):longint; cdecl;
|
|
function DosQueryProcType(Handle,Ordinal:longint;const Name:string;
|
|
var ProcType:longint):longint;
|
|
|
|
{****************************************************************************
|
|
|
|
Resource related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
{Possible resource types:}
|
|
|
|
const rtPointer = 1; {Mouse pointer.}
|
|
rtBitmap = 2; {Bitmap}
|
|
rtMenu = 3; {Menu template.}
|
|
rtDialog = 4; {Dialog template.}
|
|
rtString = 5; {A string table.}
|
|
rtFontDir = 6; {Font directory.}
|
|
rtFont = 7; {A font.}
|
|
rtAccelTable = 8; {Accelerator table.}
|
|
rtRcData = 9; {Binary data.}
|
|
rtMessage = 10; {Error message table.}
|
|
rtDlgInclude = 11; {Dialog include filename.}
|
|
rtVKeyTbl = 12; {Key to vkey tables.}
|
|
rtKeyTbl = 13; {Key to ugl tables.}
|
|
rtCharTbl = 14; {Glyph to character tables.}
|
|
rtDisplayInfo = 15; {Screen display information.}
|
|
rtFKAShort = 16; {Function key area short form.}
|
|
rtFKALong = 17; {Function key area long form.}
|
|
rtHelpTable = 18; {Help table.}
|
|
rtHelpSubTable = 19; {Sub help table.}
|
|
rtFDDir = 20; {DBCS unique/font driver directory.}
|
|
rtFD = 21; {DBCS unique/font driver.}
|
|
|
|
{Get the address of a resource object.
|
|
Handle = Handle of DLL (or executable) to get resource from.
|
|
ResType = One of the rtXXXX constants.
|
|
ResName = Number associated to resource object by resource compiler.}
|
|
function DosGetResource(Handle,ResType,ResName:longint;var P:pointer):longint;
|
|
cdecl;
|
|
|
|
{Remove a resource object from memory.
|
|
P = Pointer to resource.}
|
|
function DosFreeResource(P:pointer):longint; cdecl;
|
|
|
|
{Get the size of a resource object.
|
|
Handle = Handle to DLL (or executable).
|
|
IDT = One of the rtXXXX constants.
|
|
IDN = Number associated to resource object by resource compiler.
|
|
Size = Receives resource size.}
|
|
function DosQueryResourceSize(Handle,IDT,IDN:longint;var Size:longint):longint;
|
|
cdecl;
|
|
|
|
|
|
{****************************************************************************
|
|
|
|
Country and codepage specific routines.
|
|
|
|
****************************************************************************}
|
|
|
|
type TCountryCode=record
|
|
Country, {Country to query info about (0=current).}
|
|
CodePage:longint; {Code page to query info about (0=current).}
|
|
end;
|
|
PCountryCode=^TCountryCode;
|
|
CountryCode=TCountryCode;
|
|
|
|
TTimeFmt=(Clock12,Clock24);
|
|
|
|
TCountryInfo=record
|
|
Country,CodePage:longint; {Country and codepage requested.}
|
|
case byte of
|
|
0:(
|
|
DateFormat:longint; {1=ddmmyy 2=yymmdd 3=mmddyy}
|
|
CurrencyUnit:array[0..4] of char;
|
|
ThousandSeparator:char; {Thousands separator.}
|
|
Zero1:byte; {Always zero.}
|
|
DecimalSeparator:char; {Decimals separator,}
|
|
Zero2:byte;
|
|
DateSeparator:char; {Date separator.}
|
|
Zero3:byte;
|
|
TimeSeparator:char; {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:char; {Data list separator}
|
|
Zero5:byte;
|
|
Reserve2:array[0..4] of word);
|
|
1:(
|
|
fsDateFmt:longint; {1=ddmmyy 2=yymmdd 3=mmddyy}
|
|
szCurrency:array[0..4] of char; {null terminated currency symbol}
|
|
szThousandsSeparator:array[0..1] of char;
|
|
{Thousands separator + #0}
|
|
szDecimal:array[0..1] of char; {Decimals separator + #0}
|
|
szDateSeparator:array[0..1] of char;
|
|
{Date separator + #0}
|
|
szTimeSeparator:array[0..1] of char;
|
|
{Time separator + #0}
|
|
fsCurrencyFmt, {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}
|
|
cDecimalPlace:byte; {Number of decimal places used in
|
|
currency indication}
|
|
fsTimeFmt:byte; {0=12,1=24 hours}
|
|
abReserved1:array[0..1] of word;
|
|
szDataSeparator:array[0..1] of char;
|
|
{Data list separator + #0}
|
|
abReserved2:array[0..4] of word);
|
|
end;
|
|
PCountryInfo=^TCountryInfo;
|
|
CountryInfo=TCountryInfo;
|
|
|
|
TDBCSRange=record
|
|
Start,Stop:byte;
|
|
end;
|
|
|
|
TDBCSArray=array[0..$ffff] of TDBCSRange;
|
|
PDBCSArray=^TDBCSArray;
|
|
|
|
const CurrentCountry:TCountryCode=(Country:0;CodePage:0);
|
|
|
|
{Get country specific information.
|
|
Size = Size of our datastructure. (SizeOf(TCountryInfo))
|
|
ActualSize = Size of OS/2's datastructure. ActualSize bytes of
|
|
our TCountryInfo have been filled.}
|
|
function DosQueryCtryInfo(Size:longint;var Country:TCountryCode;
|
|
var Res:TCountryInfo;var ActualSize:longint):longint; cdecl;
|
|
|
|
{Get info about a code page with a DBCS character set.}
|
|
function DosQueryDBCSEnv(Size:longint;var Country:TCountryCode;
|
|
Buf:PChar):longint; cdecl;
|
|
|
|
{Convert a string to uppercase.
|
|
Size = Length of string.
|
|
Country = Country and codepage for converting.
|
|
AString = String to convert.}
|
|
function DosMapCase(Size:longint;var Country:TCountryCode;
|
|
AString:PChar):longint; cdecl;
|
|
function DosMapCase(var Country:TCountryCode;
|
|
var AString:string):longint;
|
|
|
|
{Get a collate table (a table for comparing which character is smaller and
|
|
which one is greater).
|
|
Size = Length of the databuffer the program has.
|
|
Country = Country to query table for. (0,0) is default country and
|
|
codepage.
|
|
Buf = Buffer to return table in. It's filled with the sort
|
|
weights of the ascii code. For example the 128th byte
|
|
contains the weight for ascii code 128.
|
|
TableLen = Length of collating table.}
|
|
function DosQueryCollate(Size:longint;var Country:TCountryCode;
|
|
Buf:PByteArray;var TableLen:longint):longint; cdecl;
|
|
|
|
{Get the current codepage. The PWordArray is filled with the current code
|
|
page followed by alternative codepages.}
|
|
function DosQueryCP(Size:longint;CodePages:PWordArray;
|
|
var ActSize:longint):longint; cdecl;
|
|
|
|
{Change the codepage, but only for the current process.}
|
|
function DosSetProcessCP(CP:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
Exception handling related functions
|
|
|
|
****************************************************************************}
|
|
|
|
|
|
{Exception constants.}
|
|
const 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;
|
|
|
|
type PExceptionRegistrationRecord=^TExceptionRegistrationRecord;
|
|
PExceptionReportRecord=^TExceptionReportRecord;
|
|
PContextRecord=^TContextRecord;
|
|
|
|
TExceptionHandler=procedure(Report:PExceptionReportRecord;
|
|
RegRec:PExceptionRegistrationRecord;
|
|
Context:PContextRecord;
|
|
DispContext:pointer); cdecl;
|
|
|
|
TExceptionRegistrationRecord=record
|
|
Prev_Structure:PExceptionRegistrationRecord;
|
|
ExceptionHandler:TExceptionHandler;
|
|
end;
|
|
|
|
TExceptionReportRecord=record
|
|
Exception_Num,
|
|
HandlerFlags:longint;
|
|
Nested_RepRec:PExceptionReportRecord;
|
|
Address:pointer;
|
|
ParamCount:longint;
|
|
Parameters:array [0..9999] of longint;
|
|
end;
|
|
|
|
TContextRecord=record
|
|
ContextFlags:longint;
|
|
Env:array[1..7] of longint;
|
|
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:longint;
|
|
end;
|
|
|
|
{Warning!!! Never use Presentation Manager functions from exception
|
|
handlers!}
|
|
|
|
{Install an exceptionhandler. The Prev_Structure field of RegRec should be
|
|
nil, it will be filled in be OS/2. RegRec must be on the stack: It must be a
|
|
local variable.}
|
|
function DosSetExceptionHandler(var RegRec:TExceptionRegistrationRecord):longint;
|
|
cdecl;
|
|
|
|
{Uninstall an exception handler.}
|
|
function DosUnSetExceptionHandler(var RegRec:TExceptionRegistrationRecord
|
|
):longint; cdecl;
|
|
|
|
{Trigger an exception.}
|
|
function DosRaiseException(var Excpt:TExceptionReportRecord):longint; cdecl;
|
|
|
|
{Send a signal to a process.}
|
|
function DosSendSignalException(PID,Exception:longint):longint; cdecl;
|
|
|
|
{Call and remove a set of exceptionhandlers}
|
|
function DosUnwindException(var Handler:TExceptionRegistrationRecord;
|
|
TargetIP:pointer;
|
|
var RepRec:TExceptionReportRecord):longint; cdecl;
|
|
|
|
{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:longint;var Times:longint):longint;
|
|
cdecl;
|
|
|
|
{Tell OS/2 that if an exception occurs, it must queue it up, until a
|
|
DosExitMustComplete follows. Urgent exceptions still occur. The only
|
|
possible error is that the nesting becomes too high, so error checking
|
|
is only needed in seldom cases.
|
|
Nesting = Number of DosEnterMustComplete calls minus number of
|
|
DosExitMustComplete calls.}
|
|
function DosEnterMustComplete(var Nesting:longint):longint; cdecl;
|
|
|
|
{Tell OS/2 that it can send exceptions again. See above}
|
|
function DosExitMustComplete(var Nesting:longint):longint; cdecl;
|
|
|
|
{Tell we want further signal exceptions.
|
|
SignalNum = Signal nummer to acknowlegde.}
|
|
function DosAcknowledgeSignalException(SignalNum:longint):longint; cdecl;
|
|
|
|
|
|
{****************************************************************************
|
|
|
|
Queue related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
type TRequestData=record
|
|
PID, {ID of process that wrote element.}
|
|
Data:longint; {Information from process writing the data.}
|
|
end;
|
|
PRequestData=^TRequestData;
|
|
|
|
{Useful constants for priority parameters.}
|
|
const quFIFO=0;
|
|
quLIFO=1;
|
|
quPriority=2;
|
|
quNoConvert_Address=0;
|
|
quConvert_Address=4;
|
|
|
|
{Close a queue. If the calling process has created the queue, it is
|
|
destroyed. If you can guarantee the handle is correct, there is no need
|
|
to check for error codes.}
|
|
function DosCloseQueue(Handle:longint):longint; cdecl;
|
|
|
|
{Create a queue. The process that creates a queue, owns that queue, and is
|
|
the only one who can read from that queue. Other processes can only write
|
|
to that queue. The queuename must have the format '\QUEUES\name.ext' .
|
|
|
|
Handle = Receives queue handle.
|
|
Priority = 0 = Use FIFO system.
|
|
1 = Use LIFO system.
|
|
2 = Use priority system.
|
|
Add 4 to convert addresses of data inserted by 16-bit
|
|
processes to 32 bit pointers.
|
|
Name = Name of queue to create.}
|
|
function DosCreateQueue(var Handle:longint;Priority:longint;
|
|
Name:PChar):longint; cdecl;
|
|
function DosCreateQueue(var Handle:longint;Priority:longint;
|
|
const Name:string):longint;
|
|
|
|
{Open an existing queue. You cannot read from the queue unless you are the
|
|
process that created it. The name must have the format '\QUEUES\name.ext'}
|
|
function DosOpenQueue(var Parent_PID:longint;var Handle:longint;
|
|
Name:PChar):longint; cdecl;
|
|
function DosOpenQueue(var Parent_PID:longint;var Handle:longint;
|
|
const Name:string):longint;
|
|
|
|
{Read a record from a queue, but do not remove it from the queue.
|
|
Handle = Handle of queue to read from.
|
|
ReqBuffer = Receives information about read data.
|
|
DataLen = Receives length of data read.
|
|
DataPtr = Receives the address of the data.
|
|
Element = 0 = Return first element in queue.
|
|
1 = Return next element in queue. Can be repeated.
|
|
Current element number is returned here, for use
|
|
with DosReadQueue.
|
|
Wait = 0 = Wait until there is a queue element available.
|
|
1 = Return with an error when queue is empty.
|
|
Priority = Receives priority of queue record (1..15).
|
|
ASem = Use NIL if Wait=0, give a handle of a semaphore when
|
|
Wait=1. The semaphore will be cleared when there is an
|
|
element inserted it the queue.
|
|
!! event queue}
|
|
function DosPeekQueue(Handle:longint;var ReqBuffer:TRequestData;
|
|
var DataLen:longint;var DataPtr:pointer;
|
|
var Element:longint;Wait:longint;
|
|
var Priority:byte;ASem:longint):longint; cdecl;
|
|
|
|
{Empty a queue. You must be the process the created the queue.}
|
|
function DosPurgeQueue(Handle:longint):longint; cdecl;
|
|
|
|
{Return the number of elements in the queue.}
|
|
function DosQueryQueue(Handle:longint;var Count:longint):longint; cdecl;
|
|
|
|
{Read a record from a queue, but do not remove it from the queue.
|
|
Handle = Handle of queue to read from.
|
|
ReqBuffer = Receives information about read data.
|
|
DataLen = Receives length of data read.
|
|
DataPtr = Receives the address of the data.
|
|
Element = 0 = Return first element in queue.
|
|
Otherwise: Return the element numbered with this.
|
|
Wait = 0 = Wait until there is a queue element available.
|
|
1 = Return with an error when queue is empty.
|
|
Priority = Receives priority of queue record (1..15).
|
|
ASem = Use NIL if Wait=0, give a handle of a semaphore when
|
|
Wait=1. The semaphore will be cleared when there is an
|
|
element inserted it the queue.
|
|
!! event queue}
|
|
function DosReadQueue(Handle:longint;var ReqBuffer:TRequestData;
|
|
var DataLen:longint;var DataPtr:pointer;
|
|
Element,Wait:longint;var Priority:byte;
|
|
ASem:longint):longint; cdecl;
|
|
|
|
{Write a data record to a queue.
|
|
Handle = Handle of queue to write to.
|
|
Request = Value that will be inserted in the RequestData field when
|
|
element is read from queue.
|
|
DataLen = Size of data to write.
|
|
DataBuf = Data to write.
|
|
Priority = Priority of data in buffer. Only relevant when queue is
|
|
created with priority support.}
|
|
function DosWriteQueue(Handle,Request,Datalen:longint;var DataBuf;
|
|
Priority:longint):longint; cdecl;
|
|
|
|
const deHardErr = 1; {Hard errors are enabled, to disable
|
|
do not give this switch.}
|
|
deDisableExceptions = 2; {Exceptions are disabled, to enable
|
|
do not give this switch.}
|
|
|
|
{****************************************************************************
|
|
|
|
Error handling related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
{Disable the end user notification of hardware errors and exceptions. Users
|
|
can overide this in config.sys. By default, notification is enabled.
|
|
There is no need for error checking if you can guarantee the parameter is
|
|
correct.}
|
|
function DosError(Error:longint):longint; cdecl;
|
|
|
|
{Get information about an error code.
|
|
It cannot fail, so it is written as procedure.
|
|
|
|
Code = Error code to get info about.
|
|
_Class = Receives the error class.
|
|
Action = Receives the recommended action you should take.
|
|
Locus = Receives what could have caused the error.}
|
|
procedure DosErrClass(Code:longint;var _Class,Action,Locus:longint); cdecl;
|
|
|
|
|
|
{****************************************************************************
|
|
|
|
Message file specific routines.
|
|
|
|
****************************************************************************}
|
|
|
|
|
|
type PInsertTable=^TInsertTable;
|
|
TInsertTable=array[1..9] of PChar;
|
|
|
|
{Get a message from a messagefile.
|
|
Table = Table of strings to insert.
|
|
TableSize = Number of strings in table.
|
|
Buf = Address of buffer to store message in.
|
|
BufSize = Size of buffer to store message in.
|
|
MsgNumber = Number of message to get.
|
|
FileName = Name of file to get message from.
|
|
MsgSize = The size of the message returned.}
|
|
function DosGetMessage(Table:PInsertTable;TableSize:longint;Buf:PChar;
|
|
BufSize,MsgNumber:longint;FileName:PChar;
|
|
var MsgSize:longint):longint;
|
|
{And a variant using strings and open arrays.
|
|
function DosGetMessage(const Table:array of PString;var Buf:string;
|
|
BufSize,MsgNumber:longint;const FileName:PChar):longint;}
|
|
|
|
{And a variant using strings, but with a PChar buffer, because of long
|
|
messages, and open arrays.
|
|
function DosGetMessage(const Table:array of PString;Buf:PChar;
|
|
BufSize,MsgNumber:longint;const FileName:string;
|
|
MsgSize:longint):longint;}
|
|
|
|
{Insert textstrings into a message. The message must be loaded before with
|
|
DosGetMessage. This function is used when the insert strings are not yet
|
|
known when the message was loaded.
|
|
Table = Table of strings to insert.
|
|
TableSize = Number of struings to insert.
|
|
Message = Message to insert strings into.
|
|
SrcMessageSize = Size of message to insert strings into.
|
|
Buf = Receives adjusted message.
|
|
BufSize = Size of your buffer.
|
|
DstMessageSize = Receives size of adjusted message.}
|
|
function DosInsertMessage(Table:PInsertTable;TableSize:longint;
|
|
Message:PChar;SrcMessageSize:longint;
|
|
Buf:PChar;BufSize:longint;
|
|
var DstMessageSize:longint):longint; cdecl;
|
|
{And a variant using strings and open arrays.
|
|
function DosInsertMessage(Table:array of PString;
|
|
const Message:string;
|
|
var Buf:openstring):longint;}
|
|
|
|
{And a variant using strings, but with a PChar buffer, because of long
|
|
messages, and open arrays.
|
|
function DosInsertMessage(Table:array of PString;
|
|
Message:PChar;SrcMessageSize:longint;
|
|
Buf:PChar;BufSize:longint;
|
|
var DstMessageSize:longint):longint;}
|
|
|
|
{Write a message to a file.
|
|
Handle = Handle of file.
|
|
Size = Size of message.
|
|
Buf = Buffer where message is located.}
|
|
function DosPutMessage(Handle,Size:longint;Buf:PChar):longint; cdecl;
|
|
function DosPutMessage(Handle:longint;const Buf:string):longint;
|
|
|
|
{Get info about which codepages and languages a messagefile supports.
|
|
Buf = Receives information.
|
|
BufSize = Size of buffer.
|
|
FileName = Filename of message file.
|
|
InfoSize = Receives size in bytes of the returned info.}
|
|
function DosQueryMessageCP(var Buf;BufSize:longint;FileName:PChar;
|
|
var InfoSize:longint):longint;
|
|
function DosQueryMessageCP(var Buf;BufSize:longint;const FileName:string;
|
|
var InfoSize:longint):longint;
|
|
|
|
{****************************************************************************
|
|
|
|
Session specific routines.
|
|
|
|
****************************************************************************}
|
|
|
|
type TStatusData=record
|
|
Length:word; {Length, in bytes, of datastructure.}
|
|
SelectIND:word; {Determines if the session can be
|
|
selected: Don't change/selectable/
|
|
not selectable (0/1/2).}
|
|
BondIND:word; {Determines which section will come
|
|
to the foreground when it is
|
|
selected: Don't change/child to
|
|
foreground when parent selected/
|
|
parent to foreground when parent
|
|
selected.}
|
|
end;
|
|
PStatusData=^TStatusData;
|
|
|
|
type TStartData=record
|
|
{Note: to omit some fields, use a length smaller than
|
|
SizeOf(TStartData).}
|
|
Length:word; {Length, in bytes, of datastructure.}
|
|
Related:word; {Independent/child session (0/1).}
|
|
FgBg:word; {Foreground/background (0/1).}
|
|
TraceOpt:word; {No trace/trace this/trace all
|
|
(0/1/2).}
|
|
PgmTitle:PChar; {Program title.}
|
|
PgmName:PChar; {Filename to program.}
|
|
PgmInputs:PChar; {Command parameters (nil allowed).}
|
|
TermQ:PChar; {System queue. (nil allowed).}
|
|
Environment:PChar; {Environment to pass (nil allowed).}
|
|
InheritOpt:word; {Inherit enviroment from shell/
|
|
inherit environment from parent
|
|
(0/1).}
|
|
SessionType:word; {Auto/full screen/window/presentation
|
|
manager/full screen Dos/windowed Dos
|
|
(0/1/2/3/4/5/6/7).}
|
|
Iconfile:PChar; {Icon file to use (nil allowed).}
|
|
PgmHandle:longint; {0 or the program handle.}
|
|
PgmControl:word; {Bitfield describing initial state
|
|
of windowed sessions.}
|
|
InitXPos,InitYPos:word; {Initial top coordinates.}
|
|
InitXSize,InitYSize:word; {Initial size.}
|
|
Reserved:word;
|
|
ObjectBuffer:PChar; {If a module cannot be loaded, its
|
|
name will be returned here.}
|
|
ObjectBuffLen:longint; {Size of your buffer.}
|
|
end;
|
|
PStartData=^TStartData;
|
|
StartData=TStartData;
|
|
|
|
{Start a new session.
|
|
AStartData = A startdata record.
|
|
SesID = Receives session ID of session created.
|
|
PID = Receives process ID of process created.}
|
|
function DosStartSession(const AStartData:TStartData;
|
|
var SesID,PID:longint):longint; cdecl;
|
|
|
|
{Set the status of a child session.
|
|
SesID = ID of session.
|
|
AStatus = Status to set.}
|
|
function DosSetSession(SesID:longint;const AStatus:TStatusData):longint; cdecl;
|
|
|
|
{Bring a child session to the foreground.
|
|
SesID = ID of session.}
|
|
function DosSelectSession(SesID:longint):longint; cdecl;
|
|
|
|
{Terminate (a) child session(s).
|
|
Scope = 0 = Terminate specified session.
|
|
1 = Terminate all child sessions.
|
|
SesID = ID of session to terminate (ignored when terminating
|
|
all).}
|
|
function DosStopSession(Scope,SesID:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
Named/unnamed pipe specific routines.
|
|
|
|
****************************************************************************}
|
|
|
|
type TAvailData=record
|
|
cbPipe, {Number of bytes in pipe.}
|
|
cbMessage:word; {Number of bytes in current message.}
|
|
end;
|
|
|
|
TPipeInfo=record
|
|
cbOut:word; {Size of outbound data.}
|
|
cbIn:word; {Size of inbound data.}
|
|
MaxInst:byte; {Maximum number of instances.}
|
|
CurInst:byte; {Current number of instances.}
|
|
Name:string; {Name of the pipe. You can use @Name[1] if
|
|
you need a PChar to the name; the string is
|
|
always followed by a zero.}
|
|
end;
|
|
|
|
TPipeSemState=record
|
|
Status:byte;
|
|
Flag:byte;
|
|
Key:word;
|
|
Avail:word;
|
|
end;
|
|
|
|
{Create an unnamed pipe.
|
|
ReadHandle = Receives handle for reading from pipe.
|
|
WriteHandle = Receives handle to write to pipe.
|
|
Size = Size of pipe to create. 0 means default size. If data is
|
|
written into a pipe that is smaller than the sent data, the
|
|
writing thread is suspended until the data has been read
|
|
from the pipe, thus making room for more data to send.}
|
|
function DosCreatePipe(var ReadHandle,WriteHandle:longint;
|
|
Size:longint):longint; cdecl;
|
|
|
|
const {np_XXXX constants for openmode.}
|
|
np_Access_Inbound = $0000; {Client to server connection.}
|
|
np_Access_Outbound = $0001; {Server to client access.}
|
|
np_Access_Duplex = $0002; {Two way access.}
|
|
np_Inherit = $0080; {Pipe handle is inherited by
|
|
child processes.}
|
|
np_No_Write_Behind = $4000; {Don't allow write behind for
|
|
remote pipes.}
|
|
{np_XXXX constants for pipemode.}
|
|
np_Unlimited_Instances = $00ff; {Unlimited instances.}
|
|
np_ReadMode_Mesg = $0100; {Read the pipe as a message
|
|
stream instead of as a byte
|
|
stream.}
|
|
np_ReadMode_Message = np_ReadMode_Mesg;
|
|
np_WriteMode_Mesg = $0400; {Write the pipe as a message
|
|
stream instead of as a byte
|
|
stream.}
|
|
np_WriteMode_Message = np_WriteMode_Mesg;
|
|
np_Type_Message = np_WriteMode_Mesg;
|
|
np_NoWait = $8000; {Dosread and Doswrite do not
|
|
wait is no data can be read or
|
|
written; they return with an
|
|
error message.}
|
|
|
|
{Create a named pipe.
|
|
Name = Name of pipe to create.
|
|
Handle = Receives handle to pipe.
|
|
OpenMode = A combination of np_XXXX constants for openmode.
|
|
PipeMode = A combination of np_XXXX constants for pipemode,
|
|
plus a number within [1..254] which determines the number
|
|
of instances that can be created to the pipe, or,
|
|
np_Unlimited_Instance for an unlimited number of
|
|
instances.
|
|
OutBufSize = The number of bytes to allocate for the output buffer.
|
|
InBufSize = The number of bytes to allocate for the input buffer.
|
|
MSec = The maximum time to wait for an available instance.}
|
|
function DosCreateNPipe(Name:PChar;var Handle:longint;OpenMode,PipeMode,
|
|
OutBufSize,InBufSize,MSec:longint):longint; cdecl;
|
|
function DosCreateNPipe(const Name:string;var Handle:longint;OpenMode,
|
|
PipeMode,OutBufSize,InBufSize,MSec:longint):longint;
|
|
|
|
{Makes a procedure call to a duplex message pipe.
|
|
Name = Name of pipe.
|
|
Input = Buffer that contains data to be written to the pipe.
|
|
InputSize = Size of the inputdata.
|
|
Output = Buffer that contains data to be read from the pipe.
|
|
OutputSize = Size of the outputbuffer.
|
|
ReadBytes = Receives number of bytes actually read.
|
|
MSec = The maximum time to wait for an available instance.}
|
|
function DosCallNPipe(Name:PChar;var Input;InputSize:longint;
|
|
var Output;OutputSize:longint;var ReadBytes:longint;
|
|
MSec:longint):longint; cdecl;
|
|
function DosCallNPipe(const Name:string;var Input;InputSize:longint;
|
|
var Output;OutputSize:longint;var ReadBytes:longint;
|
|
MSec:longint):longint;
|
|
|
|
{Prepare a named pipe for a client process.
|
|
Handle = Handle that was returned when pipe was created.}
|
|
function DosConnectNPipe(Handle:longint):longint; cdecl;
|
|
|
|
{Acknowledges that a client process has closed a named pipe.
|
|
Handle = Handle that was returned when pipe was created.}
|
|
function DosDisconnectNPipe(Handle:longint):longint; cdecl;
|
|
|
|
const np_State_Disconnected = 1; {Pipe is disconnected.}
|
|
np_State_Listening = 2; {Pipe is listening.}
|
|
np_State_Connected = 3; {Pipe is connected.}
|
|
np_State_Closing = 4; {Pipe is closing.}
|
|
|
|
{Preview data in a pipe: Read data without removing it.
|
|
Handle = Handle to named pipe.
|
|
Buffer = Buffer to receive data in.
|
|
BufSize = Size of the buffer.
|
|
ReadBytes = Receives number of bytes put in buffer.
|
|
Avail = Receives size of available data.
|
|
State = One of the np_xxxx constants for states.}
|
|
function DosPeekNPipe(Handle:longint;var Buffer;BufSize:longint;
|
|
var ReadBytes:longint;var Avail:TAvailData;
|
|
var State:longint):longint; cdecl;
|
|
|
|
{Get information about a named pipe handle.
|
|
Handle = Handle to pipe.
|
|
State = A combination of np_XXXX constants for (!!!) pipemode.}
|
|
function DosQueryNPHState(Handle:longint;var State:longint):longint; cdecl;
|
|
|
|
{Return information about a named pipe.
|
|
Handle = Handle to pipe.
|
|
InfoLevel = Level of information wanted (1 or 2 allowed).
|
|
Buffer = TPipeInfo datastructure for level 1.
|
|
Unique 4 byte identifier of the client for level 2. Only
|
|
used for LAN based pipe servers.}
|
|
function DosQueryNPipeInfo(Handle,InfoLevel:longint;var Buffer;
|
|
BufSize:longint):longint; cdecl;
|
|
|
|
{Return information of local named pipes that are attached to a semaphore.
|
|
SemHandle = Handle to a shared event or MuxWait semaphore that is
|
|
attached to a named pipe.
|
|
SemArray = Array in which for each pipe attached to the semaphore.
|
|
BufSize = Size of SemArray, in bytes.}
|
|
function DosQueryNPipeSemState(Semhandle:longint;var SemArray;
|
|
BufSize:longint):longint; cdecl;
|
|
|
|
{Resets the blocking mode and state of a named pipe.
|
|
Handle = Handle to named pipe.
|
|
State = One of the np_XXXX constants for pipemode.}
|
|
function DosSetNPHState(Handle,State:longint):longint; cdecl;
|
|
|
|
{Attach a shared event semaphore to a local named pipe.
|
|
PipeHandle = Handle to named pipe.
|
|
SemHandle = Handle to semaphore.
|
|
Key = A key that must be different for each named pipe that is
|
|
attached to the semaphore.}
|
|
function DosSetNPipeSem(PipeHandle,SemHandle,Key:longint):longint; cdecl;
|
|
|
|
{Write to a duplex named pipe; then read from it.
|
|
Handle = Handle to named pipe.
|
|
OutBuf = The data to write.
|
|
OutSize = Size of the data to write.
|
|
InBuf = Receives the read data.
|
|
InSize = Size of the input buffer.
|
|
ReadBytes = Number of bytes read from the pipe.}
|
|
function DosTransactNPipe(Handle:longint;var OutBuf;OutSize:longint;
|
|
var InBuf;InSize:longint;
|
|
var ReadBytes:longint):longint; cdecl;
|
|
|
|
{Waits until an instance of a named pipe becomes available.
|
|
Name = Name of named pipe (always starts with '\PIPE\').
|
|
MSec = Return with an error code if this time has elapsed.}
|
|
function DosWaitNPipe(Name:PChar;MSec:longint):longint; cdecl;
|
|
function DosWaitNPipe(const Name:string;MSec:longint):longint;
|
|
|
|
{****************************************************************************
|
|
|
|
Virtual device driver related routines.
|
|
|
|
****************************************************************************}
|
|
|
|
{Open a virtual device driver.
|
|
Name = Name of virtual device driver.
|
|
Handle = Receives handle to virtual device driver.}
|
|
function DosOpenVDD(Name:PChar;var Handle:longint):longint; cdecl;
|
|
|
|
{Request to talk with a virtual device driver.
|
|
Handle = Handle to virtual device driver.
|
|
SGroup = Handle to the screen group of a DOS session (may be nil).
|
|
Cmd = A number which indicates the service you call.
|
|
InSize = Size of the data to send to the VDD.
|
|
InBuffer = Buffer which contains the data to send to the VDD.
|
|
OutSize = Size of the buffer in which the VDD will return data.
|
|
OutBuffer = Receives the data that the VDD returns.}
|
|
function DosRequestVDD(Handle,SGroup,Cmd:longint;
|
|
InSize:longint;var InBuffer;
|
|
OutSize:longint;var OutBuffer):longint; cdecl;
|
|
|
|
{Close a virtual device driver.}
|
|
function DosCloseVDD(Handle:longint):longint; cdecl;
|
|
|
|
{****************************************************************************
|
|
|
|
16 <=> 32 bit support related routines
|
|
|
|
****************************************************************************}
|
|
|
|
{Convert a 16 bit far pointer to a 32 bit near pointer.
|
|
This procedure needs to be called from assembler.
|
|
This procedure works by mapping an area in your flat address space onto the
|
|
same physical memory address as the selector of the 16 bit far pointer.
|
|
|
|
In:
|
|
eax Pointer to convert in selector:offset format.
|
|
|
|
Out:
|
|
eax Returned 32 bit near pointer.}
|
|
procedure DosSelToFlat; cdecl;
|
|
|
|
type
|
|
TFarPtr = record
|
|
Sel, Offset: word;
|
|
end;
|
|
|
|
function SelToFlat (AFarPtr: TFarPtr): pointer; cdecl;
|
|
|
|
{Convert a 32 bit near pointer to a 16 bit far pointer.
|
|
This procedure needs to be called from assembler.
|
|
This procedure works by allocating a selector at the same physical address
|
|
as the pointer you pass points to.
|
|
|
|
In:
|
|
eax Pointer to convert in 32 bit near format.
|
|
|
|
Out:
|
|
eax Returned 16 bit far pointer in selector:offset format.}
|
|
procedure DosFlatToSel; cdecl;
|
|
|
|
{typecast result to TFarPtr}
|
|
function FlatToSel (APtr: pointer): cardinal; cdecl;
|
|
|
|
{***************************************************************************}
|
|
implementation
|
|
{***************************************************************************}
|
|
|
|
{$L code2.oo2}
|
|
{$L code3.oo2}
|
|
|
|
function DosCreateThread(var TID:longint;Address:TThreadEntry;
|
|
aParam:pointer;Flags:longint;
|
|
StackSize:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 311;
|
|
|
|
function DosSuspendThread(TID:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 238;
|
|
|
|
function DosResumeThread(TID:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 237;
|
|
|
|
function DosKillThread(TID:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 111;
|
|
|
|
function DosWaitThread(var TID:longint;Option:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 349;
|
|
|
|
function DosEnterCritSec:longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 232;
|
|
|
|
function DosExitCritSec:longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 233;
|
|
|
|
procedure DosExit(Action,Result:longint); cdecl;
|
|
|
|
external 'DOSCALLS' index 233;
|
|
|
|
{procedure DosGetInfoBlocks(var ATIB:PThreadInfoBlock;
|
|
var APIB:PProcessInfoBlock); cdecl;}
|
|
|
|
procedure DosGetInfoBlocks(PATIB:PPThreadInfoBlock;
|
|
PAPIB:PPProcessInfoBlock); cdecl;
|
|
|
|
external 'DOSCALLS' index 312;
|
|
|
|
procedure DosSleep (MSec:longint); cdecl;
|
|
|
|
external 'DOSCALLS' index 229;
|
|
|
|
function DosBeep(Freq,MS:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 286;
|
|
|
|
function DosDebug(DebugBuf:pointer):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 317;
|
|
|
|
function DosExitList(OrderCode:longint;Proc:TExitProc):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 296;
|
|
|
|
function DosExecPgm(ObjName:PChar;ObjLen,ExecFlag:longint;
|
|
Args,Env:PByteArray;var Res:TResultCodes;
|
|
FileName:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 283;
|
|
|
|
function DosExecPgm(var ObjName:string;Execflag:longint;
|
|
Args,Env:PByteArray;var Res:TResultCodes;
|
|
const FileName:string):longint;
|
|
|
|
var T,T2:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosExecPgm:=DosExecPgm(@T2,SizeOf(T2),ExecFlag,Args,Env,Res,@T);;
|
|
ObjName:=StrPas(@T2);
|
|
end;
|
|
|
|
function DosWaitChild(Action,Option:longint;var Res:TResultCodes;
|
|
var TermPID:longint;PID:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 280;
|
|
|
|
function DosSetPriority(Scope,TrClass,Delta,PortID:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 236;
|
|
|
|
function DosKillProcess(Action,PID:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 235;
|
|
|
|
function DosQueryAppType(FileName:PChar;var Flags:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 323;
|
|
|
|
function DosDevConfig(var DevInfo:byte;Item:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 231;
|
|
|
|
function DosSetFileLocks(Handle:longint;var Unlock,Lock:TFileLock;
|
|
Timeout,Flags:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 428;
|
|
|
|
function DosCancelLockRequest(Handle:longint;var Lock:TFileLock):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 429;
|
|
|
|
function DosOpen(FileName:PChar;var Handle,Action:longint;
|
|
InitSize,Attrib,OpenFlags,FileMode:longint;
|
|
EA:PEAOp2):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 273;
|
|
|
|
function DosCreate(FileName:PChar;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
|
|
var Action:longint;
|
|
|
|
begin
|
|
DosCreate:=DosOpen(FileName,Handle,Action,0,Attrib,18,OpenMode,nil);
|
|
end;
|
|
|
|
function DosOpen(FileName:PChar;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
|
|
var Action:longint;
|
|
|
|
begin
|
|
DosOpen:=DosOpen(FileName,Handle,Action,0,Attrib,1,OpenMode,nil);
|
|
end;
|
|
|
|
function DosOpen(const FileName:string;var Handle,Action:longint;
|
|
InitSize,Attrib,OpenFlags,OpenMode:longint;
|
|
EA:PEAOp2):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosOpen:=DosOpen(@T,Handle,Action,InitSize,Attrib,OpenFlags,OpenMode,EA);
|
|
end;
|
|
|
|
function DosCreate(const FileName:string;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
Action:longint;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosCreate:=DosOpen(@T,Handle,Action,0,Attrib,18,OpenMode,nil);
|
|
end;
|
|
|
|
function DosOpen(const FileName:string;var Handle:longint;
|
|
Attrib,OpenMode:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
Action:longint;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosOpen:=DosOpen(@T,Handle,Action,0,Attrib,1,OpenMode,nil);
|
|
end;
|
|
|
|
function DosClose(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 257;
|
|
|
|
function DosRead(Handle:longint;var Buffer;Count:longint;
|
|
var ActCount:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 281;
|
|
|
|
function DosWrite(Handle:longint;var Buffer;Count:longint;
|
|
var ActCount:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 282;
|
|
|
|
function DosSetFilePtr(Handle:longint;Pos,Method:longint;
|
|
var PosActual:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 256;
|
|
|
|
function DosSetFilePtr(Handle:longint;Pos:longint):longint; cdecl;
|
|
|
|
var PosActual:longint;
|
|
|
|
begin
|
|
DosSetFilePtr:=DosSetFilePtr(Handle,Pos,0,PosActual);
|
|
end;
|
|
|
|
function DosGetFilePtr(Handle:longint;var PosActual:longint):longint;
|
|
|
|
begin
|
|
DosGetFilePtr:=DosSetFilePtr(Handle,0,1,PosActual);
|
|
end;
|
|
|
|
function DosSetFileSize(Handle,Size:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 272;
|
|
|
|
function DosResetBuffer(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 254;
|
|
|
|
function DosDupHandle(Handle:longint;var Duplicate:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 260;
|
|
|
|
function DosQueryFHState(Handle:longint;var FileMode:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 276;
|
|
|
|
function DosSetFHState(Handle,FileMode:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 221;
|
|
|
|
function DosQueryHType(Handle:longint;var HandType:longint;
|
|
var Attr:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 224;
|
|
|
|
function DosEditName(MetaLevel:longint;Source,Edit:PChar;
|
|
Target:PChar;TargetLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 261;
|
|
|
|
function DosEditName(MetaLevel:longint;const Source,Edit:string;
|
|
var Target:string):longint;
|
|
|
|
var T,T2,T3:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Source);
|
|
StrPCopy(@T2,Edit);
|
|
DosEditName:=DosEditName(MetaLevel,@T,@T2,@T3,SizeOf(T3));
|
|
Target:=StrPas(@T3);
|
|
end;
|
|
|
|
function DosMove(OldFile,NewFile:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 271;
|
|
|
|
function DosMove(const OldFile,NewFile:string):longint;
|
|
|
|
var T,T2:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,OldFile);
|
|
StrPCopy(@T2,NewFile);
|
|
DosMove:=DosMove(@T,@T2);
|
|
end;
|
|
|
|
function DosCopy(OldFile,NewFile:PChar;Option:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 258;
|
|
|
|
function DosCopy(const OldFile,NewFile:string;Option:longint):longint;
|
|
|
|
var T,T2:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,OldFile);
|
|
StrPCopy(@T2,NewFile);
|
|
DosCopy:=DosCopy(@T,@T2,Option);
|
|
end;
|
|
|
|
function DosDelete(FileName:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 259;
|
|
|
|
function DosDelete(const FileName:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosDelete:=DosDelete(@T);
|
|
end;
|
|
|
|
function DosForceDelete(FileName:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 110;
|
|
|
|
function DosForceDelete(const FileName:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosForceDelete:=DosForceDelete(@T);
|
|
end;
|
|
|
|
function DosCreateDir(Name:PChar;EA:PEAOp2):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 270;
|
|
|
|
function DosCreateDir(Name:PChar):longint;
|
|
|
|
begin
|
|
DosCreateDir:=DosCreateDir(Name,nil);
|
|
end;
|
|
|
|
function DosCreateDir(const Name:string;EA:PEAOp2):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCreateDir:=DosCreateDir(@T,EA);
|
|
end;
|
|
|
|
function DosCreateDir(const Name:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCreateDir:=DosCreateDir(@T,nil);
|
|
end;
|
|
|
|
function DosDeleteDir(Name:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 226;
|
|
|
|
function DosDeleteDir(const Name:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosDeleteDir:=DosDeleteDir(@T);
|
|
end;
|
|
|
|
function DosSetDefaultDisk(DiskNum:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 220;
|
|
|
|
procedure DosQueryCurrentDisk(var DiskNum:longint;var Logical:longint); cdecl;
|
|
|
|
external 'DOSCALLS' index 275;
|
|
|
|
function DosSetCurrentDir(Name:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 255;
|
|
|
|
function DosSetCurrentDir(const Name:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosSetCurrentDir:=DosSetCurrentDir(@T);
|
|
end;
|
|
|
|
function DosQueryCurrentDir(DiskNum:longint;var Buffer;
|
|
var BufLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 274;
|
|
|
|
function DosQueryCurrentDir(DiskNum:longint;var Buffer:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
L:longint;
|
|
|
|
begin
|
|
L:=255;
|
|
DosQueryCurrentDir:=DosQueryCurrentDir(DiskNum,T,L);
|
|
Buffer:=StrPas(@T);
|
|
end;
|
|
|
|
function DosDevIOCtl(Handle,Category,Func:longint;var Params;
|
|
ParamLen:longint;var ParamSize:longint;
|
|
var Data;var DataLen:longint;var DataSize:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 284;
|
|
|
|
function DosFindFirst(FileMask:PChar;var Handle:longint;Attrib:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen:longint;
|
|
var Count:longint;InfoLevel:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 264;
|
|
|
|
function DosFindFirst(const FileMask:string;var Handle:longint;
|
|
Attrib:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint;var Count:longint;
|
|
InfoLevel:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileMask);
|
|
DosFindFirst:=DosFindFirst(@T,Handle,Attrib,AFileStatus,FileStatusLen,
|
|
Count,InfoLevel);
|
|
end;
|
|
|
|
function DosFindNext(Handle:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint;var Count:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 265;
|
|
|
|
function DosFindClose(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 263;
|
|
|
|
function DosQueryFileInfo(Handle,InfoLevel:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 279;
|
|
|
|
function DosSetFileInfo(Handle,InfoLevel:longint;AFileStatus:PFileStatus;
|
|
FileStatusLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 218;
|
|
|
|
function DosQueryPathInfo(FileName:PChar;InfoLevel:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 223;
|
|
|
|
function DosQueryPathInfo(const FileName:string;InfoLevel:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosQueryPathInfo:=DosQueryPathInfo(@T,InfoLevel,AFileStatus,
|
|
FileStatusLen);
|
|
end;
|
|
|
|
function DosSetPathInfo(FileName:PChar;InfoLevel:longint;
|
|
AFileStatus:PFileStatus;FileStatusLen,
|
|
Options:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 219;
|
|
|
|
function DosEnumAttribute(RefType:longint;AFile:pointer;
|
|
Entry:longint;var Buf;BufSize:longint;
|
|
var Count:longint;InfoLevel:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 372;
|
|
|
|
function DosEnumAttribute(Handle,Entry:longint;var Buf;BufSize:longint;
|
|
var Count:longint;InfoLevel:longint):longint;
|
|
|
|
begin
|
|
DosEnumAttribute:=DosEnumAttribute(0,@Handle,Entry,Buf,BufSize,Count,
|
|
InfoLevel);
|
|
end;
|
|
|
|
function DosEnumAttribute(const FileName:string;
|
|
Entry:longint;var Buf;BufSize:longint;
|
|
var Count:longint;InfoLevel:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosEnumAttribute:=DosEnumAttribute(1,@T,Entry,Buf,BufSize,Count,
|
|
InfoLevel);
|
|
end;
|
|
|
|
function DosScanEnv(Name:PChar;var Value:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 227;
|
|
|
|
function DosScanEnv(const Name:string;var Value:string):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
P:PChar;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosScanEnv:=DosScanEnv(@T,P);
|
|
Value:=StrPas(P);
|
|
end;
|
|
|
|
function DosSearchPath(Flag:longint;DirList,FileName:PChar;
|
|
FullName:PChar;FullLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 228;
|
|
|
|
function DosSearchPath(Flag:longint;const DirList,FileName:string;
|
|
var FullName:string):longint;
|
|
|
|
var T1,T2,T3:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T1,DirList);
|
|
StrPCopy(@T2,FileName);
|
|
DosSearchPath:=DosSearchPath(Flag,@T1,@T2,@T3,SizeOf(T3));
|
|
FullName:=StrPas(@T3);
|
|
end;
|
|
|
|
function DosFSAttach(DevName,FileSystem:PChar;var Data:TAttachData;
|
|
DataLen,Flag:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 269;
|
|
|
|
function DosFSAttach(const DevName,FileSystem:string;var Data:TAttachData;
|
|
DataLen,Flag:longint):longint;
|
|
|
|
var T1,T2:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T1,DevName);
|
|
StrPCopy(@T2,FileSystem);
|
|
DosFSAttach:=DosFSAttach(@T1,@T2,Data,DataLen,Flag);
|
|
end;
|
|
|
|
function DosQueryFSAttach(DevName:PChar;Ordinal,InfoLevel:longint;
|
|
var Buffer:TFSQBuffer2;var BufLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 277;
|
|
|
|
function DosQueryFSAttach(const DevName:string;Ordinal,InfoLevel:longint;
|
|
var Buffer:TFSQBuffer2;var BufLen:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,DevName);
|
|
DosQueryFSAttach:=DosQueryFSAttach(@T,Ordinal,InfoLevel,Buffer,BufLen);
|
|
end;
|
|
|
|
function DosFSCtl(Data:pointer;DataLen:longint;var ResDataLen:longint;
|
|
Parms:pointer;ParmsLen:longint;var ResParmsLen:longint;
|
|
_Function:longint;Route:PChar;
|
|
Handle,Method:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 285;
|
|
|
|
function DosFSCtl(Data:pointer;DataLen:longint;var ResDataLen:longint;
|
|
Parms:pointer;ParmsLen:longint;var ResParmsLen:longint;
|
|
_Function:longint;const Route:string;
|
|
Handle,Method:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Route);
|
|
DosFSCtl:=DosFSCtl(Data,Datalen,ResDataLen,Parms,ParmsLen,ResParmsLen,
|
|
_Function,Route,Handle,Method);
|
|
end;
|
|
|
|
function DosQueryFSInfo(DiskNum,InfoLevel:longint;var Buffer:TFSInfo;
|
|
BufLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 278;
|
|
|
|
function DosSetFSInfo(DiskNum,InfoLevel:longint;var Buffer:TFSInfo;
|
|
BufLen:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 222;
|
|
|
|
function DosQueryVerify(var Enabled:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 225;
|
|
|
|
function DosSetVerify(Enable:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 210;
|
|
|
|
function DosSetMaxFH(Count:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 209;
|
|
|
|
function DosSetRelMaxFH(var ReqCount,CurMaxFH:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 382;
|
|
|
|
function DosShutDown(Flags:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 415;
|
|
|
|
function DosQuerySysInfo(First,Last:longint;var Buf;BufSize:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 348;
|
|
|
|
function DosPhysicalDisk(Func:longint;Buf:pointer;BufSize:longint;
|
|
Params:pointer;ParamSize:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 287;
|
|
|
|
function DosAllocMem(var P:pointer;Size,Flag:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 299;
|
|
|
|
function DosFreeMem(P:pointer):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 304;
|
|
|
|
function DosSetMem(P:pointer;Size,Flag:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 305;
|
|
|
|
function DosGiveSharedMem(P:pointer;PID,Flag:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 303;
|
|
|
|
function DosGetSharedMem(P:pointer;Flag:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 302;
|
|
|
|
function DosGetNamedSharedMem(var P:pointer;Name:PChar;Flag:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 301;
|
|
|
|
function DosGetNamedSharedMem(var P:pointer;const Name:string;
|
|
Flag:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosGetNamedSharedMem:=DosGetNamedSharedMem(P,@T,Flag);
|
|
end;
|
|
|
|
function DosAllocSharedMem(var P:pointer;Name:PChar;Size,Flag:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 300;
|
|
|
|
function DosAllocSharedMem(var P:pointer;const Name:string;
|
|
Size,Flag:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
if Name<>'' then
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosAllocSharedMem:=DosAllocSharedMem(P,@T,Size,Flag);
|
|
end
|
|
else
|
|
DosAllocSharedMem:=DosAllocSharedMem(P,nil,Size,Flag);
|
|
end;
|
|
|
|
function DosQueryMem(P:pointer;var Size,Flag:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 306;
|
|
|
|
function DosSubAllocMem(Base:pointer;var P:pointer;Size:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 345;
|
|
|
|
function DosSubFreeMem(Base,P:pointer;Size:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 346;
|
|
|
|
function DosSubSetMem(Base:pointer;Flag,Size:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 344;
|
|
|
|
function DosSubUnSetMem(Base:pointer):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 347;
|
|
|
|
function DosCreateEventSem(Name:PChar;var Handle:longint;
|
|
Attr,State:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 324;
|
|
|
|
function DosCreateEventSem(const Name:string;var Handle:longint;
|
|
Attr,State:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
if Name<>'' then
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCreateEventSem:=DosCreateEventSem(@T,Handle,Attr,State);
|
|
end
|
|
else
|
|
DosCreateEventSem:=DosCreateEventSem(nil,Handle,Attr,State);
|
|
end;
|
|
|
|
function DosOpenEventSem(Name:PChar;var Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 325;
|
|
|
|
function DosOpenEventSem(const Name:string;var Handle:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosOpenEventSem:=DosOpenEventSem(@T,Handle);
|
|
end;
|
|
|
|
function DosCloseEventSem(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 326;
|
|
|
|
function DosResetEventSem(Handle:longint;var PostCount:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 327;
|
|
|
|
function DosPostEventSem(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 328;
|
|
|
|
function DosWaitEventSem(Handle,Timeout:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 329;
|
|
|
|
function DosQueryEventSem(Handle:longint;var Posted:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 330;
|
|
|
|
function DosCreateMutExSem(Name:PChar;var Handle:longint;
|
|
Attr,State:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 331;
|
|
|
|
function DosCreateMutExSem(const Name:string;var Handle:longint;
|
|
Attr,State:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
if Name<>'' then
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCreateMutExSem:=DosCreateMutExSem(@T,Handle,Attr,State);
|
|
end
|
|
else
|
|
DosCreateMutExSem:=DosCreateMutExSem(nil,Handle,Attr,State);
|
|
end;
|
|
|
|
function DosOpenMutExSem(Name:PChar;var Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 332;
|
|
|
|
function DosOpenMutExSem(const Name:string;var Handle:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosOpenMutExSem:=DosOpenMutExSem(@T,Handle);
|
|
end;
|
|
|
|
function DosCloseMutExSem(handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 333;
|
|
|
|
function DosRequestMutExSem(Handle,Timeout:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 334;
|
|
|
|
function DosReleaseMutExSem(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 335;
|
|
|
|
function DosQueryMutExSem(Handle:longint;var PID,TID,Count:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 336;
|
|
|
|
function DosCreateMuxWaitSem(Name:PChar;var Handle:longint;CSemRec:longint;
|
|
var SemArray:TSemArray;Attr:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 337;
|
|
|
|
function DosCreateMuxWaitSem(const Name:string;var Handle:longint;
|
|
CSemRec:longint;var SemArray:TSemArray;
|
|
Attr:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
if Name<>'' then
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCreateMuxWaitSem:=DosCreateMuxWaitSem(@T,Handle,CSemRec,
|
|
SemArray,Attr);
|
|
end
|
|
else
|
|
DosCreateMuxWaitSem:=DosCreateMuxWaitSem(nil,Handle,CSemRec,SemArray,
|
|
Attr);
|
|
end;
|
|
|
|
function DosOpenMuxWaitSem(Name:PChar;var Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 338;
|
|
|
|
function DosOpenMuxWaitSem(const Name:string;var Handle:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosOpenMuxWaitSem:=DosOpenMuxWaitSem(@T,Handle);
|
|
end;
|
|
|
|
function DosCloseMuxWaitSem(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 339;
|
|
|
|
function DosWaitMuxWaitSem(Handle,Timeout:longint;var User:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 340;
|
|
|
|
function DosAddMuxWaitSem(Handle:longint;var SemRec:TSemRecord):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 341;
|
|
|
|
function DosDeleteMuxWaitSem(Handle,Sem:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 342;
|
|
|
|
function DosQueryMuxWaitSem(Handle:longint;var CSemRec:longint;
|
|
var SemRecs:TSemArray;var Attr:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 343;
|
|
|
|
function DosGetDateTime(var Buf:TDateTime):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 230;
|
|
|
|
function DosSetDateTime(var Buf:TDateTime):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 292;
|
|
|
|
function DosAsyncTimer(MSec,HSem:longint;
|
|
var TimHandle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 350;
|
|
|
|
function DosStartTimer(MSec,HSem:longint;
|
|
var TimHandle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 351;
|
|
|
|
function DosStopTimer(TimHandle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 290;
|
|
|
|
function DosTmrQueryFreq(var Freq:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 362;
|
|
|
|
function DosTmrQueryTime(var Time:comp):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 363;
|
|
|
|
function DosLoadModule(ObjName:PChar;ObjLen:longint;DLLName:PChar;
|
|
var Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 318;
|
|
|
|
function DosLoadModule(var ObjName:string;ObjLen:longint;
|
|
const DLLName:string;var Handle:longint):longint;
|
|
|
|
var T1,T2:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T2,DLLName);
|
|
DosLoadModule:=DosLoadModule(@T1,ObjLen,@T2,Handle);
|
|
ObjName:=StrPas(@T1);
|
|
end;
|
|
|
|
function DosFreeModule(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 322;
|
|
|
|
function DosQueryProcAddr(Handle,Ordinal:longint;ProcName:PChar;
|
|
var Address:pointer):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 321;
|
|
|
|
function DosQueryProcAddr(Handle,Ordinal:longint;
|
|
const ProcName:string;var Address:pointer):longint;
|
|
|
|
var T1:array[0..255] of char;
|
|
|
|
begin
|
|
if ProcName<>'' then
|
|
begin
|
|
StrPCopy(@T1,ProcName);
|
|
DosQueryProcAddr:=DosQueryProcAddr(Handle,Ordinal,@T1,Address);
|
|
end
|
|
else
|
|
DosQueryProcAddr:=DosQueryProcAddr(Handle,Ordinal,nil,Address);
|
|
end;
|
|
|
|
function DosQueryModuleHandle(DLLName:PChar;var Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 319;
|
|
|
|
function DosQueryModuleHandle(const DLLName:string;var Handle:longint):longint;
|
|
|
|
var T1:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T1,DLLName);
|
|
DosQueryModuleHandle:=DosQueryModuleHandle(@T1,Handle);
|
|
end;
|
|
|
|
function DosQueryModuleName(Handle,NameLen:longint;Name:PChar):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 320;
|
|
|
|
{function DosQueryModuleName(Handle:longint;var Name:openstring):longint;
|
|
|
|
var T1:array[0..255] of char;
|
|
|
|
begin
|
|
DosQueryModuleName:=DosQueryModuleName(Handle,High(Name),@T1);
|
|
Name:=StrPas(@T1);
|
|
end;}
|
|
|
|
function DosQueryProcType(Handle,Ordinal:longint;Name:PChar;
|
|
var ProcType:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 586;
|
|
|
|
function DosQueryProcType(Handle,Ordinal:longint;const Name:string;
|
|
var ProcType:longint):longint;
|
|
|
|
var T1:array[0..255] of char;
|
|
|
|
begin
|
|
if Name<>'' then
|
|
begin
|
|
StrPCopy(@T1,Name);
|
|
DosQueryProcType:=DosQueryProcType(Handle,Ordinal,@T1,ProcType);
|
|
end
|
|
else
|
|
DosQueryProcType:=DosQueryProcType(Handle,Ordinal,nil,ProcType);
|
|
end;
|
|
|
|
function DosGetResource(Handle,ResType,ResName:longint;var P:pointer):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 352;
|
|
|
|
function DosFreeResource(P:pointer):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 353;
|
|
|
|
function DosQueryResourceSize(Handle,IDT,IDN:longint;var Size:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 572;
|
|
|
|
function DosQueryCtryInfo(Size:longint;var Country:TCountryCode;
|
|
var Res:TCountryInfo;var ActualSize:longint):longint; cdecl;
|
|
|
|
external 'NLS' index 5;
|
|
|
|
function DosQueryDBCSEnv(Size:longint;var Country:TCountryCode;
|
|
Buf:PChar):longint; cdecl;
|
|
|
|
external 'NLS' index 6;
|
|
|
|
function DosMapCase(Size:longint;var Country:TCountryCode;
|
|
AString:PChar):longint; cdecl;
|
|
|
|
external 'NLS' index 7;
|
|
|
|
function DosMapCase(var Country:TCountryCode;var AString:string):longint;
|
|
|
|
var T1:string;
|
|
|
|
begin
|
|
StrPCopy(@T1,AString);
|
|
DosMapCase:=DosMapCase(length(AString),Country,@T1);
|
|
AString:=StrPas(@T1);
|
|
end;
|
|
|
|
function DosQueryCollate(Size:longint;var Country:TCountryCode;
|
|
buf:PByteArray;var TableLen:longint):longint; cdecl;
|
|
|
|
external 'NLS' index 8;
|
|
|
|
function DosQueryCP(Size:longint;CodePages:PWordArray;
|
|
var ActSize:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 291;
|
|
|
|
function DosSetProcessCP(CP:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 289;
|
|
|
|
function DosSetExceptionHandler(var RegRec:TExceptionRegistrationRecord
|
|
):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 354;
|
|
|
|
function DosUnsetExceptionHandler(var RegRec:TExceptionRegistrationRecord
|
|
):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 355;
|
|
|
|
function DosRaiseException(var Excpt:TExceptionReportRecord):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 356;
|
|
|
|
function DosSendSignalException(PID,Exception:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 379;
|
|
|
|
function DosUnwindException(var Handler:TExceptionRegistrationRecord;
|
|
TargetIP:pointer;
|
|
var RepRec:TExceptionReportRecord):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 357;
|
|
|
|
function DosSetSignalExceptionFocus(Enable:longint;var Times:longint):longint;
|
|
cdecl;
|
|
|
|
external 'DOSCALLS' index 378;
|
|
|
|
function DosEnterMustComplete(var Nesting:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 380;
|
|
|
|
function DosExitMustComplete(var Nesting:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 381;
|
|
|
|
function DosAcknowledgeSignalException(SignalNum:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 418;
|
|
|
|
function DosCloseQueue(Handle:longint):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 11;
|
|
|
|
function DosCreateQueue(var Handle:longint;Priority:longint;
|
|
Name:PChar):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 16;
|
|
|
|
function DosCreateQueue(var Handle:longint;Priority:longint;
|
|
const Name:string):longint;
|
|
|
|
var T1:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T1,Name);
|
|
DosCreateQueue:=DosCreateQueue(Handle,Priority,@T1);
|
|
end;
|
|
|
|
function DosOpenQueue(var Parent_PID:longint;var Handle:longint;
|
|
Name:PChar):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 15;
|
|
|
|
function DosOpenQueue(var Parent_PID:longint;var Handle:longint;
|
|
const Name:string):longint;
|
|
|
|
var T1:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T1,Name);
|
|
DosOpenQueue:=DosOpenQueue(Parent_PID,Handle,@T1);
|
|
end;
|
|
|
|
function DosPeekQueue(Handle:longint;var ReqBuffer:TRequestData;
|
|
var DataLen:longint;var DataPtr:pointer;
|
|
var Element:longint;Wait:longint;
|
|
var Priority:byte;ASem:longint):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 13;
|
|
|
|
function DosPurgeQueue(Handle:longint):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 10;
|
|
|
|
function DosQueryQueue(Handle:longint;var Count:longint):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 12;
|
|
|
|
function DosReadQueue(Handle:longint;var ReqBuffer:TRequestData;
|
|
var DataLen:longint;var DataPtr:pointer;
|
|
Element,Wait:longint;var Priority:byte;
|
|
ASem:longint):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 9;
|
|
|
|
function DosWriteQueue(Handle,Request,DataLen:longint;var DataBuf;
|
|
Priority:longint):longint; cdecl;
|
|
|
|
external 'QUECALLS' index 14;
|
|
|
|
function DosError(Error:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 212;
|
|
|
|
procedure DosErrClass(Code:longint;var _Class,Action,Locus:longint); cdecl;
|
|
|
|
external 'DOSCALLS' index 211;
|
|
|
|
function DosTrueGetMessage(MsgSeg:pointer;Table:PInsertTable;
|
|
TableSize:longint;Buf:PChar;BufSize,
|
|
MsgNumber:longint;FileName:PChar;
|
|
var MsgSize:longint):longint; {cdecl;}
|
|
|
|
external 'MSG' index 6;
|
|
|
|
function DosGetMessage(Table:PInsertTable;TableSize:longint;Buf:PChar;
|
|
BufSize,MsgNumber:longint;FileName:PChar;
|
|
var MsgSize:longint):longint;
|
|
|
|
external name 'DosGetMessage'; {Procedure is in code2.so2.}
|
|
|
|
(*function DosGetMessage(const Table:array of PString;var Buf:openstring;
|
|
MsgNumber:longint;const FileName:string):longint;
|
|
|
|
{Hmm. This takes too much stackspace. Let's use the
|
|
heap instead.}
|
|
|
|
type TTableBuffer=record
|
|
IT:TinsertTable;
|
|
Strings:TByteArray;
|
|
end;
|
|
PTableBuffer=^TTableBuffer;
|
|
|
|
var Buffer:PTableBuffer;
|
|
I,S:word;
|
|
BufPtr:pointer;
|
|
T1,T2:array[0..255] of char;
|
|
|
|
begin
|
|
{Check if there are more than nine items in the table.}
|
|
if High(Table)>8 then
|
|
DosGetMessage:=87
|
|
else
|
|
begin
|
|
{Step 1: Calculate the space we need on the heap.}
|
|
S:=SizeOf(TInsertTable);
|
|
for I:=Low(Table) to High(Table) do
|
|
S:=S+Length(Table[I])+1;
|
|
|
|
{Step 2: Allocate the buffer.}
|
|
GetMem(Buffer,S);
|
|
|
|
{Step 3: Fill the buffer.}
|
|
BufPtr:=@(S^.Strings);
|
|
for I:=Low(Table) to High(Table) do
|
|
begin
|
|
S^.IT[I+1]:=bufptr;
|
|
StrPCopy(BufPtr,Table[I]);
|
|
Inc(longint(BufPtr),Length(Table[I])+1);
|
|
end;
|
|
|
|
{Step 4: Convert the filename.}
|
|
StrPCopy(@T2,FileName);
|
|
|
|
{Step 5: Get the message.}
|
|
DosGetMessage:=DosGetMessage(@(S^.IT),High(Table)+1,@T1,
|
|
High(Buf),MsgNumber,@T2,I);
|
|
|
|
{Step 6: Convert the returned message.}
|
|
Buf[0]:=Char(I);
|
|
Move(T1,Buf[1],I);
|
|
|
|
{Step 7: Free the memory.}
|
|
FreeMem(Buffer,S);
|
|
end;
|
|
end;*)
|
|
|
|
{function DosGetMessage(const Table:array of PString;Buf:PChar;
|
|
BufSize,MsgNumber:longint;const FileName:string;
|
|
MsgSize:longint):longint;}
|
|
|
|
function DosInsertMessage(Table:PInsertTable;TableSize:longint;
|
|
Message:PChar;SrcMessageSize:longint;
|
|
Buf:PChar;BufSize:longint;
|
|
var DstMessageSize:longint):longint; cdecl;
|
|
|
|
external 'MSG' index 4;
|
|
|
|
{function DosInsertMessage(Table:array of PString;
|
|
const Message:string;
|
|
var Buf:openstring):longint;
|
|
|
|
function DosInsertMessage(Table:array of PString;
|
|
Message:PChar;SrcMessageSize:longint;
|
|
Buf:PChar;BufSize:longint;
|
|
var DstMessageSize:longint):longint;}
|
|
|
|
function DosPutMessage(Handle,Size:longint;Buf:PChar):longint; cdecl;
|
|
|
|
external 'MSG' index 5;
|
|
|
|
function DosPutMessage(Handle:longint;const Buf:string):longint;
|
|
|
|
begin
|
|
DosPutMessage:=DosPutMessage(Handle,Length(Buf),@Buf[1]);
|
|
end;
|
|
|
|
function DosIQueryMessageCP(var Buf;BufSize:longint;FileName:PChar;
|
|
var InfoSize:longint;MesSeg:pointer):longint; {cdecl;}
|
|
|
|
external 'MSG' index 8;
|
|
|
|
function DosQueryMessageCP(var Buf;BufSize:longint;FileName:PChar;
|
|
var InfoSize:longint):longint;
|
|
|
|
external name 'DosQueryMessageCP';
|
|
|
|
function DosQueryMessageCP(var Buf;BufSize:longint;const FileName:string;
|
|
var InfoSize:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,FileName);
|
|
DosQueryMessageCP:=DosQueryMessageCP(Buf,BufSize,@T,InfoSize);
|
|
end;
|
|
|
|
function DosStartSession(const AStartData:TStartData;
|
|
var SesID,PID:longint):longint; cdecl;
|
|
|
|
external 'SESMGR' index 37;
|
|
|
|
function DosSetSession(SesID:longint;const AStatus:TStatusData):longint; cdecl;
|
|
|
|
external 'SESMGR' index 39;
|
|
|
|
function DosSelectSession(SesID:longint):longint; cdecl;
|
|
|
|
external 'SESMGR' index 38;
|
|
|
|
function DosStopSession(Scope,SesID:longint):longint; cdecl;
|
|
|
|
external 'SESMGR' index 40;
|
|
|
|
function DosCreatePipe(var ReadHandle,WriteHandle:longint;
|
|
Size:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 239;
|
|
|
|
function DosCreateNPipe(Name:PChar;var Handle:longint;OpenMode,PipeMode,
|
|
OutBufSize,InBufSize,MSec:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 243;
|
|
|
|
function DosCreateNPipe(const Name:string;var Handle:longint;OpenMode,
|
|
PipeMode,OutBufSize,InBufSize,MSec:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCreateNPipe:=DosCreateNPipe(@T,Handle,OpenMode,PipeMode,OutBufSize,
|
|
InBufSize,MSec);
|
|
end;
|
|
|
|
function DosCallNPipe(Name:PChar;var Input;InputSize:longint;
|
|
var Output;OutputSize:longint;var ReadBytes:longint;
|
|
MSec:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 240;
|
|
|
|
function DosCallNPipe(const Name:string;var Input;InputSize:longint;
|
|
var Output;OutputSize:longint;var ReadBytes:longint;
|
|
MSec:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosCallNPipe:=DosCallNPipe(@T,Input,InputSize,Output,OutputSize,
|
|
ReadBytes,MSec);
|
|
end;
|
|
|
|
function DosConnectNPipe(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 241;
|
|
|
|
function DosDisconnectNPipe(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 242;
|
|
|
|
function DosPeekNPipe(Handle:longint;var Buffer;BufSize:longint;
|
|
var ReadBytes:longint;var Avail:TAvailData;
|
|
var State:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 244;
|
|
|
|
function DosQueryNPHState(Handle:longint;var State:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 245;
|
|
|
|
function DosQueryNPipeInfo(Handle,InfoLevel:longint;var Buffer;
|
|
BufSize:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 248;
|
|
|
|
function DosQueryNPipeSemState(SemHandle:longint;var SemArray;
|
|
BufSize:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 249;
|
|
|
|
function DosSetNPHState(Handle,State:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 250;
|
|
|
|
function DosSetNPipeSem(PipeHandle,SemHandle,Key:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 251;
|
|
|
|
function DosTransactNPipe(Handle:longint;var OutBuf;OutSize:longint;
|
|
var InBuf;InSize:longint;
|
|
var ReadBytes:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 252;
|
|
|
|
function DosWaitNPipe(Name:PChar;MSec:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 253;
|
|
|
|
function DosWaitNPipe(const Name:string;MSec:longint):longint;
|
|
|
|
var T:array[0..255] of char;
|
|
|
|
begin
|
|
StrPCopy(@T,Name);
|
|
DosWaitNPipe:=DosWaitNPipe(@T,MSec);
|
|
end;
|
|
|
|
function DosOpenVDD(Name:PChar;var Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 308;
|
|
|
|
function DosRequestVDD(Handle,SGroup,Cmd:longint;
|
|
InSize:longint;var InBuffer;
|
|
OutSize:longint;var OutBuffer):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 309;
|
|
|
|
function DosCloseVDD(Handle:longint):longint; cdecl;
|
|
|
|
external 'DOSCALLS' index 310;
|
|
|
|
procedure DosSelToFlat; cdecl;
|
|
|
|
external 'DOSCALLS' index 425;
|
|
|
|
procedure DosFlatToSel; cdecl;
|
|
|
|
external 'DOSCALLS' index 426;
|
|
|
|
{$ASMMODE INTEL}
|
|
function SelToFlat (AFarPtr: TFarPtr): pointer; cdecl;
|
|
begin
|
|
asm
|
|
mov eax, AFarPtr
|
|
call DosSelToFlat
|
|
end;
|
|
end;
|
|
|
|
function FlatToSel (APtr: pointer): cardinal; cdecl;
|
|
begin
|
|
asm
|
|
mov eax, APtr
|
|
call DosFlatToSel
|
|
end;
|
|
end;
|
|
|
|
(* Todo:
|
|
|
|
function DosRawReadNPipe ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 246;
|
|
|
|
function DosRawWriteNPipe ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 247;
|
|
|
|
function DosSetCP ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 288;
|
|
|
|
function DosDynamicTrace ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 316;
|
|
|
|
function DosRegisterPerfCtrs ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 367;
|
|
|
|
function DosQueryDOSProperty ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 373;
|
|
|
|
function DosSetDOSProperty ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 374;
|
|
|
|
function DosProfile ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 377;
|
|
|
|
function DosReplaceModule ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 417;
|
|
|
|
function DosTIB ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 419;
|
|
|
|
function DosOpenChangeNotify ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 440;
|
|
|
|
function DosResetChangeNotify ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 441;
|
|
|
|
function DosCloseChangeNotify ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 442;
|
|
|
|
function DosInitializePorthole ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 580;
|
|
|
|
function DosQueryHeaderInfo ...; cdecl;
|
|
|
|
external 'DOSCALLS' index 582;
|
|
|
|
*)
|
|
|
|
|
|
end.
|
|
{
|
|
$Log$
|
|
Revision 1.13 2000-05-09 17:29:52 hajny
|
|
* DosGetInfoBlocks updated again
|
|
|
|
Revision 1.12 2000/04/01 10:46:07 hajny
|
|
* DosGetInfoBloBlocks updated
|
|
|
|
Revision 1.11 2000/01/09 20:51:03 hajny
|
|
* FPK changed to FPC
|
|
|
|
Revision 1.10 2000/01/07 16:41:46 daniel
|
|
* copyright 2000
|
|
|
|
Revision 1.9 2000/01/07 16:32:30 daniel
|
|
* copyright 2000 added
|
|
|
|
Revision 1.8 1999/12/26 19:30:18 hajny
|
|
* cdecl modifications
|
|
|
|
Revision 1.7 1999/12/18 18:32:38 hajny
|
|
+ Starting cdecl additions
|
|
|
|
Revision 1.6 1999/08/10 14:18:40 hajny
|
|
* corrected characters >127 broken by DBCS editor
|
|
|
|
}
|