我正在使用支持PAE的32位Windows XP SP3和8GB物理内存。
我想要的只是使用AWE从黑暗面分配内存 - 即隐藏的4GB - 所以我写了我给了我的用户Lock pages in memory
然后我写了下面的代码:
#include <windows.h>
#include <stdio.h>
BOOL EnableAWE();
int main()
{
if(!EnableAWE())
{
printf("Can not enable AWE on this system.\n");
return 1;
}
HANDLE hProcess = GetCurrentProcess();
SIZE_T byts = ~0u >> 1;
LPVOID ptr = VirtualAllocEx(hProcess, NULL, byts, MEM_PHYSICAL | MEM_RESERVE, PAGE_READWRITE);
if (ptr == NULL)
{
printf("Allocation failed for requested memory size.\n");
return 1;
}
VirtualFreeEx(hProcess, ptr, 0, MEM_RELEASE);
return 0;
}
BOOL EnableAWE()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE;
if (!LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid))) return FALSE;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) return FALSE;
return TRUE;
}
函数EnableAWE
总是返回true,但是当我尝试使用VirtualProtect
分配2GB时,它失败,错误代码为87,这意味着The parameter is incorrect.
我不知道哪个参数不正确。
感谢。
答案 0 :(得分:1)
嗯,VirtualAlloc
不分配AWE内存。 (AllocateUserPhysicalPages
实际上分配了内存。)它保留了可以映射AWE内存的虚拟地址空间。并且您的进程没有2GB的可用虚拟地址空间。
答案 1 :(得分:0)
您发布的代码中没有调用VirtualProtect。另外,你是用/ LARGEADDRESSAWARE编译的吗?
无论如何,我怀疑即使使用PAE,你也无法在Win32上获得2GB的连续地址空间。尝试减少一下,看看是否有帮助。