Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640

Выделение 4 Гб (large pages)

20.02.2020, 22:00. Показов 2069. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выделяю через VirtualAlloc с флагом MEM_LARGE_PAGES, 2Гб выделяется норм, а например 3 уже нет , что делатиь ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2020, 22:00
Ответы с готовыми решениями:

Как конвертировать ActiveServer Pages (VBScript) в JavaServer Pages?
Добрый день Вопрос: конвертация ActiveServer Pages (VBScript) в JavaServer Pages. Буду благодарен за любую инфу (ссылки, советы и...

pages crawl
мне вот яндекс(у гугла немного другии цифры) говорит : Загружено роботом 2300 в сайтмапе 314 так вот вопрос , статистика...

Маркеры в Pages
Маркеры.При выставления списка,они ровняются по краю,и создается большой отступ если тест выровнять по центру.Как маркер приблизить к...

10
фрилансер
 Аватар для Алексей1153
6465 / 5679 / 1131
Регистрация: 11.10.2019
Сообщений: 15,121
20.02.2020, 22:43
Цитата Сообщение от maxillion Посмотреть сообщение
что делатиь ?
использовать 64-битное приложение?
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
20.02.2020, 23:27  [ТС]
Алексей1153, использую. Если вызвать без MEM_LARGE_PAGES, то выделяется без проблем.

Добавлено через 8 минут
Пробовал выделять 2 по 2Гб, все равно больше двух не хочет, как будто какоето ограничение есть. На ПК 16Гб стоит.

Добавлено через 5 минут
Пример брал сдесь.
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
25.02.2020, 16:46  [ТС]
Может у кого есть win server, проверте плиз, можно ли 4Гб выделить.
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
25.02.2020, 17:47
Цитата Сообщение от maxillion Посмотреть сообщение
Может у кого есть win server, проверте плиз, можно ли 4Гб выделить.
Одинаково не работает как на серверной ОС, так и не на серверной. Не хватает каких-то привилегий.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <Windows.h>
#include <stdio.h>
//#pragma comment(lib, "cmcfg32")
 
BOOL SetPrivilege()
{
    HANDLE hToken = NULL;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
    {
        printf("OpenProcessToken error: %u\n", GetLastError());
        return FALSE;
    }
 
    LUID luid;
    if (!LookupPrivilegeValueA(NULL, "SeLockMemoryPrivilege", &luid))
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError());
        return FALSE;
    }
 
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
    {
        printf("AdjustTokenPrivileges error: %u\n", GetLastError());
        return FALSE;
    }
 
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
        printf("The token does not have the specified privilege. \n");
        return FALSE;
    }
 
    return TRUE;
}
 
void TestAlloc()
{
    SIZE_T pagemin = GetLargePageMinimum();
    printf("GetLargePageMinimum return 0x%lx\n", pagemin);
 
    SIZE_T n_bytes = 4 * 1024 * 1024;
 
    void* ptr = VirtualAlloc(NULL, n_bytes, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
 
    if (ptr)
    {
        printf("VirtualAlloc ok\n");
 
        VirtualFree(ptr, n_bytes, MEM_RELEASE);
    }
    else
    {
        DWORD dwError = GetLastError();
        char chError[8 * 1024] = {};
        FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, dwError, 0, chError, 8 * 1024, 0);
        printf("VirtualAlloc error: (%u) %s\n", dwError, chError);
    }
}
 
int main()
{
    SetConsoleOutputCP(GetACP());
 
    TestAlloc();
 
    if (SetPrivilege())
    {
        TestAlloc();
    }
 
    system("pause");
    return 0;
}
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
25.02.2020, 20:11  [ТС]
Ygg, Я не написал что обязательно нужно пользователя добавить в группу "Блокировка странниц памяти". Enable the Lock Pages только за место SQL Server Service account, нужно добавить пользователя на котором нужно выделить память, и перезагрузиться. Тогда 2Гб выделяет точно, а 4 уже не хочет.

