Windows core programming tells us that the 4G virtual space for each application can be divided into 4 chunks:
0x0000 0000 ~ 0x0000 FFFF: null pointer assignment partition
0x0001 0000 ~ 0x7ffe FFFF: User-mode partitioning
0x7fff 0000 ~ 0x7fff ffff:64k ban on zoning
0x8000 0000 ~ 0xFFFF FFFF: kernel-mode partitioning
But to be specific, you need to study for yourself.
Let's take a look at how an application uses this 4G of space. First write a section of code to query the 4G space in the general classification of memory blocks:
SYSTEM_INFO info;
MEMORY_BASIC_INFORMATION mi;
HANDLE hProcess;
DWORD dwAddr;
MEMORY_BASIC_INFORMATION miBlock[1000];
int nCount = 0;
hProcess = GetCurrentProcess();
GetSystemInfo(&info);
dwAddr = (DWORD) info.lpMinimumApplicationAddress;
do
{
VirtualQueryEx(hProcess, (LPCVOID) dwAddr, &mi, sizeof(mi));
memcpy(&miBlock[nCount++], &mi, sizeof(mi));
dwAddr += mi.RegionSize;
} while(dwAddr < (DWORD) info.lpMaximumApplicationAddress);
print_block_table(miBlock, nCount);
……
In this way, you will get 249 blocks of memory, as shown in the following table (all values are 16):