首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AWE分配内存

使用AWE分配内存
EN

Stack Overflow用户
提问于 2012-07-06 08:31:17
回答 2查看 1.1K关注 0票数 1

我使用的是32位Windows XP SP3,支持PAE,物理内存为8 8GB。

我想要的是使用AWE从黑暗面分配内存-即隐藏的4 4GB所以我写了我给了我的用户Lock pages in memory,然后我写了以下代码:

代码语言:javascript
复制
#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分配2 2GB时,它会失败并返回错误代码87,这意味着The parameter is incorrect.

我不知道哪个参数是错误的。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-08 22:44:35

嗯,VirtualAlloc不分配AWE内存。(AllocateUserPhysicalPages实际上是分配内存的。)它保留AWE内存可以映射到的虚拟地址空间。并且您的进程没有2 2GB的可用虚拟地址空间。

票数 1
EN

Stack Overflow用户

发布于 2012-07-06 09:59:47

在您发布的代码中没有调用VirtualProtect。另外,你是用/LARGEADDRESSAWARE编译的吗?

无论如何,我怀疑您无法在Win32上获得2 2GB的连续地址空间,即使使用PAE也是如此。尝试减少字节数,看看这是否有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11354385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档