Добавлено через 9 минут
Для проверки блокировки странниц памяти .
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
static BOOL ObtainLockPagesPrivilege() {
    HANDLE token;
    PTOKEN_USER user = nullptr;
 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token) == TRUE) {
        DWORD size = 0;
 
        GetTokenInformation(token, TokenUser, nullptr, 0, &size);
        if (size) {
            user = (PTOKEN_USER) LocalAlloc(LPTR, size);
        }
 
        GetTokenInformation(token, TokenUser, user, size, &size);
        CloseHandle(token);
    }
 
    if (!user) {
        return FALSE;
    }
 
    LSA_HANDLE handle;
    LSA_OBJECT_ATTRIBUTES attributes;
    ZeroMemory(&attributes, sizeof(attributes));
 
    BOOL result = FALSE;
    if (LsaOpenPolicy(nullptr, &attributes, POLICY_ALL_ACCESS, &handle) == 0) {
        LSA_UNICODE_STRING str = StringToLsaUnicodeString(_T(SE_LOCK_MEMORY_NAME));
 
        if (LsaAddAccountRights(handle, user->User.Sid, &str, 1) == 0) {
            LOG_NOTICE("Huge pages support was successfully enabled, but reboot required to use it");
            result = TRUE;
        }
 
        LsaClose(handle);
    }
 
    LocalFree(user);
    return result;
}
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
25.02.2020, 22:05
Цитата Сообщение от maxillion Посмотреть сообщение
Тогда 2Гб выделяет точно, а 4 уже не хочет.
Посмотрел gpedit.msc. У меня руская винда, но вроде правильно сопоставил все разделы. Пользователь, под которым запускается программа, уже был прописан в соответствующем разделе. Тем не менее, AdjustTokenPrivileges возвращает ошибку 1300.
Code
1
2
User SID: xxxx
AdjustTokenPrivileges failed. GetLastError returned: 1300
Без запуска из-под администратора ошибки появляются гораздо раньше.
Code
1
2
3
4
User SID: xxxx
OpenPolicy -1073741790
OpenPSetPrivilegeOnAccountolicy -1073741816
AdjustTokenPrivileges failed. GetLastError returned: 1300
Код взял тот, что приведён по вашей первой ссылке и немного подправленный. Вы же так и не дали полный код теста...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#define UNICODE
#define _UNICODE
 
#include <windows.h>
#include <ntsecapi.h>
#include <ntstatus.h>
#include <Sddl.h>
#include <stdio.h>
 
void InitLsaString(PLSA_UNICODE_STRING LsaString, LPWSTR String)
{
    DWORD StringLength;
 
    if (String == NULL) {
        LsaString->Buffer = NULL;
        LsaString->Length = 0;
        LsaString->MaximumLength = 0;
        return;
    }
 
    StringLength = wcslen(String);
    LsaString->Buffer = String;
    LsaString->Length = (USHORT)StringLength * sizeof(WCHAR);
    LsaString->MaximumLength = (USHORT)(StringLength + 1) * sizeof(WCHAR);
}
 
NTSTATUS OpenPolicy(LPWSTR ServerName, DWORD DesiredAccess, PLSA_HANDLE PolicyHandle)
{
    LSA_OBJECT_ATTRIBUTES ObjectAttributes;
    LSA_UNICODE_STRING ServerString;
    PLSA_UNICODE_STRING Server = NULL;
 
    // 
    // Always initialize the object attributes to all zeroes.
    // 
    ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
 
    if (ServerName != NULL) {
        // 
        // Make a LSA_UNICODE_STRING out of the LPWSTR passed in
        // 
        InitLsaString(&ServerString, ServerName);
        Server = &ServerString;
    }
 
    // 
    // Attempt to open the policy.
    // 
    return LsaOpenPolicy(
        Server,
        &ObjectAttributes,
        DesiredAccess,
        PolicyHandle
    );
}
 
NTSTATUS SetPrivilegeOnAccount(LSA_HANDLE PolicyHandle, PSID AccountSid, LPWSTR PrivilegeName, BOOL bEnable)
{
    LSA_UNICODE_STRING PrivilegeString;
 
    // 
    // Create a LSA_UNICODE_STRING for the privilege name.
    // 
    InitLsaString(&PrivilegeString, PrivilegeName);
 
    // 
    // grant or revoke the privilege, accordingly
    // 
    if (bEnable) {
        return LsaAddAccountRights(
            PolicyHandle,       // open policy handle
            AccountSid,         // target SID
            &PrivilegeString,   // privileges
            1                   // privilege count
        );
    }
    else {
        return LsaRemoveAccountRights(
            PolicyHandle,       // open policy handle
            AccountSid,         // target SID
            FALSE,              // do not disable all rights
            &PrivilegeString,   // privileges
            1                   // privilege count
        );
    }
}
 
