विंडोज़ पर वर्चुअल मेमोरी आवंटन 64 किलोबाइट्स की ग्रैन्युलरिटी के साथ बनाया जाता है, SYSTEM_INFO.dwAllocationGranularity का मान। लेकिन वर्चुअल मेमोरी पेज 4096 बाइट्स हैं, SYSTEM_INFO.dwPageSize का मान।
जब आप वर्चुअलअलोक के साथ वर्चुअल मेमोरी आवंटित करते हैं, तो आपको हमेशा एक हिस्सा वापस मिल जाएगा जिसका बेस एड्रेस ऑलोकेशनबेस के बराबर है। लेकिन यदि आप इस खंड के भीतर एक या अधिक पृष्ठों के पेज संरक्षण को बदलते हैं तो आप इस खंड को एक अलग बेस एड्रेस के साथ विभाजित कर सकते हैं। बेस्ट एक नमूना कार्यक्रम के साथ दिखाया गया है, MSVC पर ++ इस चलाएँ:
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
void showmem(void* mem) {
MEMORY_BASIC_INFORMATION info = {};
VirtualQuery(mem, &info, sizeof info);
printf("Alloc = %p, base = %p, size = %d, protect = %d\n",
info.AllocationBase, info.BaseAddress, info.RegionSize, info.Protect);
}
int main() {
BYTE* mem = (BYTE*)VirtualAlloc(0, 65536, MEM_COMMIT, PAGE_READWRITE);
printf("%s", "Initial allocation:\n");
showmem(mem);
DWORD oldprotect;
BOOL ok = VirtualProtect(mem + 4096, 4096, PAGE_NOACCESS, &oldprotect);
printf("%s", "\nAfter protection changes:\n");
showmem(mem);
showmem(mem + 4096);
showmem(mem + 4096 + 4096);
_getch();
return 0;
}
इस कार्यक्रम का नमूना उत्पादन:
Initial allocation:
Alloc = 00ED0000, base = 00ED0000, size = 65536, protect = 4
After protection changes:
Alloc = 00ED0000, base = 00ED0000, size = 4096, protect = 4
Alloc = 00ED0000, base = 00ED1000, size = 4096, protect = 1
Alloc = 00ED0000, base = 00ED2000, size = 57344, protect = 4
और ध्यान दें कि VirtualProtect() कॉल के लिए आवश्यक मूल हिस्सा 3 क्षेत्रों में विभाजित किया जा करने के लिए विभिन्न बेस एड्रेस के साथ लेकिन एक ही आवंटनबेस।