BOOL MySetLockPagesPrivilege(HANDLE hProcess, BOOL bEnable) { struct { DWORD Count; LUID_AND_ATTRIBUTES Privilege[1]; } Info; HANDLE Token; if ( !OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &Token) ) { printf("Cannot open process token.\n"); return FALSE; } Info.Count = 1; if (bEnable) { Info.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED; } else { Info.Privilege[0].Attributes = 0; } if ( !LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &(Info.Privilege[0].Luid)) ) { printf("Cannot get privilege for %s.\n", SE_LOCK_MEMORY_NAME); return FALSE; } if ( !AdjustTokenPrivileges(Token, FALSE, (PTOKEN_PRIVILEGES)&Info, 0, NULL, NULL) ) { printf ("Cannot adjust token privileges (%u)\n", GetLastError()); return FALSE; } // ERROR_NOT_ALL_ASSIGNED // 1300 (0x514) // Not all privileges or groups referenced are assigned to the caller. DWORD dwErr = GetLastError(); printf("AdjustTokenPrivileges dwErr=%u\n", dwErr); if (dwErr != ERROR_SUCCESS) { printf("Cannot enable the SE_LOCK_MEMORY_NAME privilege"); return FALSE; } CloseHandle(Token); return TRUE; } void LargeMemInit() { if ( !MySetLockPagesPrivilege(GetCurrentProcess(), TRUE) ) { fprintf(stderr, "MySetLockPagesPrivilege failed.\n"); exit(1); } } // VirtualAlloc may fail with: ERROR_NO_SYSTEM_RESOURCES = 1450. To fix, reboot. static void* my_big_malloc(size_t s) { DWORD dwErr; void* pMem; pMem = VirtualAlloc( NULL, // Let system decide where to allocate it s, // size of memory block MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE ); if (pMem == NULL) { // Error 1314 = ERROR_PRIVILEGE_NOT_HELD dwErr = GetLastError(); fprintf(stderr, "VirtualAlloc failed: dwError=%d\n", (int)dwErr); exit(1); } printf("VirtualAlloc ok p=%p\n", pMem); return pMem; }