Так, интересно.
Вот моя структура значения флагов:
typedef struct Flags
{
int Paged :1;
int Compressed :1;
int CPUSize:4; //RealCPUSize=2^(CPUSize+8);
int CPULargeCount:7;
int CPUSmallPage2:1;
int CPUSmallPage4:1;
int CPUSmallPage8:1;
int CPUSmallPage16:1;
int GPUSize:4; //RealGPUSize=2^(GPUSize+8);
int GPULargeCount:7;
int GPUSmallPage2:1;
int GPUSmallPage4:1;
int GPUSmallPage8:1;
int GPUSmallPage16:1;
};
Чтобы реализовать чтение через Delphi/C++, привожу пример из pgBase.cpp:
WORD vpageCount = dwRscFlags & 0x7FF; // virtual memory block page count
WORD largeVpageCount = vpageCount >> 4;
DWORD vpageSize = ((dwRscFlags >> 11) & 15)+8;
WORD ppageCount = (dwRscFlags >> 15) & 0x7FF; // physical memory block page count;
WORD largePpageCount = ppageCount >> 4;
DWORD ppageSize = ((dwRscFlags >> 26) & 15)+8;
С побитовым чтением проблем возникнуть не должно, сейчас думаю как действовать с записью. Если даже не делать оптимальную раскладку структур по блокам, пока что появляется слишком много непоняток.
Вот допустим имеется часть памяти размером 4096.
Size = log2(4096-12); //Надо ли еще где-то использовать оригинальный размер, или же везде Size?
LargePageSize = (1<<(Size)); //Это значение должно быть округлено до кратного двум, вверх.
LargeCount = (Size/(LargePageSize)); //Целочисленное деление
Далее, Size-LargePageSize надо разделять на маленькие страницы?