Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <Windows.h>
- static int enable_large_pages(void)
- {
- HANDLE token = INVALID_HANDLE_VALUE;
- TOKEN_PRIVILEGES priv = { 0 };
- int ret = 1;
- if (!(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token)))
- goto error;
- if (!(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &priv.Privileges[0].Luid)))
- goto error;
- priv.PrivilegeCount = 1;
- priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- if (!(AdjustTokenPrivileges(token, FALSE, &priv, 0, 0, 0)))
- goto error;
- ret = 0;
- error:
- CloseHandle(token);
- return ret;
- }
- static void print_last_error(const char *msg)
- {
- const DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
- const DWORD langid = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
- char buf[256];
- FormatMessageA(flags, 0, GetLastError(), langid, buf, sizeof(buf), 0);
- fprintf(stderr, "%s: %s\n", msg, buf);
- }
- int main()
- {
- const int num_tries = 1000000;
- HANDLE current_process = GetCurrentProcess();
- SIZE_T large_page_minimum = 0;
- LPVOID page = 0;
- int found = 0;
- int i, j;
- if (enable_large_pages()) {
- print_last_error("could not enable large pages");
- return 1;
- }
- large_page_minimum = GetLargePageMinimum();
- for (i = 0; i < num_tries; ++i) {
- const DWORD large_page_flags = MEM_COMMIT | MEM_RESERVE | MEM_LARGE_PAGES;
- char buffer[256];
- page = VirtualAllocEx(current_process, 0, large_page_minimum, large_page_flags, PAGE_READWRITE);
- if (!page) {
- print_last_error("could not allocate page");
- return 1;
- }
- memcpy(buffer, page, sizeof(buffer));
- for (j = 0; j < sizeof(buffer); ++j) {
- if (buffer[j]) {
- int refreshed;
- Sleep(1);
- refreshed = ((char *)page)[j];
- printf("stale data at offset %d: %d\n", j, buffer[j]);
- printf("1 ms later the data is: %d\n", refreshed);
- printf("iterations taken: %d\n", i);
- found = 1;
- break;
- }
- }
- if (found)
- break;
- memset(page, i % 256, sizeof(buffer));
- if (VirtualFreeEx(current_process, page, 0, MEM_RELEASE) == FALSE) {
- print_last_error("could not release page");
- return 1;
- }
- }
- if (!found)
- puts("bug not reproduced\n");
- if (page)
- VirtualFreeEx(current_process, page, 0, MEM_RELEASE);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement