"Требуется написать приложение запускающее процесс с ограничениями: на доступ к буферу обмена, к другим приложениям. так же можно ограничивать время использования. Для этого надо использоватьJobObject"
Вот такое вот задание. Написала я программу, но она все равно не ставит ограничения, стала проверять на выполнение, выяснилось,что не создается CreatProcess в чем ошибка понять не могу, подскажите если кто знает.
Вот код:
#include "stdafx.h"
#define UNICODE
#define _WIN32_WINNT 0×0500
#include "windows.h"
#include "conio.h"
#include "stdio.h"
#include <tchar.h>
#include "string.h"
#include "sys/types.h"
#include "stdlib.h"
bool c = false,o=false,t=false;
void fill(LPTSTR str)
{
if(_tcscmp(str,L"c") == 0)
c = true;
else if(_tcscmp(str,L"o") == 0)
o = true;
else if(_tcscmp(str,L"t") == 0)
t = true;
}
void _tmain(int argc, LPTSTR argv[])
{
if(argc < 3)
{
printf("exe app [c] [o] [t]\nc – block read and write clipboard\no – block access to ui objects\nt – end app in 10 sec");
return;
}
if(argc > 3)
fill(argv[3]);
if(argc > 4)
fill(argv[4]);
if(argc > 5)
fill(argv[5]);
HANDLE hjob = CreateJobObject(NULL, NULL);
JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };
if(t)
{
//процесс не может работать больше 10 секунд
jobli.PerProcessUserTimeLimit.QuadPart = 100000000;
jobli.LimitFlags = JOB_OBJECT_LIMIT_JOB_TIME;
}
SetInformationJobObject(hjob, JobObjectBasicLimitInformation,
&jobli, sizeof(jobli));
JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;
if(c){
// процесс не имеет доступа к чтению буфера обмена
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_READCLIPBOARD;
// процесс не имеет доступа к стиранию буфера обмена
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_WRITECLIPBOARD;
}
if(o)
// процесс не имеет права обращаться к USER-объектам в системе (например, к другим окнам)
jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;
SetInformationJobObject(hjob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir));
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
int er = GetLastError();
CreateProcess(NULL, argv[1], NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
if(er!=GetLastError())printf("error creating process\n");
er = GetLastError();
AssignProcessToJobObject(hjob, pi.hProcess);
if(er!=GetLastError())printf("error assigning process\n");
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
HANDLE h[2];
h[0] = pi.hProcess;
h[1] = hjob;
DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);
switch (dw – WAIT_OBJECT_0){
case 0: // процесс завершился.,
printf("process is ended");
break;
case 1: // лимит процессорного времени исчерпан
printf("process is");
break;
}
CloseHandle(pi.hProcess);
CloseHandle(hjob);
return;
}
24 мая 2009 в 20:00
Поставила проверку и на SetInformationJobObject, самое смешное теперь он говорит что ошибки в обоих SetInformationи в AssignProcess
24 мая 2009 в 19:02
Ну печально, конечно… Больше пока идей нет…
Установите все-таки, в какой точке происходит ошибка.
SetInformationJobObject тоже может не работать.
24 мая 2009 в 19:00
Я так поняла, что этот флаг надо было устанавливать, как флаг создания. Увы, при установке ничего не изменилось, ограничения так и не подключаются =(
24 мая 2009 в 18:01
Я не имел в виду ошибку компиляции.
Есть одна мысль… Вы везде исправили обработку ошибок? Особенно где AssignProcessToJobObject. В Windows XP/Vista стартующие приложения автоматически добавляются в некоторый системный Job. А если процесс уже находится в каком-нибудь Job'е, то его нельзя добавить в еще один Job. Это должно выражаться в том, что AssignProcessToJobObject возвратит FALSE (именно так надо проверять, что есть ошибка). Для исправления надо в CreateProcess указать дополнительный флаг CREATE_BREAKAWAY_FROM_JOB.
24 мая 2009 в 16:02
так фишка в том что при компиляции ошибки нет, просто когда через командную строку запускается процесс ограничения накладываемые на него не работают, тое сть он работает больше 10 секунд, имеет доступ к буферу обмена и к другим приложениям =(
24 мая 2009 в 16:00
Странный способ проверки на ошибку
вот проверка:
if(!CreateProcess(…)) {
//если мы здесь, значит ошибка
er=GetLastError();//получить код ошибки
…//вывести сообщение
}
А с вашей проверкой не исключено, что CreateProcess работает правильно, но у вас будет выдаваться сообщение об ошибке.
Кстати, если вы сообщите код ошибки, будет проще понять, в чем проблема.
24 мая 2009 в 15:03
Сергей Lucius Старовой
Проверка на выполнение, то есть если возникает ошибка, то он выдает об этом сообщение.
24 мая 2009 в 15:02
Здорово! Студенты резко активизировались к сессии, и вот занимательное наблюдение – среди просящих помощи гораздо больше девушек, причем, в отличие от ребят, онигораздо чаще прикладывают какие-то конкретные наработки.
24 мая 2009 в 15:01
а в чем смысл сравнения
if(er!=GetLastError())