求助 AssignProcessToJobObject 函数的成功调用示例

laoyang103 protocolsoft coder  2012-12-24 09:41:57
最近想写一个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.CompletionPort = 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;
}
...全文
48 点赞 收藏 回复
写回复
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2012-12-24 09:41
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……