Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Квота на запускаемы процесс


Автор: GePo 27.11.2004, 15:26
Как установить ограничение на используемую память дочерним процессом? Сам процесс запускаю CreateProcess-ом. Знаю, что использовать надо SetProcessWorkingSetSize, но не могу разобрать с установкой прав на процесс

Автор: RA 28.11.2004, 05:23
http://www.realcoding.net/part.php?id=1955

Автор: p0s0l 29.11.2004, 14:28
Цитата(GePo @ 27.11.2004, 15:26)
но не могу разобрать с установкой прав на процесс

Цитата(MSDN)
Windows NT/2000/XP:  The handle must have the PROCESS_SET_QUOTA access right.


Автор: GePo 1.12.2004, 00:11
p0s0l
Это конечно круто, то что он должен имет такие права, а вот как установить эти права я не догоняю

Автор: p0s0l 1.12.2004, 16:09
Цитата(GePo @ 1.12.2004, 00:11)
p0s0l
Это конечно круто, то что он должен имет такие права, а вот как установить эти права я не догоняю

Открывай процесс с таким доступом:
hProcess := OpenProcess ( PROCESS_SET_QUOTA, False, ProcessId );
а дальше уже делай
SetProcessWorkingSetSize( hProcess, MinSize, MaxSize );

Автор: p0s0l 1.12.2004, 16:20
Так... Раз процесс создан CreateProcess, то в структуре TProcessInformation хранится hProcess с правами полного доступа...
Тогда будет сразу так:
SetProcessWorkingSetSize( pi.hProcess, MinSize, MaxSize );

Насчёт привилегий:
Цитата(MSDN)
If the values of either dwMinimumWorkingSetSize or dwMaximumWorkingSetSize are greater than the process' current working set sizes, the specified process must have the SE_INC_BASE_PRIORITY_NAME privilege. Users in the Administrators and Power Users groups generally have this privilege. For more information about security privileges, see Privileges.

Можешь юзать такую функцию:
Код
function SetPrivilege(aPrivilegeName : string; aEnabled : boolean ): boolean;
var
 TP         : TTokenPrivileges;
 Token      : THandle;
 dwRetLen   : DWord;
begin
 Result := False;
 OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token );
 TP.PrivilegeCount := 1;
 if( LookupPrivilegeValue(nil, PChar( aPrivilegeName ), TP.Privileges[ 0 ].LUID ) ) then
 begin
   TP.Privileges[0].Attributes:= (SE_PRIVILEGE_ENABLED)*byte(aEnabled);
   Result := AdjustTokenPrivileges(Token, False, TP, 0, nil, dwRetLen );
 end;
 CloseHandle( Token );
end;
Если хочешь увеличить размер WorkingSet, то перед SetProcessWorkingSetSize вызывай эту функцию так:
Код

 SetPrivilege ('SeIncreaseBasePriorityPrivilege', True);



Автор: GePo 1.12.2004, 22:40
p0s0l
Цитата
Раз процесс создан CreateProcess, то в структуре TProcessInformation хранится hProcess с правами полного доступа...

Я тоже так думал, но после SetProcessWorkingSetSize, GetLastError равно 5, т.е. Access is denied

Автор: p0s0l 2.12.2004, 01:03
Цитата(GePo @ 1.12.2004, 22:40)
Я тоже так думал, но после SetProcessWorkingSetSize, GetLastError равно 5, т.е. Access is denied

Ну сделай тогда так, как я уже говорил:
Код
hProcess := OpenProcess ( PROCESS_SET_QUOTA, False, ProcessId );
SetProcessWorkingSetSize( hProcess, MinSize, MaxSize );
Так-то 100% должно работать...

Автор: GePo 3.12.2004, 23:21
p0s0l
Странно, но все равно не работает

Автор: p0s0l 11.12.2004, 16:28
Ну тогда я не знаю smile

Приведи полный код запуска процесса и установки квоты. Может где какую оплошность незаметную допустил ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)