home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / msc7.zip / DPMIMALL.C < prev    next >
C/C++ Source or Header  |  1992-02-12  |  3KB  |  107 lines

  1. //
  2. // (c) Copyright 1992, Qualitas, Inc. All Rights Reserved
  3. //
  4. // dpmimall.c - second level DPMI memory calls
  5. //
  6.  
  7. #include <dos.h>
  8. #include "dpmi.h"
  9.  
  10.  
  11. //======================================================================
  12. // Function: Allocate memory and selector
  13. //
  14. // Synopsis:
  15. //
  16. //    void far *DPMImalloc(uShort size, struct DPMImemory_t *mem)
  17. //
  18. // Description:
  19. //
  20. //    This is a higher level call that allocates a block of memory
  21. //    whose size is given by the size argument (size == 0 is taken
  22. //    to mean 64 KB), and allocates a descriptor to map it.  The 
  23. //    caller provides a pointer to a DPMImemory_t struct that records
  24. //    the memory handle and selector.  The function returns a far
  25. //    pointer to offset zero of the allocated block.
  26. //
  27. void far *DPMImalloc(uShort size, struct DPMImemory_t *mem)
  28. {
  29.     uLong lSize;
  30.     uLong base;
  31.     
  32.     lSize = size ? (uLong)size : 0x10000L;
  33.  
  34.     if (DPMIAllocateDescriptors(1, &mem->sel) != 0)
  35.     {
  36.         mem->handle = 0;
  37.         return 0;
  38.     }
  39.  
  40.     if (DPMIAllocateMemory(lSize, &base, &mem->handle) != 0)
  41.     {
  42.         DPMIFreeDescriptor(mem->sel);
  43.         return 0;
  44.     }
  45.  
  46.  
  47.     DPMISetSegmentBase(mem->sel, base);
  48.     DPMISetSegmentLimit(mem->sel, lSize-1);
  49.  
  50.     return (void far *)MK_FP(mem->sel, 0);
  51. }
  52.  
  53.  
  54. //======================================================================
  55. // Function: Free memory and selector
  56. //
  57. // Synopsis:
  58. //
  59. //    void DPMIfree(struct DPMImemory_t *mem)
  60. //
  61. // Description:
  62. //
  63. //    This function frees the memory block and selector allocated 
  64. //    by DPMImalloc.
  65. //
  66. void DPMIfree(struct DPMImemory_t *mem)
  67. {
  68.     DPMIFreeMemory(mem->handle);
  69.     DPMIFreeDescriptor(mem->sel);
  70. }
  71.  
  72.  
  73.  
  74. //======================================================================
  75. // Function: Resize memory and selector
  76. //
  77. // Synopsis:
  78. //
  79. //    boolean DPMIresize(uShort newSize, struct DPMImemory_t *mem)
  80. //
  81. // Description:
  82. //
  83. //    This function attempts to resize the memory block whose handle
  84. //    is found in the structure pointed to by the mem argument to
  85. //    the size indicated by the newSize argument. (As with DPMImalloc,
  86. //    newSize==0 is taken to mean 64 KB.) If successful, the limit
  87. //    of the corresponding descriptor is set accordingly.
  88. //
  89. //    The function returns TRUE if the resize operation is successful,
  90. //    otherwise false.
  91. //
  92. boolean DPMIresize(uShort newSize, struct DPMImemory_t *mem)
  93. {
  94.     uLong lSize;
  95.     uLong base;
  96.         
  97.         
  98.     lSize = newSize ? (uLong)newSize : 0x10000L; 
  99.     
  100.     if (DPMIResizeMemory(&mem->handle, lSize, &base) != 0)
  101.         return FALSE;
  102.     
  103.     DPMISetSegmentBase(mem->sel, base);
  104.     DPMISetSegmentLimit(mem->sel, lSize-1);
  105.  
  106.     return TRUE;
  107. }