#include <windows.h>
#include <string>
#include <winbase.h>
#include <iostream>
using namespace std;
#include <psapi.h>
#pragma comment(lib,"psapi.lib")
BOOL LoggedSetLockPagesPrivilege ( HANDLE hProcess,BOOL bEnable)
{
struct {
DWORD Count;
LUID_AND_ATTRIBUTES Privilege [1];
} Info;
HANDLE Token;
BOOL Result;
// Open the token.
Result = OpenProcessToken ( hProcess,
TOKEN_ADJUST_PRIVILEGES,
& Token);
if( Result != TRUE )
{
printf( "Cannot open process token.\n" );
return FALSE;
}
// Enable or disable?
Info.Count = 1;
if( bEnable )
{
Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED;
}
else
{
Info.Privilege[0].Attributes = 0;
}
// Get the LUID.
Result = LookupPrivilegeValue ( NULL,
SE_LOCK_MEMORY_NAME,
&(Info.Privilege[0].Luid));
if( Result != TRUE )
{
printf( "Cannot get privilege for %s.\n", SE_LOCK_MEMORY_NAME );
return FALSE;
}
// Adjust the privilege.
Result = AdjustTokenPrivileges ( Token, FALSE,
(PTOKEN_PRIVILEGES) &Info,
0, NULL, NULL);
// Check the result.
if( Result != TRUE )
{
printf ("Cannot adjust token privileges (%u)\n", GetLastError() );
return FALSE;
}
else
{
if( GetLastError() != ERROR_SUCCESS )
{
printf ("Cannot enable the SE_LOCK_MEMORY_NAME privilege; ");
printf ("please check the local policy.\n");
return FALSE;
}
}
CloseHandle( Token );
return TRUE;
};
void main()
{
long int s=0;
printf("\nEnter the size in MB for address range that can be used to map Address Windowing Extensions (AWE) pages:");
scanf("%d",&s);
LPVOID lpaddress=NULL;
SIZE_T size=s*1024*1024; //size in bytes
printf ("\n%d",size);
LPVOID ADD;
int i;
char *ADDw;
BOOL bResult= FALSE;
BOOL bResult2= FALSE;
BOOL bResult3= FALSE;
BOOL bResult4= FALSE;
BOOL bResult5= FALSE;
ULONG_PTR sizemap= (size)/4096;
ULONG_PTR sizemap2= (size)/4096;
ULONG_PTR sizemap3= (size)/4096;
ULONG_PTR sizemap4= (size)/4096;
ULONG_PTR sizemap5= (size)/4096;
if( ! LoggedSetLockPagesPrivilege( GetCurrentProcess(), TRUE ) )
/*. The SeLockMemoryPrivilege privilege must be enabled in the caller's token or
the function will fail with ERROR_PRIVILEGE_NOT_HELD*/
{
printf("\n No Previledge");
printf("\n %u", GetLastError() );
return;
}
ULONG_PTR * aRAMPages = new ULONG_PTR[sizemap];
ULONG_PTR * aRAMPages2 = new ULONG_PTR[sizemap2];
ULONG_PTR * aRAMPages3 = new ULONG_PTR[sizemap3];
ULONG_PTR * aRAMPages4 = new ULONG_PTR[sizemap4];
ULONG_PTR * aRAMPages5 = new ULONG_PTR[sizemap5];
ADD=VirtualAlloc(lpaddress,size,MEM_RESERVE | MEM_PHYSICAL,PAGE_READWRITE);
if (ADD==0)
{
printf ("allocation failled");
printf("\n %u", GetLastError() );
return;
}
bResult=AllocateUserPhysicalPages(GetCurrentProcess(),&sizemap,aRAMPages);
if( bResult != TRUE )
{
printf("\n %uError in AllocateUserPhysicalPages", GetLastError() );
return;
}
bResult2=AllocateUserPhysicalPages(GetCurrentProcess(),&sizemap2,aRAMPages2);
if( bResult != TRUE )
{
printf("\n %uError in AllocateUserPhysicalPages2", GetLastError() );
return;
}
bResult3=AllocateUserPhysicalPages(GetCurrentProcess(),&sizemap3,aRAMPages3);
if( bResult != TRUE )
{
printf("\n %uError in AllocateUserPhysicalPages2", GetLastError() );
return;
}
bResult4=AllocateUserPhysicalPages(GetCurrentProcess(),&sizemap4,aRAMPages4);
if( bResult != TRUE )
{
printf("\n %uError in AllocateUserPhysicalPages2", GetLastError() );
return;
}
bResult5=AllocateUserPhysicalPages(GetCurrentProcess(),&sizemap5,aRAMPages5);
if( bResult != TRUE )
{
printf("\n %uError in AllocateUserPhysicalPages2", GetLastError() );
return;
}
printf("\n We have allocated 5 different ranges of physical memory pages that could be used to map and unmapp within Address Windowing Extensions (AWE) region of a specified process");
printf("\n Mapping the first range and filling with : MAP1");
bResult=MapUserPhysicalPages(ADD,sizemap,aRAMPages);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
ADDw =(LPSTR) ADD;
for(i=1;i<=(size-5);i=i+5)
{
ADDw[i] = 'M';
ADDw[i+1] = 'A';
ADDw[i+2] = 'P';
ADDw[i+3] = '1';
ADDw[i+4] = ':';
}
printf("\n Mapping the second range and filling with : MAP2");
bResult2=MapUserPhysicalPages(ADD,sizemap2,aRAMPages2);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(i=1;i<=(size-5);i=i+5)
{
ADDw[i] = 'M';
ADDw[i+1] = 'A';
ADDw[i+2] = 'P';
ADDw[i+3] = '2';
ADDw[i+4] = ':';
}
printf("\n Mapping the third range and filling with : MAP3");
bResult3=MapUserPhysicalPages(ADD,sizemap3,aRAMPages3);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(i=1;i<=(size-5);i=i+5)
{
ADDw[i] = 'M';
ADDw[i+1] = 'A';
ADDw[i+2] = 'P';
ADDw[i+3] = '3';
ADDw[i+4] = ':';
}
printf("\n Mapped the fourth range and filling with : MAP4");
bResult4=MapUserPhysicalPages(ADD,sizemap4,aRAMPages4);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(i=1;i<=(size-5);i=i+5)
{
ADDw[i] = 'M';
ADDw[i+1] = 'A';
ADDw[i+2] = 'P';
ADDw[i+3] = '4';
ADDw[i+4] = ':';
}
printf("\n Mapped the fifth range and filled with : MAP5");
bResult5=MapUserPhysicalPages(ADD,sizemap5,aRAMPages5);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(i=1;i<=(size-5);i=i+5)
{
ADDw[i] = 'M';
ADDw[i+1] = 'A';
ADDw[i+2] = 'P';
ADDw[i+3] = '5';
ADDw[i+4] = ':';
}
printf("\n Mapping the first range and printing First 128 charecters");
bResult=MapUserPhysicalPages(ADD,sizemap,aRAMPages);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(int i=1;i<=128;i++)
{
printf("%c",ADDw[i]);
}
printf("\n Mapping the second range and printing First 128 charecters");
bResult2=MapUserPhysicalPages(ADD,sizemap2,aRAMPages2);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(int i=1;i<=128;i++)
{
printf("%c",ADDw[i]);
}
printf("\n Mapping the third range and printing First 128 charecters");
bResult3=MapUserPhysicalPages(ADD,sizemap3,aRAMPages3);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(int i=1;i<=128;i++)
{
printf("%c",ADDw[i]);
}
printf("\n Mapping the fourth range and printing First 128 charecters");
bResult4=MapUserPhysicalPages(ADD,sizemap4,aRAMPages4);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(int i=1;i<=128;i++)
{
printf("%c",ADDw[i]);
}
printf("\n Mapping the five range and printing First 128 charecters");
bResult5=MapUserPhysicalPages(ADD,sizemap5,aRAMPages5);
if( bResult != TRUE )
{
printf("\n %uError in MapUserPhysicalPages", GetLastError() );
return;
}
for(int i=1;i<=128;i++)
{
printf("%c",ADDw[i]);
}
system("pause");
}
Thanks
Karthick P.K
Like this:
Like Loading...