[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
ExoSegDSAlias()
Creates a data descriptor for the given code segment
------------------------------------------------------------------------------
C Prototype
void *ExoSegDSAlias(void *pm_ptr)
Returns
This function returns a data pointer to the same linear address as
pm_ptr, or NULL if an error occurred.
Description
This function creates a new data descriptor with the same base as the
segment specified by pm_ptr. After the call to ExoSegDSAlias(), the
descriptor indicated in pm_ptr still exists and retains its original
segment type. The offset of the alias will ALWAYS equal the offset of
the original pointer.
ExoFreeSelector() MUST be called to free the selector allocated with
ExoSegDSAlias(). Selectors are a limited resource and repeated calls to
ExoSegDSAlias() as well as ExoSegCSAlias() and ExoProtectedPtr() could
use up all the available selectors causing the program to crash. Once
you are done with a pointer created with ExoSegDSAlias(), free the
selector unless you will be using the pointer throughout the program.
Examples
The example below consists of two modules: one in assembly language and
one in C. The int_instruction label in the assembly code marks the
location of an instruction signaling Interrupt 0h. The C code
overwrites this instruction so that a different interrupt is signaled.
The C code calls ExoSegDSAlias() to get an alias data pointer to
int_instruction. The example then increments the pointer by one byte to
point to the location of "0h" in the instruction. The example overwrites
this location with "0x88" and frees the data descriptor with
ExoFreeSelector() since it is no longer needed.
public _do_int, int_instruction
_do_int:
...
int_instruction:
int 0h
...
char *data;
extern int_instruction();
/* create data segment alias and write interrupt number 0x88 */
data = ExoSegDSAlias(int_instruction);
*(data + 1) = 0x88;
/* mark code segment as resident so the VMM system won't swap
it out and lose the changes made to it */
ExoReside(int_instruction);
/* free the selector created by ExoSegDSAlias() since we don't
need it anymore */
ExoFreeSelector(FP_SEG(data));
Files Library is EXOSPACE.LIB, header file is Exospace.api.
See Also:
ExoSegCSAlias()
This page created by ng2html v1.05, the Norton guide to HTML conversion utility.
Written by Dave Pearson