MSSQLWIKI

Karthick P.K on SQL Server

Address Windowing Extensions

 

#include <windows.h> 

#include <string> 

#include <winbase.h> 

#include <iostream> 

using namespace std;

 

 

 

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);

    DWORD type;

    DWORD protect;

    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 charescers");

 

    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 charescers");            

     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 charescers");

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 charescers");

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 charescers");

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");

 

}

 

 

 

 

 

 

 

 

Leave a comment