void main()
{
    HANDLE hToken = NULL;
 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        printf("OpenProcessToken failed. GetLastError returned: %u\n", GetLastError());
        system("pause");
        return;
    }
 
    DWORD dwBufferSize = 0;
 
    // Probe the buffer size reqired for PTOKEN_USER structure
    if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &dwBufferSize) &&
        (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
    {
        printf("GetTokenInformation failed. GetLastError returned: %u\n", GetLastError());
 
        // Cleanup
        CloseHandle(hToken);
        hToken = NULL;
 
        system("pause");
        return;
    }
 
    PTOKEN_USER pTokenUser = (PTOKEN_USER)malloc(dwBufferSize);
 
    // Retrieve the token information in a TOKEN_USER structure
    if (!GetTokenInformation(
        hToken,
        TokenUser,
        pTokenUser,
        dwBufferSize,
        &dwBufferSize))
    {
        printf("GetTokenInformation failed. GetLastError returned: %u\n", GetLastError());
 
        // Cleanup
        CloseHandle(hToken);
        hToken = NULL;
 
        system("pause");
        return;
    }
 
    // Print SID string
    LPWSTR strsid;
    ConvertSidToStringSid(pTokenUser->User.Sid, &strsid);
    printf("User SID: %S\n", strsid);
 
    // Cleanup
    CloseHandle(hToken);
    hToken = NULL;
 
    NTSTATUS status;
    LSA_HANDLE policyHandle;
 
    if (status = OpenPolicy(NULL, POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES, &policyHandle))
    {
        printf("OpenPolicy %d\n", status);
    }
 
    // Add new privelege to the account
    if (status = SetPrivilegeOnAccount(policyHandle, pTokenUser->User.Sid, SE_LOCK_MEMORY_NAME, TRUE))
    {
        printf("OpenPSetPrivilegeOnAccountolicy %d\n", status);
    }
 
    // Enable this priveledge for the current process
    hToken = NULL;
    TOKEN_PRIVILEGES tp;
 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        printf("OpenProcessToken #2 failed. GetLastError returned: %d\n", GetLastError());
        system("pause");
        return;
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
    if (!LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &tp.Privileges[0].Luid))
    {
        printf("LookupPrivilegeValue failed. GetLastError returned: %d\n", GetLastError());
        system("pause");
        return;
    }
 
    BOOL result = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    DWORD error = GetLastError();
 
    if (!result || (error != ERROR_SUCCESS))
    {
        printf("AdjustTokenPrivileges failed. GetLastError returned: %d\n", error);
        system("pause");
        return;
    }
 
    // Cleanup
    CloseHandle(hToken);
    hToken = NULL;
 
    SIZE_T pageSize = GetLargePageMinimum();
 
    SIZE_T n_size = 4 * 1024 * 1024;
 
    // Finally allocate the memory
    void *largeBuffer = VirtualAlloc(NULL, n_size, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
    if (largeBuffer)
    {
        printf("VirtualAlloc failed, error 0x%x", GetLastError());
    }
 
    system("pause");
}
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
26.02.2020, 05:16  [ТС]
Ваш код правильный.
Права админа при запуске не нужны.
Ошибка 1300 выходит если пользователь не добавлен в группу, или не перезагружен пк.
Спасибо за помощь.
Миниатюры
Выделение 4 Гб (large pages)  
0
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
26.02.2020, 05:29  [ТС]
Ygg, Хотя нет, шас проверил Ваш код не работает. Вот рабочий вариант.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#define UNICODE
#define _UNICODE
 
#include <windows.h>
#include <ntsecapi.h>
#include <ntstatus.h>
#include <Sddl.h>
#include <iostream>
 
 
void InitLsaString(PLSA_UNICODE_STRING LsaString, LPWSTR String)
{
    DWORD StringLength;
 
    if (String == NULL) {
        LsaString->Buffer = NULL;
        LsaString->Length = 0;
        LsaString->MaximumLength = 0;
        return;
    }
 
    StringLength = wcslen(String);
    LsaString->Buffer = String;
    LsaString->Length = (USHORT)StringLength * sizeof(WCHAR);
    LsaString->MaximumLength = (USHORT)(StringLength + 1) * sizeof(WCHAR);
}
 
