VirtualAlloc
The VirtualAlloc
function reserves or commits a region of pages in the virtual address space of
the calling process. Memory allocated by this function is automatically
initialized to zero.
LPVOID VirtualAlloc(
LPVOID lpAddress, |
// address of
region to reserve or commit |
DWORD dwSize, |
// size of region |
DWORD flAllocationType, |
// type of
allocation |
DWORD flProtect |
// type of access
protection |
); |
|
Parameters
lpAddress
Specifies the
desired starting address of the region to allocate. If the memory is being
reserved, the specified address is rounded down to the next 64-kilobyte
boundary. If the memory is already reserved and is being committed, the address
is rounded down to the next page boundary. To determine the size of a page on
the host computer, use the GetSystemInfo
dwSize
Specifies the
size, in bytes, of the region. If the lpAddress parameter is NULL, this
value is rounded up to the next page boundary. Otherwise, the allocated pages
include all pages containing one or more bytes in the range from lpAddress
to (lpAddress+dwSize). This means that a 2-byte range straddling
a page boundary causes both pages to be included in the allocated region.
flAllocationType
Specifies the
type of allocation. You can specify any combination of the following flags:
Flag |
Meaning |
MEM_COMMIT |
Allocates
physical storage in memory or in the paging file on disk for the specified
region of pages. |
|
An attempt
to commit an already committed page will not cause the function to fail. This
means that a range of committed or decommitted pages can be committed without
having to worry about a failure. |
MEM_RESERVE |
Reserves a
range of the process s virtual address space without allocating any physical
storage. The reserved range cannot be used by any other allocation operations
(the malloc function, the LocalAlloc2_D2EE function, and so on) until it is
released. Reserved pages can be committed in subsequent calls to the VirtualAlloc
function. |
MEM_TOP_DOWN |
Allocates
memory at the highest possible address. |
flProtect
Specifies the
type of access protection. If the pages are being committed, any one of the
following flags can be specified, along with the PAGE_GUARD and PAGE_NOCACHE
protection modifier flags, as desired:
Flag |
Meaning |
PAGE_READONLY |
Enables
read access to the committed region of pages. An attempt to write to the
committed region results in an access violation. If the system differentiates
between read-only access and execute access, an attempt to execute code in
the committed region results in an access violation. |
PAGE_READWRITE |
Enables
both read and write access to the committed region of pages. |
PAGE_EXECUTE |
Enables
execute access to the committed region of pages. An attempt to read or write
to the committed region results in an access violation. |
PAGE_EXECUTE_READ |
Enables
execute and read access to the committed region of pages. An attempt to write
to the committed region results in an access violation. |
PAGE_EXECUTE_READWRITE |
Enables
execute, read, and write access to the committed region of pages. |
PAGE_GUARD |
Pages in
the region become guard pages. Any attempt to read from or write to a guard
page causes the operating system to raise a STATUS_GUARD_PAGE exception and
turn off the guard page status. Guard pages thus act as a one-shot access
alarm. The
PAGE_GUARD flag is a page protection modifier. An application uses it with
one of the other page protection flags, with one exception: It cannot be used
with PAGE_NOACCESS. When an access attempt leads the operating system to turn
off guard page status, the underlying page protection takes over. If a guard
page exception occurs during a system service, the service typically returns
a failure status indicator. |
PAGE_NOACCESS |
Disables
all access to the committed region of pages. An attempt to read from, write
to, or execute in the committed region results in an access violation
exception, called a general protection (GP) fault. |
PAGE_NOCACHE |
Allows no
caching of the committed regions of pages. The hardware attributes for the
physical memory should be specified as no
cache. This is not recommended for general usage. It is
useful for device drivers; for example, mapping a video frame buffer with no
caching. This flag is a page protection modifier, only valid when used with
one of the page protections other than PAGE_NOACCESS. |
Return Values
If the
function succeeds, the return value is the base address of the allocated region
of pages.
If the
function fails, the return value is NULL. To get extended error information,
call GetLastError
Remarks
VirtualAlloc can perform the following operations:
Commit a region of pages
reserved by a previous call to the VirtualAlloc function.
Reserve a region of free pages.
Reserve and commit a region of
free pages.
You can use VirtualAlloc
to reserve a block of pages and then make additional calls to VirtualAlloc
to commit individual pages from the reserved block. This enables a process to
reserve a range of its virtual address space without consuming physical storage
until it is needed.
Each page in
the process s virtual address space is in one of three states:
State |
Meaning |
Free |
The page is
not committed or reserved and is not accessible to the process. VirtualAlloc
can reserve, or simultaneously reserve and commit, a free page. |
Reserved |
The range
of addresses cannot be used by other allocation functions, but the page is
not accessible and has no physical storage associated with it. VirtualAlloc
can commit a reserved page, but it cannot reserve it a second time. The VirtualFree |
Committed |
Physical
storage is allocated for the page, and access is controlled by a protection
code. The system initializes and loads each committed page into physical
memory only at the first attempt to read or write to that page. When the
process terminates, the system releases the storage for committed pages. VirtualAlloc
can commit an already committed page. This means that you can commit a range
of pages, regardless of whether they have already been committed, and the
function will not fail. VirtualFree can decommit a committed page, releasing the
page s storage, or it can simultaneously decommit and
release a committed page. |
If the lpAddress
parameter is not NULL, the function uses the lpAddress and dwSize
parameters to compute the region of pages to be allocated. The current state of
the entire range of pages must be compatible with the type of allocation
specified by the flAllocationType parameter. Otherwise, the function
fails and none of the pages are allocated. This compatibility requirement does
not preclude committing an already committed page; see the preceding list.
The
PAGE_GUARD protection modifier flag establishes guard pages. Guard pages act as
one-shot access alarms. See Guard Pages
See Also