home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Large Pack of OldSkool DOS MOD Trackers
/
funk108a.zip
/
DOS32V30.ZIP
/
API.DOC
next >
Wrap
Text File
|
1995-06-14
|
31KB
|
839 lines
DOS32 Version 3.01
Applications Programing Interface (API)
14 June 1995
Copyright (C) 1994 Adam Seychell, All Rights Reserved.
This document contains detailed information of the DOS32 API
with each function obeying the following rules.
* All services are invoked from software interrupts 31h or 21h.
* Never call a function in a protected mode interrupt handler
unless otherwise said it is safe to do so.
* All services will preserve registers which are not returned
with any value.
The Interrupt 31h services.
The following list of services are called from INT 31h with AX
containing the function number.
GET DOS32 VERSION AND SELECTOR VALUES V3.00+
IN: AX = EE00h
OUT: AL = minor version ( BCD ) currently 01
AH = major version ( BCD ) " 03
DL = system type 1 = raw DOS
2 = XMS
4 = VCPI
8 = DPMI
BX = Selector of 4GB data segment with zero base
address.
Notes:
o This function may be called in a protected mode
interrupt handler.
GET DOS32 ADDRESS INFORMATION V3.01+
IN: AX = EE02h
OUT: EBX = 32bit linear address of the program segment
EDX = Total size in bytes of the programs .EXE file after
linking.
ESI = Offset address of PSP ( Program Segment Prefix )
EDI = Offset address of Program Environment
ECX = Offset address of the programs .EXE file name and
path (in ASCIZ format, i.e. terminates with a zero)
AX = Real mode segment value of the 8Kb buffer that is
used by the file read/write services.
Notes:
o All offset addresses returned are relative to the main
program segment.
o The .EXE file size is generally used for loading extra data
appended to the original application's .EXE file. The
application may simply seek to this postion to access the
appended data.
o The .EXE file name pointed by ECX is actually the file name
contained in the last string of the Environment segment
pointed to by EDI.
o The PSP address points to the original PSP set up by DOS.
Thus pointers stored in here still contain real mode
(segment:offset) values. Also this PSP address may not be the
same address returned by DOSs Int 21h AH=62h (Get PSP) since
DOS32 may of been loaded by a parent stub program.
o Since the segment address returned in AX points to the 8Kb
buffer used by the virtualized 32bit file read/write service
(INT 21h AH=3Fh/40h) then the contents of this buffer will be
distroyed apon call to these services. However, the
application may make temperary use of the buffer rather than
allocating a seperate DOS block for transfering data between
real mode and protected mode. The near pointer of the buffer
will be equal to (16*AX - EBX)
o This function may be called in a protected mode interrupt
handler.
TERMINATE AND STAY RESIDENT v3.00+
This service will terminate the application to DOS but leaving
it resident in memory.
IN: AX = EE30h
OUT: Never returns
Notes:
o All memory allocated from functions AX=0EE42h (memory block)
and AX=EE41h ( DMA buffer ) will not be freed and stay
allocated.
o This service may come in handy. Now.... what could you write
with a multi megabyte TSR ??
GET A REAL MODE CALL BACK ADDRESS
WITH IRET OR RETF STACK FRAME V3.00+
This service is used so that real mode software can call the
protected mode application. This function returns a real mode
address which when called (in real mode) will invoke a protected
mode procedure. The real mode address may either be called with
from a FAR CALL or from an INT n.
Expects: AX = EE20h ( for an RETF stack frame )
AX = EE21h ( for an IRET stack frame )
ESI -> Offset address of the protected mode
procedure to be invoked when the real
mode address is called. The procedure
must exit with a FAR return.
Returns:
If function was successful:
Carry flag is clear.
CX:DX = The real mode far pointer ( SEG:OFFSET )
to call the protected mode procedure.
If function was not successful:
Carry flag is set.
Notes:
o This function will fail if it's called more than 30 times.
o The protected mode procedure must exit with a FAR return
instruction.
o The procedure is called with undefined selectors in all
segment registers ( ES,DS,FS,GS & SS ) and is not required to
preserve any segment registers it modifies.
o EAX, EBX, ECX, EDX, ESI, EDI, EBP registers and flags will be
preserved across the mode switches.
o This function can be used to hook a Real Mode interrupts by
setting a real mode interrupt vector to point to the real
mode address (CX:DX) returned by this function. See examples
on how this may be done.
PHYSICAL MEMORY MAPPING V3.01+
The follwing function is used to access an area of physical
memory above the first 1Mb.
IN: AX = 0800h
BX:CX = Physical address of memory
SI:DI = Size of region to map in bytes
OUT: If function was successful:
Carry flag is clear.
BX:CX = Linear address that can be used to
access the physical memory.
Notes:
o The physical memory address should not in the lowwer megabyte
Only memory above 1Mb is allowed to be mapped.
o No more than 32Mb can be mapped with this function.
UNDO PREVIOUS MEMORY ALLOCATION v3.00+
This function will free the previously allocated memory
block ( function AX =EE41h ) or DMA buffer ( function AX=EE42h )
If this function is called multiple times then memory will be
deallocated in reverse order to when allocated. For example, if a
memory block was allocated followed by a DMA buffer then at first
time this function is called the DMA buffer would be freed, a
second call to this function will free the memory block, a third
call will return an error ( Carry set ) because at this point no
memory is being allocated.
IN: AX = EE40h
OUT: If function successful carry flag is cleared
If unsuccessful the carry flag is set
Notes:
o This function will fail if there is no memory allocated.
o All memory will automatically be freed when then
application terminates.
16KB BLOCK ALLOCATION FOR DMA CONTROLLER V3.00+
This function allocates a DMA buffer allowing the
application to do DMA transfers of up to 16KB at a time.
Expects: AX = EE41h
Returns:
If function was successful:
Carry flag is clear.
EBX = Physical address of a contiguous 16KB memory
block that dose not cross a 64KB boundary and
has a physical address in the lower 16MB.
EDX = Near pointer to the base address of the block
relative to the main program segment.
If function was not successful:
Carry flag is set.
NOTES:
o The 16Kb block will not cross a physical 64KB boundary and
will have a base address aligned on a 4 byte boundary. This
is just what DMA needs!.
o If the carry flag is set then there was not enough memory to
allocate the DMA block otherwise the carry flag is cleared.
o If the application needs to do use more than one DMA channel
at the same time ( e.g reading floppy disk at the same time
as sending music to a sound card ) then a buffer could be
allocated for each channel used.
o If all avalible memory was allocated by the Allocate Memory
service ( AX=0EE42h ) then this function will fail. Your
application should allocate it's DMA buffers before is tries
to allocate large blocks with the AX=0EE42h function.
o If you need to send large amounts of memory via DMA to a
device then it will have to be done in 16KB blocks. I know
this sounds very inefficient but I done tests and found that
I could not even measure the speed increase between 1Kb
blocks to 128Kb blocks. Only a noticeable slow down occurred
when transferring with blocks of 100 bytes or less. In fact
the time it takes to program the DMA controller and move a
16KB block to the buffer ( using REP MOVSD ) is under %1 of
the DMA transfer time. In other words, it will be less than
%1 slower using a buffer as opposed to transferring DMA
directly to/from the data area.
ALLOCATE A MEMORY BLOCK V3.00+
The entire application code,data and stack is initially
contained in one large memory block. This service here is used for
allocating extra memory blocks for the application.
IN: AX = EE42h
EDX = Size of the memory block requested to allocate in
bytes.
OUT: EAX = The actual allocated size of the memory block in bytes
EDX = Near pointer to the base address of the block relative
to the main program segment.
If the returned size was less than the requested size then
the Carry flag is set otherwise the carry flag is cleared.
Notes:
o The value expected in EDX will be rounded off to the next
4KB boundary. Example, allocating 51001h bytes will actually
allocate 52000h bytes.
o Never call this function in a interrupt handler or after
using the terminated and stay resident function ( AX=EE30h ).
o If EAX is returned with zero then no memory was allocated and
contents of EDX are undefined.
o The function will fail if the requested size is zero.
o No more than 64 allocations can be made.
o When not running under a DPMI server ( i.e Raw,XMS or VCPI )
then extended memory is allocated before conventional memory
is. For example, if there is no more extended memory free
then conventional memory will be allocated. In either case
DOS32 sets up the 386 page tables such that the allocated
memory is addressed in a straight linear block when it may
actually be physically scattered throughout RAM.
The Interrupt descriptor table services
These services allow the application to get and set vectors
of the protected mode interrupt descriptor table. The hardware
interrupt vectors will always be set the default values. i.e
IRQs 0..7 map onto CPU interrupts 8..15 and IRQs 8..15 map onto
CPU interrupts 70h..77h.
All protected mode interrupt vectors will initially
reflect to the same interrupt in real mode. In other words a
switched to and from real mode is automatically made when a
protected mode interrupt is called. The registers
EAX,ECX,EDX,EBX,EBP,ESI,EDI and flags will be preserved across the
mode switch. The exception to this rule are protected mode
interrupts 0,1,3,4,5,6 and 7. These are exceptions and will
terminate the program reporting with an error on the screen.
Hardware interrupt handlers will be called with undefined
selectors in all data segment registers. The interrupt handler
must preserve all modified general registers and segment registers
before it returns from the interrupt.
The application is responsible for returning the original
interrupt vectors before the application terminates. It is only
necessary do to this when running under a DPMI server. However,
for reliability, ALL modified interrupt vectors should be restored
to their original value.
GET PROTECTED MODE INTERRUPT VECTOR V3.00+
IN: AX = 0204h
BL = interrupt
OUT: EDX = The 32 bit offset of the vector
CX = Selector of vector
SET PROTECTED MODE INTERRUPT VECTOR V3.00
IN: AX = 0205h
BL = interrupt
EDX = The 32 bit offset of the vector
CX = Selector of vector ( must be a code selector )
OUT: nothing
REAL MODE CALL SERVICES
The following three services are used for calling real mode
programs (e.g a DOS call or a device driver). Each of these
services operate identically to the DPMI specification
(AX=300h/301h/302h). Each function expects a pointer to a real
mode call structure whish is used to passing all registers to and
from the real mode switch. The format of the structure is defined
as:
Offset Register
00h EDI
04h ESI
08h EBP
0Ch Reserved by system
10h EBX
14h EDX
18h ECX
1Ch EAX
20h Flags
22h ES
24h DS
26h FS
28h GS
2Ah IP
2Ch CS
2Eh SP
30h SS
Simulate a Real Mode interrupt V3.00+
IN:
AX = 0300h
BL = Interrupt number
BH = Flags
Bit 0 = 1 resets the interrupt controller and A20
line. Other flags reserved and must be 0
CX = Number of words to copy from protected mode to
real mode stack
ES:EDI = Selector:Offset of real mode call structure
OUT:
If function was successful:
Carry flag is clear.
ES:(E)DI = Selector:Offset of modified real mode call
structure
If function was not successful:
Carry flag is set.
Call Real Mode Procedure With Far Return Stack Frame V3.00+
IN: AX = 0301h
BH = Flags
Bit 0 = 1 resets the interrupt controller and A20
line. Other flags reserved and must be 0
CX = Number of words to copy from protected mode to
real mode stack
ES:EDI = Selector:Offset of real mode call structure
OUT:
If function was successful:
Carry flag is clear.
ES:EDI = Selector:Offset of modified real mode call
structure
If function was not successful:
Carry flag is set.
Call Real Mode Procedure With IRET Stack Frame V3.00+
IN: AX = 0302h
BH = Flags
Bit 0 = 1 resets the interrupt controller and A20
line. Other flags reserved and must be 0
CX = Number of words to copy from protected mode to
real mode stack
ES:EDI = Selector:Offset of real mode call structure
OUT:
If function was successful:
Carry flag is clear.
ES:EDI = Selector:Offset of modified real mode call
structure
If function was not successful:
Carry flag is set.
The 32 bit DOS type services
The following services are like a protected mode version of
DOS's services. They are called the same way as in real mode where
AH=function and invoked with INT 21h. The main differences is the
use of protected mode 48bit far pointers (selector:offset) and
32bit registers rather than only 16bit registers and real mode far
pointers (segment:offset). For a more detailed description of how
the services work please refer to DOS programming documentation.
The description below is only to show the use of 32 bit registers.
NOTE: If an INT 21h function is called and is not described here
then the interrupt is done in real mode with all the registers
passed to from the call. This is also the case for any other
protected mode interrupt, not just INT 21h!.
------------------------------------------------------------------
WRITE STRING TO STANDARD OUTPUT V3.0+
AH = 09h
DS:EDX -> '$'-terminated string
------------------------------------------------------------------
CREATE SUBDIRECTORY V3.0+
AH = 39h
DS:EDX -> Selector:Offset of ASCIZ pathname
Return: CF clear if successful
AX destroyed
CF set on error
AX = error code (03h,05h)
------------------------------------------------------------------
REMOVE SUBDIRECTORY V3.0+
AH = 3Ah
DS:EDX -> Selector:Offset ASCIZ pathname of directory to
be removed
Return: CF clear if successful
AX destroyed
CF set on error
AX = error code (03h,05h,06h,10h)
------------------------------------------------------------------
CHANGE SUBDIRECTORY V3.0+
AH = 3Bh
DS:EDX -> ASCIZ pathname to become current directory (max
64 bytes)
Return: CF clear if successful
AX destroyed
CF set on error
AX = error code (03h)
------------------------------------------------------------------
CREATE OR TRUNCATE FILE V3.0+
AH = 3Ch
CX = file attributes
DS:EDX -> Selector:Offset ASCIZ filename
Return: CF clear if successful
AX = file handle
CF set on error
AX = error code (03h,04h,05h)
------------------------------------------------------------------
OPEN EXISTING FILE V3.0+
AH = 3Dh
AL = access and sharing modes
DS:EDX -> Selector:Offset ASCIZ filename
CL = attribute mask of files to look for (server call only)
Return: CF clear if successful
AX = file handle
CF set on error
AX = error code (01h,02h,03h,04h,05h,0Ch,56h)
------------------------------------------------------------------
READ FROM FILE OR DEVICE V3.0+
AH = 3Fh
BX = file handle
ECX = number of bytes to read ( may be zero )
DS:EDX -> Selector:Offset buffer for data
Return: CF clear if successful
EAX = number of bytes actually read (0 if at EOF before
call)
CF set on error
AX = error code (05h,06h)
------------------------------------------------------------------
WRITE TO FILE OR DEVICE V3.0+
AH = 40h
BX = file handle
ECX = number of bytes to write
DS:EDX -> Selector:Offset data to write
Return: CF clear if successful
EAX = number of bytes actually written
CF set on error
AX = error code (05h,06h)
------------------------------------------------------------------
DELETE FILE V3.0+
AH = 41h
DS:EDX -> Selector:Offset ASCIZ filename (no wildcards )
Return: CF clear if successful
CF set on error
AX = error code (02h,03h,05h)
------------------------------------------------------------------
SET CURRENT FILE POSITION V3.0+
AH = 42h
AL = origin of move
00h start of file
01h current file position
02h end of file
BX = file handle
EDX = offset from origin of new file position
Return: CF clear if successful
EAX = new file position in bytes from start of file
CF set on error
AX = error code (01h,06h)
Notes: The normal real mode DOS function uses CX:DX as the
position of the file to seek and returns DX:AX with the
new value of the position. This protected mode version
uses EDX in place of CX:DX and uses EAX in place of
DX:AX.
------------------------------------------------------------------
GET FILE ATTRIBUTES V3.0+
AX = 4300h
DS:EDX -> Selector:Offset ASCIZ filename
Return: CF clear if successful
CX = file attributes
AX = CX (DR-DOS 5.0)
CF set on error
AX = error code (01h,02h,03h,05h)
-----------------------------------------------------------------
SET FILE ATTRIBUTES V3.0+
AX = 4301h
CX = new file attributes
DS:EDX -> Selector:Offset ASCIZ filename
Return: CF clear if successful
AX destroyed
CF set on error
AX = error code (01h,02h,03h,05h)
------------------------------------------------------------------
GET CURRENT DIRECTORY V3.0+
AH = 47h
DL = drive number (00h = default, 01h = A:, etc)
DS:ESI -> Selector:Offset 64-byte buffer for ASCIZ pathname
Return: CF clear if successful
AX = 0100h (undocumented)
CF set on error
AX = error code (0Fh)
------------------------------------------------------------------
LOAD AND/OR EXECUTE PROGRAM V3.0+
AH = 4Bh
AL = type of load
00h load and execute
01h load but do not execute
DS:EDX -> ASCIZ program name (must include extension)
DS:EDI -> Program environment to copy for child process (copy
caller's environment if EDI = zero )
DS:ESI -> pointer to command tail to be copied into child's
PSP
Return: CF clear if successful
CF set on error
AX = error code (01h,02h,05h,08h,0Ah,0Bh)
Notes: Unlike DOS's 4Bh function this does not require a
parameter block to be set up. The environment and
command tail are pointed to by DS:EDI and DS:ESI
respectively. See the examples distributed with DOS32 on
how this function may be used. It seems that MS-DOS will
redirect the current DTA address after this function is
called. When this service is called the current DTA
address will be reset to the default area of 80h bytes
ahead the PSP address.
------------------------------------------------------------------
TERMINATE WITH RETURN CODE V3.0+
AH = 4Ch
AL = return code
Return: never returns
Notes:
o DOS32 applications MUST ALWAYS terminate with this call.
o All memory allocated ( including DMA buffers and DOS blocks )
will automatically be freed when the application terminates
with this call.
------------------------------------------------------------------
FIND FIRST MATCHING FILE V3.0+
AH = 4Eh
CX = file attribute mask
DS:EDX -> ASCIZ file specification (may include path and
wildcards)
Returns: CF clear if successful
The DTA ( Disk Transfer Area ) is filled with file
information.
CF set on error
AX = Error code (02h, 03h, or 12h)
Notes:
The DTA is set to the default area which is at offset 80h
in the Program Segment Prefix (PSP). See function INT 31h
AX=EE02h for obtaining the PSP address.
------------------------------------------------------------------
RENAME FILE V3.0+
AH = 56h
DS:EDX -> ASCIZ filename of existing file (no wildcards )
ES:EDI -> ASCIZ new filename (no wildcards)
Return: CF clear if successful
CF set on error
AX = error code (02h,03h,05h,11h)
------------------------------------------------------------------
CREATE TEMPORARY FILE V3.0+
AH = 5Ah
CX = file attribute
DS:EDX -> ASCIZ path ending with a '\' + 13 zero bytes to
receive the generated filename.
Return: CF clear if successful
AX = file handle opened for read/write in compatibility
mode
DS:EDX -> pathname extended with generated name for
temporary file.
CF set on error
AX = error code (03h,04h,05h)
------------------------------------------------------------------
CREATE NEW FILE V3.00+
AH = 5Bh
CX = file attribute
DS:EDX -> ASCIZ filename
Return: CF clear if successful
AX = file handle opened for read/write in compatibility
mode
CF set on error
AX = error code (03h,04h,05h,50h)
< END OF DOS32 API >