Virtual Memory


Virtual memory has some pretty cool tricks, however what are the basics of just using it.

/* valloc.c */

#include <Windows.h>

struct thing {
        int i;
};

int
main() {

        /* allocates the addresses but not the memory */
        LPVOID addr = VirtualAlloc(
                NULL,
                sizeof(struct thing) * 1000000000,
                MEM_RESERVE,
                PAGE_NOACCESS);

        /* we need the page size */
        SYSTEM_INFO sys_info;
        GetSystemInfo(&sys_info);


        /* reserve the memory, but it doesn't allocate until write,
           this allocates 2 pages of memory */
        addr = VirtualAlloc(
                addr,
                sys_info.dwPageSize * 2,
                MEM_COMMIT,
                PAGE_EXECUTE_READWRITE);

        /* cast the pointer then write */
        struct thing *th_array = (struct thing*)addr;

        th_array[0].i = 123;

        return 0;
}

Care must be taken that you only write within the pages you have allocated in the second call.

MSDN:VirtualAlloc