Jump to content

DosAllocMem: Difference between revisions

From EDM2
Ak120 (talk | contribs)
mNo edit summary
Ak120 (talk | contribs)
mNo edit summary
 
Line 13: Line 13:
:'''OBJ_TILE''' (0x00000040) forces the memory block to be allocated in the first 512MB of virtual-address space. Mapping the memory block is done with the 16-bit selectors. The following table shows how a 32-bit memory block is mapped using 16-bit selectors.
:'''OBJ_TILE''' (0x00000040) forces the memory block to be allocated in the first 512MB of virtual-address space. Mapping the memory block is done with the 16-bit selectors. The following table shows how a 32-bit memory block is mapped using 16-bit selectors.
{|class="wikitable"
{|class="wikitable"
|32bit Offset
|32bit Offset||16bit alias selectors
|16bit alias selectors
|-
|-
|BaseAddress+000KB
|BaseAddress+000KB||Sel
|Sel
|-
|-
|BaseAddress+064KB
|BaseAddress+064KB||Sel + HugeInc
|Sel + HugeInc
|-
|-
|BaseAddress+128KB
|BaseAddress+128KB||Sel + HugeInc * 2
|Sel + HugeInc * 2
|-
|-
|...
|...||...
|...
|}
|}
HugeInc is the same huge increment that is used by DosAllocHuge.
HugeInc is the same huge increment that is used by DosAllocHuge.
Line 38: Line 33:


=== Returns ===
=== Returns ===
APIRET rc
;APIRET rc:The following values can be returned:
The following values can be returned:
*0 NO_ERROR
*0 NO_ERROR
*8 ERROR_NOT_ENOUGH_MEMORY
*8 ERROR_NOT_ENOUGH_MEMORY
*87 ERROR_INVALID_PARAMETER
*87 ERROR_INVALID_PARAMETER
*95 ERROR_INTERRUPT
*95 ERROR_INTERRUPT
 
=== Sample Code ===
=== Sample Code ===
<PRE>
<PRE>

Latest revision as of 16:04, 8 November 2025

DosAllocMem is used to allocate a private memory object, within the boundaries of the virtual-address space.

Syntax

DosAllocMem( pBaseAddress, ulObjectSize, ulAllocationFlags )

Parameters

PPVOID pBaseAddress (output)
This is a pointer to the variable which will receive the base address of the allocated private memory object.
ULONG ulObjectSize (input)
The size in bytes of the memory block you want to allocate. This will, by the system, be rounded up to the next page-size boundary.
ULONG ulAllocationFlags (input)
Flags used to describe allocation attributes, as well as access protection of the private memory block.

Allocation attributes

PAG_COMMIT (0x00000010) makes all private memory blocks initially committed.
OBJ_TILE (0x00000040) forces the memory block to be allocated in the first 512MB of virtual-address space. Mapping the memory block is done with the 16-bit selectors. The following table shows how a 32-bit memory block is mapped using 16-bit selectors.
32bit Offset 16bit alias selectors
BaseAddress+000KB Sel
BaseAddress+064KB Sel + HugeInc
BaseAddress+128KB Sel + HugeInc * 2
... ...

HugeInc is the same huge increment that is used by DosAllocHuge.

Access protection

PAG_EXECUTE (0x00000004) tells the system that 'execute access' to the committed pages is desired in the memory block.
PAG_READ (0x00000001) tells the system that 'read access' is desired.
PAG_WRITE (0x00000002) tells the system that 'write access' is desired.
PAG_GUARD (0x00000008) tells the system that an access to the committed pages should cause a guard page exception to be raised.

At least one of PAG_EXECUTE, PAG_WRITE or PAG_READ must be set.

Returns

APIRET rc
The following values can be returned:
  • 0 NO_ERROR
  • 8 ERROR_NOT_ENOUGH_MEMORY
  • 87 ERROR_INVALID_PARAMETER
  • 95 ERROR_INTERRUPT

Sample Code

#define INCL_DOSMEMMGR
#include <os2.h>
#include <bsememf.h> /* This will get the memory managment flags */

PVOID BaseAddress;      /* Pointer to the allocated memory block  */
ULONG ObjectSize;       /* The requested size of the memory block */
ULONG AllocationFlags;  /* Flags                                  */
APIRET rc;              /* Will receive the return code           */

   ObjectSize = 9000;   /* Asking for 9000 bytes, this will */
                        /* rounded up to 12KB.              */

   AllocationFlags = PAG_WRITE | PAG_EXECUTE;
            /* Allows read/write to the memory block, but */
            /* the block isn't committed within memory    */
            /* yet.                                       */

   rc = DosAllocMem(&BaseAddress, ObjectSize, AllocationFlags);

   if ( rc != 0)
   {
     /* We have an error we must take care of. */
   }

See Also