NTSTATUS OpenPolicy(LPWSTR ServerName, DWORD DesiredAccess, PLSA_HANDLE PolicyHandle)
{
    LSA_OBJECT_ATTRIBUTES ObjectAttributes;
    LSA_UNICODE_STRING ServerString;
    PLSA_UNICODE_STRING Server = NULL;
 
    // 
    // Always initialize the object attributes to all zeroes.
    // 
    ZeroMemory(&ObjectAttributes, sizeof(ObjectAttributes));
 
    if (ServerName != NULL) {
        // 
        // Make a LSA_UNICODE_STRING out of the LPWSTR passed in
        // 
        InitLsaString(&ServerString, ServerName);
        Server = &ServerString;
    }
 
    // 
    // Attempt to open the policy.
    // 
    return LsaOpenPolicy(
        Server,
        &ObjectAttributes,
        DesiredAccess,
        PolicyHandle
    );
}
 
NTSTATUS SetPrivilegeOnAccount(LSA_HANDLE PolicyHandle, PSID AccountSid, LPWSTR PrivilegeName, BOOL bEnable)
{
    LSA_UNICODE_STRING PrivilegeString;
 
    // 
    // Create a LSA_UNICODE_STRING for the privilege name.
    // 
    InitLsaString(&PrivilegeString, PrivilegeName);
 
    // 
    // grant or revoke the privilege, accordingly
    // 
    if (bEnable) {
        return LsaAddAccountRights(
            PolicyHandle,       // open policy handle
            AccountSid,         // target SID
            &PrivilegeString,   // privileges
            1                   // privilege count
        );
    }
    else {
        return LsaRemoveAccountRights(
            PolicyHandle,       // open policy handle
            AccountSid,         // target SID
            FALSE,              // do not disable all rights
            &PrivilegeString,   // privileges
            1                   // privilege count
        );
    }
}
 
