求高手帮忙!VC6.0+32位系统突破2GB内存访问!!!
开启了PAE, 使用AWE 依旧不能突破2GB内存限制,求高手指点!!
下面是我根据网上找到的代码修改的,XP+VC6.0+开启PAE
#include "stdafx.h"
#include <windows.h>
#include <WinBase.h>
#include <iostream>
using std::cout;
using std::endl;
BOOL AWESetLockPagesPrivilege( HANDLE hProcess, BOOL Enable )
{
HANDLE Token = NULL;
BOOL Result = FALSE;
TOKEN_PRIVILEGES Info = { 0 };
// 打开令牌
Result = OpenProcessToken ( hProcess, TOKEN_ADJUST_PRIVILEGES, &Token );
if( !Result )
return FALSE;
// 设置权限信息
Info.PrivilegeCount = 1;
Info.Privileges[0].Attributes = Enable? SE_PRIVILEGE_ENABLED : 0;
// 获得锁定内存权限的ID
Result = LookupPrivilegeValue ( NULL,SE_LOCK_MEMORY_NAME,&(Info.Privileges[0].Luid));
if( !Result )
{
CloseHandle( Token );
return FALSE;
}
// 调整权限
Result = AdjustTokenPrivileges ( Token, FALSE,(PTOKEN_PRIVILEGES) &Info,0, NULL, NULL);
if( ( !Result ) || ( GetLastError() != ERROR_SUCCESS ) )
{
CloseHandle( Token );
return FALSE;
}
// 成功返回
CloseHandle( Token );
return TRUE;
}
class MMemory
{
private:
ULONG_PTR NumberOfPages; // 申请的内存页数
ULONG_PTR *aPFNs; // 页信息,存储获取的内存页成员
LPVOID lpMemReserved; // AWE窗口
public:
BOOL AllocMemory(ULONG_PTR dMemorySzie);
LPVOID GetMemory();
BOOL FreeMemory();
};
BOOL MMemory::AllocMemory(ULONG_PTR MemorySzie)
{
BOOL bResult; // 通用bool变量
ULONG_PTR NumberOfPagesInitial; // 初始的要申请的内存页数
SYSTEM_INFO sSysInfo; // 系统信息
INT PFNArraySize; // PFN队列所占的内存长度
GetSystemInfo(&sSysInfo); // 获取系统信息
//计算要申请的内存页数.
NumberOfPages = MemorySzie/sSysInfo.dwPageSize;
printf ("Requesting %d pages of memory.\n", NumberOfPages);
// 计算PFN队列所占的内存长度
PFNArraySize = NumberOfPages * sizeof (ULONG_PTR);
aPFNs = (ULONG_PTR *) HeapAlloc(GetProcessHeap(), 0, PFNArraySize);
if (aPFNs == NULL)
{
printf ("Failed to allocate on heap.\n");
return 0;
}
// 分配物理内存
NumberOfPagesInitial = NumberOfPages;
bResult = AllocateUserPhysicalPages( GetCurrentProcess(), &NumberOfPages, aPFNs );
if( bResult != TRUE )
{
printf("Cannot allocate physical pages (%u)\n", GetLastError() );
return 0;
}
if( NumberOfPagesInitial != NumberOfPages )
{
printf("Allocated only %p pages.\n", NumberOfPages );
return 0;
}
// 分配虚拟内存块(这个内存块即AWE窗口)
lpMemReserved = VirtualAlloc( NULL, MemorySzie, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE );
if( lpMemReserved == NULL )
{
printf("Cannot reserve memory.\n");
return 0;
}
// 开始映射
bResult = MapUserPhysicalPages( lpMemReserved, NumberOfPages, aPFNs );
if( bResult != TRUE )
{
printf("MapUserPhysicalPages failed (%u)\n", GetLastError() );
return 0;
}
return 1;
}
LPVOID MMemory::GetMemory()
{
return lpMemReserved;
}
BOOL MMemory::FreeMemory()
{
BOOL bResult;
// 解除映射
bResult = MapUserPhysicalPages(lpMemReserved, NumberOfPages, NULL );
if( bResult != TRUE )
{
printf("MapUserPhysicalPages failed (%u)\n", GetLastError() );
return 0;
}
// 释放物理内存空间
bResult = FreeUserPhysicalPages( GetCurrentProcess(), &NumberOfPages, aPFNs );
if( bResult != TRUE )
{
printf("Cannot free physical pages, error %u.\n", GetLastError());
return 0;
}
// 释放虚拟内存地址
bResult = VirtualFree( lpMemReserved, 0, MEM_RELEASE );
// 释放PFN队列空间
bResult = HeapFree(GetProcessHeap(), 0, aPFNs);
if( bResult != TRUE )
{
printf("Call to HeapFree has failed (%u)\n", GetLastError() );
}
return 1;
}
void _cdecl main()
{
if( !AWESetLockPagesPrivilege( GetCurrentProcess(), TRUE) )
{
// 输出错误信息
cout<<"do not have privilege!"<<endl;
}
for(int k = 0; k < 5; k++)
{
MMemory A;
A.AllocMemory(1024*1024*1024);
//A.FreeMemory();
}
}