求助 AssignProcessToJobObject 函数的成功调用示例
最近想写一个ACM后台测评程序的内核,正在写运行模块 基本思路就是1.创建运行的进程,让后让进城挂起。
2.创建一个作业,然后放置限制信息,包括时间,内存,输入输出等。。。
3.把作业关联到一个端口,然后就可以在端口处查询作业的信息
4.把进程放到作业里面,问题就出到这一步,GetLastError返回的错误信息时没有权限
5.唤醒进程,让他运行然后去端口查询信息即可
下面是源代码 注释已经写好了 很容易看懂 求大神不吝赐教 如果需要报酬 联系我QQ 553069938
程序代码:
#define _WIN32_WINNT 0x0500 #include<Windows.h> #include<WinSafer.h> #include<iostream> #include<string> #include<fstream> #include <iostream> using namespace std; int main() { SECURITY_ATTRIBUTES sa;//安全结构体,在CreateFile中使用 sa.nLength = sizeof( SECURITY_ATTRIBUTES ); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo;//启动信息结构体,设置它的hStdOutput和hStdInput可以重定用户进程的数据输入与输出 ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); siStartInfo.cb = sizeof(STARTUPINFO); siStartInfo.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; siStartInfo.wShowWindow = SW_HIDE;//让用户进程的窗口隐藏启动 char cmd[200] = "notepad"; CreateProcess(NULL,cmd,NULL,NULL,TRUE,CREATE_SUSPENDED ,NULL,NULL,&siStartInfo,&piProcInfo); HANDLE hJob = CreateJobObject(NULL, NULL);//创建作业对象,利用它来限制用户进程运行 JOBOBJECT_EXTENDED_LIMIT_INFORMATION lim;//作业扩展限制 lim.BasicLimitInformation.ActiveProcessLimit = 1;//限制用户进程不能创建新进程 lim.BasicLimitInformation.PerProcessUserTimeLimit.QuadPart =(LONGLONG)(1000 *10000); //设置运行时间 lim.JobMemoryLimit = (size_t)(65536 *1024); //设置运行内存 lim.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_ACTIVE_PROCESS | JOB_OBJECT_LIMIT_PROCESS_TIME | JOB_OBJECT_LIMIT_JOB_MEMORY | JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION; SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &lim,sizeof(lim)); JOBOBJECT_BASIC_UI_RESTRICTIONS uiLim; uiLim.UIRestrictionsClass = JOB_OBJECT_UILIMIT_EXITWINDOWS //限制用户进程进行关机,更改本机设置 | JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS //限制更改系统变量 | JOB_OBJECT_UILIMIT_HANDLES //不能访问外部进程对象 | JOB_OBJECT_UILIMIT_DESKTOP //创建窗口 | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS; SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &uiLim,sizeof(uiLim)); JOBOBJECT_ASSOCIATE_COMPLETION_PORT info_port; //建立作业完成端口,因为作业对象要与完成端口相关联 HANDLE port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, 0); info_ = port; cout<<SetInformationJobObject(hJob, JobObjectAssociateCompletionPortInformation,&info_port, sizeof(info_port)); cout<<AssignProcessToJobObject(hJob, piProcInfo.hProcess);//用户进程与作业对象关联起来,这样就可以利用作业对象来限制用户进程 cout<<ResumeThread(piProcInfo.hThread);//唤醒用户线程 cout<<CloseHandle(piProcInfo.hThread); return 0; }