[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 _xalloclow()
 Allocates low DOS memory for use with real mode interrupts that must be
 passed buffers within the first 1 MB
------------------------------------------------------------------------------
 C Prototype

     void *_xalloclow(unsigned int sizebytes)

 Returns

     This function returns a protected mode pointer to the allocated memory.

 Description

     This function returns a protected mode pointer to the allocated memory.
     Use this pointer to write to or read from the allocated buffer.  When
     calling a real mode interrupt you must get a real mode pointer to the
     allocated buffer with the ExoRealPtr() function and pass that address in
     the EXOREGS structure of a ExoRMInterrupt() call.

     You can allocate a 64K buffer by passing a size of 0.

     You must use _xfreelow() to free memory allocated with this function.
     Do not use xfree()!

     It is suggested that you free the allocated low DOS memory as soon as
     possible to keep down the amount of low DOS memory that may be allocated
     at the same time not only by your functions but also by other C/ASM code
     or by other third party libraries.

     CA-Clipper/Exospace has added the LOWMEM parameter to the CLIPPER
     environment variable to allow a developer to set aside low DOS memory
     for allocation with _xalloclow().  The LOWMEM parameter does not have to
     be specified in order for _xalloclow() to work; if there is no available
     low DOS memory when _xalloclow() is called, CA-Clipper/Exospace will
     free up low DOS memory it uses in order to meet the request.  At this
     time because of the current design of CA-Clipper/Exospace's memory
     allocation scheme we recommend that you ignore the LOWMEM parameter.
     Future revisions or individual end-user needs may make the LOWMEM
     parameter more necessary.

 Examples

     This example maps a fake root directory of a specified drive under
     Novell NetWare.  The function below accepts a drive number (0=default,
     1=A:, ...) and path for fake root; it returns zero on success and an
     error code if the function failed.

     int maproot(int drive, char *path)
     {
        int returnvalue = 0xFFFF;
        int flags;
        char *buffer;
        char *realptr;
        EXOREGS inoutregs;

        /* allocate low memory buffer to store path */
        if ((buffer = _xalloclow(strlen(path) + 1)) != NULL)
        {


            /* store path in low memory buffer */
           strcpy(buffer, path);

           /* get real mode pointer to low memory buffer */
           if ((realptr = ExoRealPtr(buffer)) != NULL)
           {

              /* fill in EXOREGS structure */

              inoutregs.ax = 0xE905;
              inoutregs.bx = drive;
              inoutregs.ds = FP_SEG(realptr);
              inoutregs.dx = FP_OFF(realptr);

              /* call the real mode interrupt */
              flags = ExoRMInterrupt(0x21, &inoutregs, &inoutregs);

              /* see if carry flag is set to indicate error */
              if (flags & 0x0001)
                 /* return error code in al */
                 returnvalue = (inoutregs.ax & 0x00FF);
              else
                 /* return no error code */
                 returnvalue = 0;
     }

           /* free low memory buffer */
           _xfreelow(buffer);
        }
     }

 Files   Library is EXOSPACE.LIB, header file is Exospace.api.


See Also: ExoRealPtr() ExoRMInterrupt() _xfreelow()
This page created by ng2html v1.05, the Norton guide to HTML conversion utility. Written by Dave Pearson