Я хочу использовать функцию SetProcessWorkingSetSize, и на MSDN я вижу это:
«Дескриптор должен иметь право доступа PROCESS_SET_QUOTA. Для получения дополнительной информации см. Безопасность процесса и Права доступа».
Итак, как я могу установить PROCESS_SET_QUOTA для обработки дескриптора?
Я хочу написать программу, которая запускает исполняемый файл с ограничениями рабочего набора, поэтому есть основной кусок кода:
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
GetStartupInfo(&si);
si.dwFlags = 0;
PROCESS_INFORMATION pi;
if (!CreateProcess(
exePath.c_str(),
cmdParametersBuffer,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi))
{
cout << "error" << endl;
}
SetProcessWorkingSetSize(pi.hProcess, 20 * 4 * 1024, 100*1024*1024);
Вы действительно пробовали код, который показали, и он не работает для вас? Если так, то какая ошибка GetLastError()
составление отчетов?
Если вы читаете документацию, там написано:
Безопасность процесса и права доступа
PROCESS_ALL_ACCESS
Все возможные права доступа для объекта процесса.
…
Дескриптор, возвращенный функцией CreateProcess, имеет доступ PROCESS_ALL_ACCESS к объекту процесса.
Так что вы должны быть в состоянии позвонить SetProcessWorkingSetSize()
после CreateProcess()
выходы, точно так, как вы показали, не делая ничего лишнего, чтобы включить PROCESS_SET_QUOTA
права, как это уже должно быть включено.
Ваш пример кода звонит SetProcessWorkingSetSize()
успешно, так как вы получаете ошибку 0. Если вы получили ошибку, как 0x522 ERROR_PRIVILEGE_NOT_HELD
тогда бы вы знали, что звонок не удался.
Это может помочь узнать, что приложение может выделять больше памяти, чем его размер рабочего набора. ОС будет выгружать память из ОЗУ. Если вы используете диспетчер задач для просмотра рабочего набора для вашего процесса, действительно ли он превышает установленную вами квоту?
Вам также может понадобиться SetProcessWorkingSetSizeEx
флаг wth QUOTA_LIMITS_HARDWS_MAX_ENABLE заставить операционную систему действительно применить ваши настройки.