int main()
{
    HANDLE hToken = NULL;
 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {
        printf("OpenProcessToken failed. GetLastError returned: %d\n", GetLastError());
        return -1;
    }
 
    DWORD dwBufferSize = 0;
 
    // Probe the buffer size reqired for PTOKEN_USER structure
    if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &dwBufferSize) &&
        (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
    {
        printf("GetTokenInformation failed. GetLastError returned: %d\n", GetLastError());
 
        // Cleanup
        CloseHandle(hToken);
        hToken = NULL;
 
        return -1;
    }
 
    PTOKEN_USER pTokenUser = (PTOKEN_USER)malloc(dwBufferSize);
 
    // Retrieve the token information in a TOKEN_USER structure
    if (!GetTokenInformation(
        hToken,
        TokenUser,
        pTokenUser,
        dwBufferSize,
        &dwBufferSize))
    {
        printf("GetTokenInformation failed. GetLastError returned: %d\n", GetLastError());
 
        // Cleanup
        CloseHandle(hToken);
        hToken = NULL;
 
        return -1;
    }
 
    // Print SID string
    LPWSTR strsid;
    ConvertSidToStringSid(pTokenUser->User.Sid, &strsid);
    printf("User SID: %S\n", strsid);
 
    // Cleanup
    CloseHandle(hToken);
    hToken = NULL;
 
    NTSTATUS status;
    LSA_HANDLE policyHandle;
 
    if (status = OpenPolicy(NULL, POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES, &policyHandle))
    {
        printf("OpenPolicy %d", status);
    }
 
    // Add new privelege to the account
    if (status = SetPrivilegeOnAccount(policyHandle, pTokenUser->User.Sid, (LPWSTR)SE_LOCK_MEMORY_NAME, TRUE))
    {
        printf("OpenPSetPrivilegeOnAccountolicy %d", status);
    }
 
    // Enable this priveledge for the current process
    hToken = NULL;
    TOKEN_PRIVILEGES tp;
 
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
    {
        printf("OpenProcessToken #2 failed. GetLastError returned: %d\n", GetLastError());
        return -1;
    }
 
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
    if (!LookupPrivilegeValue(NULL, SE_LOCK_MEMORY_NAME, &tp.Privileges[0].Luid))
    {
        printf("LookupPrivilegeValue failed. GetLastError returned: %d\n", GetLastError());
        return -1;
    }
 
    BOOL result = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    DWORD error = GetLastError();
 
    if (!result || (error != ERROR_SUCCESS))
    {
        printf("AdjustTokenPrivileges failed. GetLastError returned: %d\n", error);
        return -1;
    }
 
    // Cleanup
    CloseHandle(hToken);
    hToken = NULL;
 
    SIZE_T pageSize = GetLargePageMinimum();
 
    // Finally allocate the memory
    auto largeBuffer = VirtualAlloc(NULL, pageSize, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
 
    printf("\n %p \n", largeBuffer);
 
    if (!largeBuffer)
    {
        printf("VirtualAlloc failed, error 0x%x", GetLastError());
    }
}
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,113
26.02.2020, 09:05
Лучший ответ Сообщение было отмечено maxillion как решение

Решение

Я понял, наверное, в чём дело. Нужно было перезапустить комп. Я не стал его перезапускать раньше, так как открыв настройки через "gpedit.msc" увидел уже прописанного пользователя. Но пользователь туда прописался, судя по всему, запускаемым программным кодом. При этом про перезапуск для вступления настроек в силу система мне ничего не сказала.

Теперь всё заработало. 4 ГБ выделяются и на Win сервере 2016 и на обычной Win 10 pro. Последний затык в правильном написании константы задающей 4 ГБ, нужно добавить LL. Без этого ошибка 0x57 (87 - "the parameter is incorrect")
C++
1
SIZE_T nSize = 4LL * 1024 * 1024 * 1024;
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
26.02.2020, 11:47  [ТС]
Теперь и я понял в чем было дело. Я тоже подправил код со стэка, и он не хотел выделять больше 2Гб, но я то думал раз 2Гб выделяет норм значит код рабочий, а причина в винде.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define UNICODE
#define _UNICODE
 
#include <windows.h>
#include <ntsecapi.h>
#include <ntstatus.h>
#include <Sddl.h>
#include <iostream>
 
 
static BOOL SetLockPagesPrivilege() {
    HANDLE token;
 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token) != TRUE) {
        return FALSE;
    }
 
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 
    if (LookupPrivilegeValue(nullptr, SE_LOCK_MEMORY_NAME, &(tp.Privileges[0].Luid)) != TRUE) {
        return FALSE;
    }
 
    BOOL rc = AdjustTokenPrivileges(token, FALSE, (PTOKEN_PRIVILEGES)&tp, 0, nullptr, nullptr);
    if (rc != TRUE || GetLastError() != ERROR_SUCCESS) {
        return FALSE;
    }
 
    CloseHandle(token);
 
    return TRUE;
}
 
int main()
{
    SetLockPagesPrivilege();
 
    SIZE_T pageSize = GetLargePageMinimum();
 
    // Finally allocate the memory
    auto largeBuffer = VirtualAlloc(NULL, 2llu*1024*1024*1024, MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);
 
    printf("\n %p \n", largeBuffer);
 
    if (!largeBuffer)
    {
        printf("VirtualAlloc failed, error 0x%x", GetLastError());
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2020, 11:47
Помогаю со студенческими работами здесь

Landing pages с анимациями
Уважаемые форумчане, если не сложно, покидайте ссылок на лендинги с красивыми анимациями при скроле

присутствие в yellow-pages.ru
Дает ли что-нибудь присутствие в yellow-pages.ru Понятно, что трафик давать может, в смысле продвижения в поискавиках и тИЦ с ПР?

Wordpress posts with multiple pages
В сета прочитал следущее: тоесть это как? один пост может распологаться на нескольких страницах??? Если да, то дайте ссылку...

Pagecontrol.Pages[1,2].TabVisible:=False;
Как решить проблему pagecontrol.Pages.TabVisible:=False;

TWebBrowser - No property pages are available for this control
Когда я выставляю объект TWebBrowser взятый с вкладки Internet и щелкаю по нему, то появляется надпись &quot;No property pages are...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru