| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3293 人关注过本帖
标题:求助 AssignProcessToJobObject 函数的成功调用示例
取消只看楼主 加入收藏
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
结帖率:95.24%
收藏
已结贴  问题点数:100 回复次数:5 
求助 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;
}
搜索更多相关主题的帖子: 信息 源代码 
2012-12-24 09:37
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 2楼 yuccn
Win7 我也测试过   下面这句调用一直返回0
函数的返回类型是布尔型  参数一是作业的句柄,参数二是进程的句柄 两个都不是NULL
但是返回值是NULL  你可以用下GetLastError  我获得的错误值是5  代表权限不够

cout<<AssignProcessToJobObject(hJob, piProcInfo.hProcess);//用户进程与作业对象关联起来,这样就可以利用作业对象来限制用户进程

                                         
===========深入<----------------->浅出============
2012-12-24 09:54
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 7楼 yuccn
SetInformationJobObject 我GetLastError 貌似没有错误  而且返回值也是真

不知道你那里输出了什么   一会我看下你的那段英文解释

另外  我对windows编程不是很懂   求赐教个成功调用示例

                                         
===========深入<----------------->浅出============
2012-12-24 16:12
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 15楼 beyondyf
恩 windows server 2003的

杨大哥  我就算是回来看看吧  因为我下学期就不来了  还有两个星期放假

虽然说以后不准备干这行了,但是我还是舍不得这个论坛,毕竟在这呆了两年多了

还认识了很多好朋友,以后就把编程当做一个兴趣爱好啦。呵呵  就像杨大哥那样

[ 本帖最后由 laoyang103 于 2012-12-25 15:10 编辑 ]

                                         
===========深入<----------------->浅出============
2012-12-25 15:06
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 20楼 wp231957
多谢这位兄弟,一会我去试试你的代码,如果可以那就太谢谢你了

看来你搞windows已经很久了,以后要多向你学习学习,不知可否交个朋友?

                                         
===========深入<----------------->浅出============
2012-12-25 15:09
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
回复 26楼 wp231957
多谢大哥   windows7测试通过  我会尽快完善我的后台测评程序

以后遇到不会的地方还请大哥多多帮忙

                                         
===========深入<----------------->浅出============
2012-12-30 09:08
快速回复:求助 AssignProcessToJobObject 函数的成功调用示例
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020775 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved