FSH_SEGALLOC
Purpose
This function allocates a GDT or LDT selector. The selector will have read/write access. An FSD may call this function.
Calling Sequence
int far pascal FSH_SEGALLOC(flags, cbSeg, pSel) unsigned short flags; unsigned long cbSeg; unsigned short far * pSel;
Where
flags indicate GDT/LDT, protection ring, swappable/non-swappable.
Bit 0x0001 off | indicates GDT selector returned. |
Bit 0x0001 on | indicates LDT selector returned. |
Bit 0x0002 off | indicates non-swappable memory. |
Bit 0x0002 on | indicates swappable memory. |
Bits 13 and 14 | are the desired ring number. |
All other bits are reserved and must be zero. |
cbSeg is the length of the segment.
pSel is the far address of the location where the allocated selector will be stored.
Returns
If no error is detected, a zero error code is returned. If an error is detected, one of the following error codes is returned:
- ERROR_INTERRUPT – the current thread received a signal.
- ERROR_INVALID_PARAMETER – the reserved bits in flags are set or requested size is too large.
- ERROR_NOT_ENOUGH_MEMORY – too much memory is allocated.
Remarks
It is strongly suggested that FSDs allocate all their data at protection level 0 for maximum protection from user programs.
GDT selectors are a scarce resource; the FSD must be prepared to expect an error for allocation of a GDT segment. The FSD should limit itself to a maximum of 10 GDT segments. It is suggested that a large segment be allocated for each type of data and divided into per-process records.
FSH_SEGALLOC may block.
Take care to avoid deadlocks between swappable segments and swapper requests.
Note: OS/2 does not validate input parameters. An FSD, therefore, should call FSH_PROBEBUF where appropriate.