Files
oldlinux-files/study/sabre/os/files/ProtectedMode/DPMI1.0Spec/descriptor-rules.html
2024-02-19 00:25:23 -05:00

80 lines
3.2 KiB
HTML

The following table shows the DPMI client's restrictions on usage of
previously allocated descriptors as input parameters to DPMI
functions. The columns represent the ways the DPMI host allocates
descriptors for its clients. (The first two columns represent LDT
descriptor management functions which allocate descriptors, the third
column represents DOS memory functions, and the last column represents
"other" descriptors, i.e., unallocated descriptors or descriptors used
by the DPMI host for internal purposes.) Each row represents a set of
functions where a client passes those previously allocated
descriptor(s) to the host as input parameters. A `N' indicates that
an "Invalid Selector" error will be generated if the given descriptor
is used in the specified function.<p>
Note that a `Y' for a given entry does not indicate that the function
will succeed, only that it will not generate an "Invalid Selector"
error. Similarly, an `N' does not necessarily indicate a descriptor
is invalid for referencing memory, only that it cannot be used with
that particular function. This chart does not address the usage of
descriptors in pointers. <p>
For example, descriptors allocated by the Allocate LDT Descriptor function
may be used in any of the interrogation and modification functions of
LDT Descriptor Management, as well as the functions which set
exception handlers and interrupt vectors. They may not be passed to
Allocate Specific LDT Descriptor or the DOS Memory Block Functions.<p>
<table border=1 cellspacing=0 cellpadding=4>
<tr> <td>&nbsp;</td> <th colspan=4>Descriptor Allocators</th></tr>
<tr> <th>Functions referring to allocated descriptors</th>
<td>Allocate LDT Descriptor, Allocate Specfic LDT Descriptor, Create Alias descriptr, Initial CS, DS, SS</td>
<td>Segment to Descriptor, PSP, Environment Pointer, Callback DS, Locked Stack SS</td>
<td>Allocate/Resize DOS Memory Block</td>
<td> GDT-based Descriptor, System Descriptor, Unallocated Descriptor</td></tr>
<tr><td>Interrogation Functions: Get Segment Base Address, Get Descriptor, Get Multiple Descriptor, Create Segment Alias</td>
<td align=center>Y</td> <td align=center>Y</td> <td align=center>Y</td> <td align=center>N</td></tr>
<tr><td> Modification Functions: Set Segment Base Address, Set Segment Limit, Set Descriptor Access Rights, Set Descriptor, Set Multiple Descriptors, Free LDT Descriptor</td>
<td align=center>Y</td> <td align=center>N</td> <td align=center>N</td> <td align=center>N</td></tr>
<tr><td> Allocate Specific LDT Descriptor</td>
<td align=center>N</td> <td align=center>N</td> <td align=center>N</td> <td align=center>Y(1)</td></tr>
<tr><td>Free/Resize DOS Memory Block</td>
<td align=center>N</td> <td align=center>N</td> <td align=center>Y</td> <td align=center>N</td></tr>
<tr><td>Set Exception Handler/Interrupt Vector</td>
<td align=center>Y</td> <td align=center>Y(3)</td> <td align=center>Y</td> <td align=center>Y(2)</td></tr>
</table><p>
Notes:
<ol>
<li> Unallocated descriptors within the range of the LDT only.
<li> GDT-Based segment descriptors only.
<li> Although this call will succeed, a fault will result if the
exception or interrupt occurs, since the segment can never be made
executable.
</ul>