5.50gen d4系统下载怎么运行1.50内核的LUA游戏呢?

查看: 5844|回复: 2
交易诚信度0 最后登录注册时间阅读权限40UID5086712帖子狩魂0 在线时间100 小时
猥服出巡 Lv.4, 积分 631, 距离下一级还需 369 积分
UID5086712积分631帖子精华0浮云1 猥币2305 汽油0
谁能告诉我方法啊~~~~
交易诚信度0 最后登录注册时间阅读权限140UID1124帖子狩魂0 在线时间3054 小时
UID1124积分30670帖子精华1浮云8434 猥币87649 汽油0
LZ去主頁找啊..../pspdg/jc/fcfw/.shtml
PSP非V3用5.50GEN-D3系统升级教程
声明:此教程仅适用于PSP1000及PSP2000(非v3)自制系统用户。PSP3000\PSP2000V3\PSPgo用户请勿尝试。&
  升级需要:本次升级可以从5.00M33直接升到5.50GEN-D3,所以大家可以放心地升级。注:从5.50GEN-B1系统直接升级可能会遇到黑屏现象,遇到这种情况的朋友先将系统升级到B2就可以了。
  如果你满足升级条件,请跟着以下的步骤,将你的PSP升级至PSP5.50GEN-D3。 注意:升级前请确保你的PSP主机电池电量大于78%。
第一步:下载文件
  1、下载5.50GEN-D3,将其解压,复制解压得到的“PSP”文件夹和“550.pbp”文件。
进入PSP记忆棒根目录下,粘贴并覆盖其中的“PSP”文件和“550.pbp”即可(覆盖并不影响该文件夹内的其它文件)。
第二步:系统升级
  1、文件安装完成后,打开PSP,进入游戏列表(游戏 - Memory Stick)下,此时出现如下图的5.50GEN-D3升级软件图标。 
  2、进入软件之后,确认升级之后。会进入如下图所示的界面,点击×键确认升级即可。
  3、接下来升级开始,请耐心等待一会,整个升级过程很快就完成。完成后,出现如下图提示的界面,此时按×键退出就可以完成升级了。
  4、按○键确认退出之后,然后按住R键不松同时上推开关键打开PSP,进入恢复模式。
  在Registry hacks → Button assign(currently:× is enter),按×键改成Button assign(currently:○ is enter)即可选择back退出该选项。 
  7、随后进入Configuration →Use VshMenu选项将设置括号里内容为Currently:VshMenu。(如本来就是该设置则无须改动)。
  8、接下来,我们就可以退出恢复菜单进入到熟悉的XMB界面了(就是最常见的PSP桌面)。按Select键呼出Vsh菜单,将其中的UMD ISO MOOD选项更改为M33driver即可。
  9、设置完成之后,此时进入PSP的游戏列表(游戏 - Memory Stick)下就可以无须破解直接运行新加密的游戏了。
  6、等待系统返回XMB界面之后,此时进入PSP的游戏列表(游戏 - Memory Stick)下就可以直接运行(如高达VS高达NP、梦幻之星携带版2等)最新的加密游戏了。(<FONT color=#ffGEN-D3自动破解并运行游戏时,出现红屏的现象属正常现象。请放心使用)
系统说明:
  1,1000机刷完之后显示5.50GEN-D(Full),但是新游戏都可以玩。  2,和之前一样,1000机刷完之后vsh menu关闭不了,恢复模式菜单里缺少制作神电等选项。
升级常见问答:
  问:我安装完这个系统,觉得不好用,能降回5.00M33系统吗?  答:当然可以,使用RF1.6就可以方便的给PSP(非V3)降级,具体操作请查看。
  问:我是PSP3000、PSP2000V3、PSPgo,可以用这个自制系统吗?  答:不支持,PSP3000和PSP2000v3玩家们可以先用GD、ebex这两个游戏破解软件来破解游戏,一样可在5.03的自制系统上玩。PSPgo目前无破解,请去PS网上商店购买正版游戏。
  问:为什么我升级之后玩不了ISO了?  答:基本上遇到这种问题的朋友是没有切换正确的ISO引导模式,或者并没有将ISO放到正确的位置,请在Vsh菜单中将ISO引导模式设置为“M33 Driver”。具体解决方案请查看教程1()与教程2()。
  问:已经破解的游戏还能在这个系统上玩吗?  答:可以,但根据网友反映,部分游戏在读取之前的存档时,会出现死机现象。遇此情况请舍弃之前的存档,重新开始游戏即可。
  问:升级之后无法正常开机,出现死机、黑屏的问题,怎么办?  答:请按住R键开机,进入恢复模式,格式化F1。具体的操作过程。
  问:在XMB下按Select呼不出VSH Menu菜单怎么办?  答:在关机的状态下按住R键开机,进入恢复模式,在Configuration → Use VshMenu,设置括号里内容为Currently:VshMenu即可。
  问:升级后确认键○变成了×,怎么办?  答:请按住R键开机,进入恢复模式,在Registry hacks → Button assign(currently:× is enter),按×键改成Button assign(currently:○ is enter)即可。
  问:升级之后查看系统版本还是显示5.50 GEN-D(Full),这是升级失败了吗?  答:使用PSP1000机进行升级之后就会这样显示,对玩游戏没有影响。
交易诚信度0 最后登录注册时间阅读权限5UID9960672帖子狩魂0 在线时间5 小时
猥不足道 Lv.2, 积分 55, 距离下一级还需 145 积分
UID9960672积分55帖子精华0浮云0 猥币208 汽油0
为什么到了第七步没有VshMenu这个选项啊!!!我的只有Currently:Enabled和Currently:Disabled& &怎么回事呢?
思念泛起涟漪
管理团队【光辉事迹】
猥皮大本营管理团队特有的红色令牌。象征权力与责任的契约之证。(担任过论坛各级版主)
论坛贵宾【光辉事迹】
曾为论坛做出过杰出贡献的版主、会员所持有的徽章。象征丰硕成果的华美之证。(获得“论坛贵宾”头衔)
水元素【普通成就】
水、H2O、みず、water,额...总之怎么叫都行了
(累计发帖1000即可解锁)
Powered by我下的PSP游戏不能玩出现错误代码
我下的PSP游戏不能玩出现错误代码 10
游戏是疾风传3晓之觉醒,版本是PSPM33吧,谁能给个详细的解决方法,谢了
一般来说,出现这样的提示是由于三类问题引起的:1.游戏本身的问题。有些游戏由于破解不完全,或压制错误,导致一运行就出现错误;或者下载过程中由于网络传输不稳定,导致下载文件损坏。对于这种情况,建议换个网站下载,然后再试。2.记忆棒问题。组棒的质量参差不齐,就一个字,“换”。3.最后可能是免盘引导模式设置问题。具体请参阅如何设置免盘引导模式
4:系统版本过低,请升级至最新最稳定的版本系统。
5:另上PSP代码大全
UKN9000001 = The update cannot be started. The data is corrupted. 无法升级,数据已损坏.(更改官方升级文件中的数据引起)FFFFFED3 = unknown (might be decryption error) 未知(可能是解码错误引起)ffffffff = PSP update failed PSP升级失败(以前2.00降1.50后99%时出现)8001XXXX是 标准 libc (and the error numbers correspond to the POSIX errno.h constants).8002XXXX是内核错误 = The system cannot be updated. the update program is not applicable for the system.此系统无法升级,升级程序不对应此系统([psp-1007 japan]1.52升级至2.00再试图用MPD downgrader降级至1.5时出现,检察系统版本为1.00,但是却有主题设定和因特网浏览器) = The game could not be started 游戏无法运行(如:在1.50上运行PSP Radio和Rin GB Emulator出现) = device / media not found 设备/媒体未找到(记忆棒未格式化或记忆棒格式无法识别,可能是记忆棒坏了) = The game could not be started 游戏无法运行 = kernel errors 内核错误(出这个错的人,我无语了) = generic kernel error (default) 通常性内核错误(缺省) = failed to allocate the memory block 分配内存不足失败 = The game could not be started 游戏无法运行(UMD被取出) = file read error 文件读取错误8002032c = unknown 未知(试图在1.50下运行高版本用游戏或2.xx用自制程序) = PRX type unsupported PRX文件缺失(2.xx不用ELORDER程序或HEN直接进入自制程序出现)800244C = kernel errors 内核错误(出这个错的人,我无语了)80100D00 = The Channel could not be added (Adding RSS in browser) 此频道无法添加(在因特网浏览器中添加RSS频道时发生) = Load failed.The Memory Stick& could not be acessed. 读取失败,记忆棒无法(此错误发生在当我玩 Need For Speed Most Wanted 5-1-0 返回时. 简单的说是存档文件损坏,但是并未损坏, 仅仅是无法长时间玩此游戏. 奇怪的是, 这个错误说我的记忆棒有问题, 但是一切正常 = occurs when test of wlan infrastructure connection fails. 测试无线连接失败或发生错误(如:连接时关闭WiFi开关 = Format failed. 无法格式化(格式化时弹出记忆棒) = network errors 网络错误 = Cannot connect to the given acess point 无法接入热点.(密码错误或IP地址等网络错误引起)80410A0B = Internal Error 内部错误.80410D07 = unknown (possibly wlan) 未知(可能是无线连接引起)80410D09 = A connection error has occured. 发生连接错误.80410D11 = A connection error has occured (during test connection) 发生连接错误.(测试无线连接时出现)80410D16 = network errors 网络错误
提问者 的感言:鉴于你是内容最多的,就给你了,其实大家的都差不多
其他回答 (5)
把系统升级到最新的5.50GEN-D2肯定能玩
因为你的版本低所以玩不了
升到5.50gen—D3就行了
5.00M33要经过破解游戏才可以的~~
除非你把系统升级到5.50GEN-D2或D3~
要不我发一份我自己破解的晓之觉醒给你~不过,不确定是否能玩~ 5.03一定能玩,,5.00不晓得~
回答完毕
现在新游戏都要5.55以上,你想要运行就要破解游戏,附上教程
你也可以升级,升到5.50gen-D3就能玩了,附上教程
推荐你升级,因为破解游戏的话每个新游戏都要破解,太麻烦
望采纳
LZ你好,出现错误代码时因为你的小P系统版本过低,推荐你升级到5.505.50gen—D3,目前的所出的游戏都能玩。
等待您来回答
PSP领域专家斫`I%&/m{JJ奏t`$@炝玩iG#)*eVe]f@添槛{锝鬓{锝骱;N'鬟?\fdl鑫J谏!?~|?"O<y篼籽腕lyhuqG'詹眦UQ:>瓦w颃a:gu]L鲱眍}h它桢)wgg邕oU? 究;?{汲笈{?//v7?芋ly蔽.|~0.fZ6-嫡gtv-G}~醉磉89_/hZM|UL汾y研;盔x_O&赔b/:檑:,CzR忘i宙xog`{wg{a呀Gh附
q$应I-q{1Y7i叼Z蔟_次腚O7}澈-e_铛膨m:(应q讼>j陔2oyN
7嗌k8tR彤gた7NR}Y}Q,粉j(Y#Ξ6鼻斥2YCA缈揎2c?:Go>蛘脒'^9搡栲Gw奖劂W0:DW酏Gl6+0NuQ)*W耖em6.
 b罨{w耱锟7(fev=t砂+劂u)奎顽雁,Ph74[Dm~
谯_[咄-2.6 pVd#钥{_'膑Z尜:[}/仨6Y5瑟盹{ 枧F"?/{Al箝|#o?聍}sV]mx-f#__西v#L利7铨z^针F瓤酝姹z秫搪!将Rj}s诓佶匏t UU菲+谳脚kEn唑&UX6EK[K椤\檫=64yY}A忱##蛸G{;dQv殳)烙(婵 Y~Oe^CZ锁烤Y^l;婊G"L念娟s鳘Q9o}y芋豇/#?龇?oK??O婵鹱芽_-??g裆盔唿_者嗷j骺?w_{?-驴?>N9髻G5T&它苤廿|z]S遥?w◆W?钧2褪bY<艨g湛_+瓦[⒃o@k@祉燹哌吖G(~OO娇/eg?N垮唿O_/襁刺炒⒘肖|哈婵舣gs唼?k晤O_霪+_?匡Wp{4T篼拗啭?k诉 吝Wk鏊组攵s
n氵<4Dg汲 Y@6矣i[匡j?Y魁sY岿稞旷$7&&
WOI骟h:y:o镱蒇{g_?B/#C谘/I62cS]W戛@1?蝼_霪$1-1Li誊桤|aF/z琢缤*[=.唳/Ms/Ck@8%[;w.坌E[H{f2OyYj
Xp赀V矸爹~H#泓x唢q cY mY 序@^m=掴GXn~7sK)k9DSt+d.解B旗.u!栈仲>8$统t9f古翥_$@XKw:恧Q,-☆6Ua{顸DW椽7(臣nvRnb+ % 窥K~IRC墨b治莼)sd Qny9 x"蹦Y\fEU]PL缜Ad'e>pK|,T瘗cB桡0b9e=2O/Ek3uoF>uG^W`髫SU矿啉垮6g?J,ob}L1e萱u"iw{1:@?n穿骐札:_bPw涂贳xWD~ws[ǔj=T门f槛lv 饺vy巫:[>9x:)UUid】og涌狼L堀N[P
书d%-
M]%9}蟓洽O\魇换;黯>l溷岿岿琬眶铩佝唿)ZDPQ7_+耧獐C蜾7N_)
_L着纟 臀眠8g匡?K步怀禁0葺}s镅Y巳陴aFM?啄:Hww|J7D{so
栾@?$z\sNH(]dc26
Y5]/噌hO>>m}!镗嫔焘3(b曩漯怏t|@谪BsH?3Fi裆'Q3伧锩g^珍谁觚2K~&7气 娘kU物~t翠荏愤|y堕dWwx/搡,=啭揞}df 港6{;{旎{厄~/栾C君A|m谶=f">悍h/fh金st~sO_G蕞@7+95猸Lk8杩Uo燧m嬲<-?刍 iRDssg汆;)近/J,s<}挽v蓁o葆`资!{屮!镟1X^b涩uRW?L%|燮H!刭阐}
$y钶G瑙捋9(萱荻i捶WU撒i2v蜗]&隋穴颀
-,r2 x&C_' ~I鲻タoO怙_M8ǖ?X<φ
择2</W&.{eo更滟7[=x8(.4椰yo7击v呋翕禳w耩
]溉矢i~绚FgNv`ee哟蓊np膏=uV I`p 泐5, Un疒ti|慌{溴W4Eqx<^*d9hww烦m屙稔服_W%N-!
BO;!j凇k魁k嶝]wZ魁^AW蚩犊_}oC[怙W垮x0o/筷U璇b'P{Y涂榭屑:1E1l9鲸.灵}`_}v蝌ovvv铐|b捶vv黠G@`sw5犄?屮W~_痉烦畸捷{;龊蔟踹圻舴!w j姐vRkvC)翱M蚌RL)ヱ(嗡凹8J2}fM*o蝥2Ee/盲胪
Q2Qd6_棘iPgk)稔辇{>C++ Primer 学习笔记_89_用于大型程序的工具 -错误处理[续2]_HUSTOJ的Windows版评定内核_在Lua 5.2中保护大局环境__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
C++ Primer 学习笔记_89_用于大型程序的工具 -错误处理[续2]
HUSTOJ的Windows版评定内核
在Lua 5.2中保护大局环境
C++ Primer 学习笔记_89_用于大型程序的工具 -错误处理[续2]
C++ Primer 学习笔记_89_用于大型程序的工具 --异常处理[续2]用于大型程序的工具
--异常处理[续2]
八、自动资源释放
考虑下面函数:
vector&string&
while (cin && s)
v.push_back(s);
string *p = new string[v.size()];
在正常情况下,数组和vector都在退出函数之前被撤销,函数中最后一个语句释放数组,在函数结束时自动撤销vector。
但是,如果在函数内部发生异常,则将撤销vector而不会释放数组。问题在于数组不是自动释放的。在new之后但在delete之前发生的异常使得数组没有被撤销。不管何时发生异常,都保证运行vector析构函数。
用类管理资源分配
对析构函数的运行导致一个重要的编程技术的出现:异常安全的---即使发生异常,程序也能正常工作。在这种情况下,“安全”来自于保证“如果发生异常,被分配的任何资源都适当地释放”!
通过定义一个类来封装资源的分配和释放,可以保证正确释放资源---“资源分配即初始化”(RAII)
具体:设计资源管理类,以便构造函数分配资源而析构函数释放资源。想要分配资源的时候,就定义该类类型的对象。如果不发生异常,就在获得资源的对象超出作用域的时候释放资源。更为重要的是,如果在创建了对象之后但在它超出作用域之前发生异常,那么,编译器保证撤销该对象,作为展开定义对象的作用域的一部分。如:
class Resource
Resource(parms p):r(allocate(p)) {}
~Resource()
release(r);
resource_type *r;
resource_type *allocate(parms p);
void release(resource_type *);
resource类是分配资源和回收资源的类型,它保存表示该资源的数据成员。Resource的构造函数分配资源,而析构函数释放它:
void fcn()
Resource res(args); //申请资源
}//自动释放资源
如果函数正常终止,就在Resource对象超出作用域时释放资源;如果函数因异常而提早退出,编译器就运行Resource的析构函数作为异常处理过程的一部分。
【最佳实践】
可能存在异常的程序以及分配资源的程序应该使用类来管理那些资源---使用资源管理类来分配和回收可以保证如果发生异常就释放资源。
//P591 习题17.7
void exercise(int *b,int *e)
vector&int& v(b,e);
int *p = new int[v.size()];
ifstream in("ints");
catch(...)
template &typename resource_type&
class Resource
Resource(size_t sz):r(new resource_type[sz]) {}
~Resource()
release(r);
resource_type *r;
void release(resource_type *);
void exercise(int *b,int *e)
vector&int& v(b,e);
Resource&int& res(v.size());
ifstream in("ints");
九、auto_ptr类
标准库auto_ptr类是上一节中介绍的异常安全的“资源分配即初始化”技术例子。auto_ptr类是接受一个类型形参的模板,它为动态分配的对象提供异常安全,auto_ptr类在头文件memory中定义。
【小心地雷】
auto_ptr只能用于管理从new返回的一个对象,它不能管理动态分配的数组[会导致未定义的运行时行为]。
当auto_ptr被复制或复制时,有不寻常的行为,因此,不能将auto_ptr存储在标准库容器类型中。
每个auto_ptr对象绑定到一个对象或者指向一个对象。当auto_ptr对象指向一个对象的时候,可以说它“拥有”该对象。当auto_ptr对象超出作用域或者另外撤销的时候,就自动回收auto_ptr所指向的动态分配对象。
class Text
cout && "Text" &&
cout && "~Text" &&
int main()
auto_ptr&Text& ap(new Text);
Text *p = new T
1、为异常安全的内存分配使用auto_ptr
如果通过常规指针分配内存,而且在执行delete之前发生异常,就不会自动释放内存:
int *ip = new int(42);
//如果在此处抛出异常,并且不被局部捕获,则内存没法释放
如果使用auto_ptr对象来代替,将会自动释放内存,即使提早退出这个块也是这样:
auto_ptr&Text& ap(new Text);
throw runtime_error("TEXT");
在这个例子中,编译器保证在展开超过了f之前运行ap的析构函数。
2、auto_ptr是可以保存在任何类型指针的模板
auto_ptr类是可以接受单个类型形参的模板:
auto_ptr&string& strPtr(new string("Brontosaurus"));
cout && *strPtr &&
3、将auto_ptr绑定到指针
在最常见的情况下,将auto_ptr对象初始化为由new表达式返回的对象的地址:
auto_ptr&int& intPtr(new int(1024));
接受指针的构造函数为explicit构造函数,所以必须使用初始化的直接形式来创建auto_ptr对象:
auto_ptr&int& iP = new int(1024);
auto_ptr&int& pI(new int(1024));
iP所指的由 new表达式创建的对象在超出作用域时自动删除。如果iP是局部对象,iP所指对象在定义pi的块的末尾删除;如果发生异常,则iP也超出作用域,析构函数将自动运行iP的析构函数作为异常处理的一部分;如果iP是全局对象,就在程序末尾删除iP引用的对象。
4、使用auto_ptr对象
auto_ptr类定义了解引用操作符(*)和箭头操作符(-&)的重载版本,因为auto_ptr定义了这些操作符,所以可以用类似于使用内置指针的方式使用auto_ptr对象:
auto_ptr&string& strPtr(new string("HELLO!"));
cout && *strPtr &&
*strPtr = "TRex";
string s = *strP
cout && s &&
if (strPtr -& empty())
cout && "Empty!" &&
cout && "Not Empty!" &&
auto_ptr的主要目的,在保证自动删除auto_ptr对象引用的对象的同时,支持普通指针式行为。正如我们所见,自动删除该对象这一事实导致在怎样复制和访问它们的地址值方面,auto_ptrs与普通指针明显不同。
HUSTOJ的Windows版评定内核
HUSTOJ的Windows版评判内核HUSTOJ的Windows版评判内核
作者:游蓝海
个人主页:http://blog.csdn.net/you_lan_hai
在线评测系统(Online Judge System,OJ),即在线评判用户所提交的代码是否能够解决相应的题目,常作为高校训练学生编程实践能力的平台已及ACM/ICPC等程序设计竞赛平台。目前,985、211类的实力高校,基本都拥有自己的OJ,而对于实力较弱的高校来说,开发一个OJ是相当困难的一件事。虽然OJ系统可以共享,但是如果作为内部练习和训练,依赖别人的oj,并不是很方便。如今,OJ系统已经非常多了,但是开源的系统却并不多,而且开源的评判内核就更少了,如果评判程序出了问题,还得等别人出更新。这也许是因为开发过程比较辛苦的原因吧。
HUSTOJ是一个出色的开源的系统,它遵循GPL,不仅功能齐全,而且还有开发团队维护,免去了高校的重复劳动力(详见:/p/hustoj/)。虽然web可以搭建到任何一款操作系统上,但是HUSTOJ的评判内核却是linux版的,我相信用windows的菜鸟团队会更多,至少我们当年就是这样的,要搭建一个linux环境何其困难呀。
以前在学校的时候,我是ACM团队的负责人之一,我们没有自己的OJ,训练的时候都会去其他学校的OJ做题。大部分学校OJ的题库偏难,挫败了无数的新手,我目睹几百人的团队,后来流失到30多人,目睹了很多想成为编程高手的计算机系学弟去打游戏了,作为一个团队负责人,我感觉我失职了。虽然有部分学校的OJ题会简单些,但是我们经常会遇到这样的尴尬,重要时刻网站无法登录!
作为苦逼的无人问津院校的最差专业的想为自己开发团队打造自主oj的你,加入我们吧:群,验证信息CSDN。
好了,废话不多说,无码无真相,windows版HUSTOJ评判内核项目:/p/online-judger/ ,目前已经完成大部分功能,基本可用,建议用svn工具(推荐TortoiseSVN)下载最新源码。
1.数据库管理模块(DBManager)从数据库查询出当前结果为待定和等待重判的提交信息,并组装成内部可识别任务数据(Task),然后将Task转交给评判单元(JudgeCell),等待评判。
2.评判单元(JudgeCell)管理着一组评判内核(JudgeCore),每个评判内核(JudgeCore)都运行在独立的线程中。评判内核不断的从评判单元中获取任务,如果发现任务就进行一次评判,然后通过回调接口,将评判结果反馈给上层,最终,评判的结果会反馈给DBManager。
3.DBManager收到结果后,将结果写回数据库。
4.一个评判内核(JudgeCore)由三个执行部件(Excuter)组成,分别是编译器(Compiler)、执行器(Runner)、匹配器(Matcher)组成,分别负责编译用户代码,执行用户程序并生成输出数据,匹配用户程序的输出数据是否与测试数据匹配。JudgeCore目前只支持c和c++两种语言。
visual studio 2008
解决方案构成
解决方案共有3个项目,LZData,acm,Judger。
1.LZData,是我其他项目中读/写配置文件的工具,目前支持LZD和XML两种格式。对XML格式的支持不是很完善,目前只支持赋值类语法,不支持注释、帮助等格式的语法。
2.acm,简单的封装了一些常用的windows API,如线程、进程、网络通信、文件处理、MySql等。
3.Judger,是HUSTOJ的评判内核程序。Judger/bin是内核程序的输出目录。TODO1.支持评判内核沙箱运行模式。2.增加对Java代码评判的支持。3.增加对sim的支持。4.评判单元多进程化。5.HUSTOJ IDE测试功能的支持。
简易测试环境搭建
1.安装wamp(windows+apache+mysql+php)集成环境。
2.下载HUSTOJ,将其web目录放置到wamp/www目录下。数据库的配置参考hustoj/install/readme。
3.下载本windows版评判程序,编译后,在judger/bin目录下生成judger.exe。judger.exe可以放置到任意目录,但是配置文件(config.xml)中的&testDataPath&项路径必须与hustoj 测试数据的配置项‘OJ_DATA’保持一致,此路径最好都用绝对路径。
程序写的不是很好,欢迎各位windows编程砖家以及oj内核砖家留下您宝贵的一砖。其中在编写windows沙箱(job)功能时遇到了几个棘手的问题:
1.job时间已经到了,程序还未终止,往往要多等待2-5s。
2.评判含有静态声明的大数组(数组内存超出job的限制内存)代码时,在进程添加到job之后,调用ResumeThread的瞬间,子进程就弹出错误对话框了。如:
#include .....
char buffer[100*];//超出job限制内存。
int main().....
因此,程序执行程序没有使用到沙箱功能,而是简单的启动监视线程来监视子进程的执行情况,如果子进程超出限制,则强行结束。
附上一段沙箱(job)实现代码,望高手指点:
bool ZProcessJob::create(const tstring &
cmd, bool start_/* = true*/)
if (NULL != m_hProcess)
OutputMsg(_T("process has been created!"));
int64 limitTime = m_limitTime * 10000; //100ns (1s = 10^9ns)
int limitMemory = m_limitMemory * 1024; //bytes
if (limitMemory & 0)//超出int范围了
limitMemory = 128*; //默认128M
//////////////////////////////////////////////////////////////////////////
//创建作业沙箱(job)
//////////////////////////////////////////////////////////////////////////
tstring jobN
generateGUID(jobName);
if(!m_job.create(jobName))
OutputMsg(_T("create job faild!"));
//////////////////////////////////////////////////////////////////////////
//设置job信息
//////////////////////////////////////////////////////////////////////////
//设置基本限制信息
JOBOBJECT_EXTENDED_LIMIT_INFORMATION subProcessLimitR
ZeroMemory(&subProcessLimitRes, sizeof(subProcessLimitRes));
JOBOBJECT_BASIC_LIMIT_INFORMATION & basicInfo = subProcessLimitRes.BasicLimitI
basicInfo.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME| \
JOB_OBJECT_LIMIT_PRIORITY_CLASS| \
JOB_OBJECT_LIMIT_PROCESS_MEMORY| \
JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION;
basicInfo.PriorityClass = NORMAL_PRIORITY_CLASS;
//优先级为默认
basicInfo.PerProcessUserTimeLimit.QuadPart = limitT //子进程执行时间ns(1s=10^9ns)
subProcessLimitRes.ProcessMemoryLimit = limitM
//内存限制
m_job.setInformation(
JobObjectExtendedLimitInformation,
&subProcessLimitRes,
sizeof(subProcessLimitRes));
//让完成端口发出时间限制的消息
JOBOBJECT_END_OF_JOB_TIME_INFORMATION timeR
ZeroMemory(&timeReport, sizeof(timeReport));
timeReport.EndOfJobTimeAction = JOB_OBJECT_POST_AT_END_OF_JOB;
m_job.setInformation(
JobObjectEndOfJobTimeInformation,
&timeReport,
sizeof(JOBOBJECT_END_OF_JOB_TIME_INFORMATION));
JOBOBJECT_BASIC_UI_RESTRICTIONS subProcessLimitUi;
ZeroMemory(&subProcessLimitUi, sizeof(subProcessLimitUi));
subProcessLimitUi.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE| \
JOB_OBJECT_UILIMIT_DESKTOP| \
JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS| \
JOB_OBJECT_UILIMIT_DISPLAYSETTINGS| \
JOB_OBJECT_UILIMIT_EXITWINDOWS| \
JOB_OBJECT_UILIMIT_GLOBALATOMS| \
JOB_OBJECT_UILIMIT_HANDLES| \
JOB_OBJECT_UILIMIT_READCLIPBOARD;
m_job.setInformation(
JobObjectBasicUIRestrictions,
&subProcessLimitUi,
sizeof(subProcessLimitUi));
//将作业关联到完成端口,以确定其运行情况,及退出的原因
int id = generateID();
m_ioCPHandle = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, id, 0);
JOBOBJECT_ASSOCIATE_COMPLETION_PORT jobCP;
ZeroMemory(&jobCP, sizeof(jobCP));
pletionKey = (PVOID)
pletionPort = m_ioCPH
m_job.setInformation(
JobObjectAssociateCompletionPortInformation,
sizeof(jobCP));
//////////////////////////////////////////////////////////////////////////
//创建子进程
//////////////////////////////////////////////////////////////////////////
TCHAR cmd_[BUFSIZE];
lstrcpy(cmd_, cmd.c_str());
m_hInput = createInputFile();
m_hOutput = createOutputFile();
/*CreateProcess的第一个参数
将标准输出和错误输出定向到我们建立的m_hOutput上
将标准输入定向到我们建立的m_hInput上
设置子进程接受StdIn以及StdOut的重定向
STARTUPINFO StartupI
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.hStdOutput = m_hO
StartupInfo.hStdError = m_hO
StartupInfo.hStdInput = m_hI
StartupInfo.dwFlags = STARTF_USESTDHANDLES;
PROCESS_INFORMATION ProcessI
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
if(!createProcess(cmd_, TRUE, CREATE_SUSPENDED | CREATE_BREAKAWAY_FROM_JOB,
StartupInfo, ProcessInfo))
m_hProcess = ProcessInfo.hP
m_hThread = ProcessInfo.hT
//////////////////////////////////////////////////////////////////////////
//将子进程与job关联
//////////////////////////////////////////////////////////////////////////
if (start_)
bool ZProcessJob::start()
OutputMsgA("start run.");
if(!m_job.assinProcess(m_hProcess))
OutputMsg(_T("应用进程到job失败!%d"), GetLastError());
//启动子进程
ResumeThread(m_hThread);
//关闭标准输入文件和零时输出文件的句柄
SAFE_CLOSE_HANDLE(m_hInput);
SAFE_CLOSE_HANDLE(m_hOutput);
//关闭主进程主线程句柄
SAFE_CLOSE_HANDLE(m_hThread);
//等待进程子进程处理完毕或耗尽资源退出
DWORD ExecuteResult = -1;
unsigned long completeK
LPOVERLAPPED processI
bool done =
while(!done)
GetQueuedCompletionStatus(
m_ioCPHandle,
&ExecuteResult,
&completeKey,
&processInfo,
INFINITE);
switch (ExecuteResult)
case JOB_OBJECT_MSG_NEW_PROCESS:
OutputMsg(TEXT("New process (Id=%d) in Job"), processInfo);
case JOB_OBJECT_MSG_END_OF_JOB_TIME:
OutputMsg(TEXT("Job time limit reached"));
m_exitCode = 1;
case JOB_OBJECT_MSG_END_OF_PROCESS_TIME:
OutputMsg(TEXT("Job process (Id=%d) time limit reached"), processInfo);
m_exitCode = 1;
case JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:
OutputMsg(TEXT("Process (Id=%d) exceeded memory limit"), processInfo);
m_exitCode = 2;
case JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:
OutputMsg(TEXT("Process (Id=%d) exceeded job memory limit"), processInfo);
m_exitCode = 2;
case JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT:
OutputMsg(TEXT("Too many active processes in job"));
case JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:
OutputMsg(TEXT("Job contains no active processes"));
case JOB_OBJECT_MSG_EXIT_PROCESS:
OutputMsg(TEXT("Process (Id=%d) terminated"), processInfo);
case JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:
OutputMsg(TEXT("Process (Id=%d) terminated abnormally"), processInfo);
m_exitCode = 3;
OutputMsg(TEXT("Unknown notification: %d"), ExecuteResult);
m_exitCode = 99;
JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION
ZeroMemory(&jobai, sizeof(jobai));
QueryInformationJobObject(m_job.handle(), JobObjectBasicAndIoAccountingInformation,
&jobai, sizeof(jobai), NULL);
JOBOBJECT_EXTENDED_LIMIT_INFORMATION
ZeroMemory(&joeli, sizeof(joeli));
QueryInformationJobObject(m_job.handle(), JobObjectExtendedLimitInformation,
&joeli, sizeof(joeli), NULL);
m_runTime = jobai.BasicInfo.TotalUserTime.LowPart/10000;
m_runMemory = joeli.PeakProcessMemoryUsed/1024;
//关闭进程句柄
SAFE_CLOSE_HANDLE(m_hProcess);
//关闭完成端口
SAFE_CLOSE_HANDLE(m_ioCPHandle);
//为了安全,杀死作业内所有进程
while(!m_job.terminate(0))
OutputMsg(_T("停止job失败!%d"), GetLastError());
Sleep(1000);
//关闭作业句柄
m_job.close();
OutputMsgA("end run.");
在Lua 5.2中保护大局环境
在Lua 5.2中保护全局环境Lua脚本语言十分强大,但是有一个问题就是全局可写,比如你定义一个全局变量很容易不小心被另一个同名变量给覆盖掉。
这种问题一旦出现是十分难以调查的,该文章介绍的这种机制可以解决该问题。
我已经在我自己的工程中应用了该技术,它可以达到以下目的:
1.全局变量不能直接在Lua中被修改
2.可以创建出不能直接被修改的table
3.屏蔽一些你不想开放的Lua原生函数比如文件操作
注:我是混合着使用C和Lua实现该机制的,但是在纯Lua里也可以同样实现。为了便于表述,我这里只给出纯Lua版的例子。
另外该范例代码仅限于Lua 5.2版,但是该技巧同样可以适用于其他版本,但可能需要修改该一部分代码。
首先将所有安全机制的代码放进一个Lua脚本文件safe.lua如下:
-- 仅支持Lua 5.2版
assert(_VERSION == "Lua 5.2")
-- 全局环境在注册表中的索引值(见lua.h)
local LUA_RIDX_GLOBALS = 2
-- 安全table的metatable标志
local SAFE_TABLE_FLAG = ".SAFETABLE"
-- 设置全局安全保护机制
local function SetupGlobal()
-- 获取注册表
local reg = debug.getregistry()
local env = {}
-- 新环境table
local proxy = {}
-- 代理table
local mt = {}
-- metatable
-- 操作重载
mt.__index = proxy
mt.__newindex = function() print("cannot modify global enviroment!") end
mt.__len = function() return #proxy end
mt.__pairs = function() return pairs(proxy) end
mt.__ipairs = function() return ipairs(proxy) end
-- 隐藏metatable
mt.__metatable = 0
-- 标记为安全table
mt[SAFE_TABLE_FLAG] = true
-- 获取旧环境
local old_env = reg[LUA_RIDX_GLOBALS]
-- 设置新环境的metatable
setmetatable(env, mt)
-- 启用新环境
_ENV = env
-- 将全局默认环境也改为新环境
reg[LUA_RIDX_GLOBALS] = env
-- 返回代理table和旧环境
return proxy, old_env
-- 新建一个有安全保护的table
local function CreateSafeTable(base)
local new = {}
-- 新table
local mt = {}
-- metatable
-- 如果没有指定base则新建一个空table
local proxy = (type(base) == "table") and base or {}
-- 操作重载
mt.__index = proxy
mt.__newindex = function() print("cannot modify safe table!") end
mt.__len = function() return #proxy end
mt.__pairs = function() return pairs(proxy) end
mt.__ipairs = function() return ipairs(proxy) end
-- 隐藏metatable
mt.__metatable = 0
-- 标记为安全table
mt[SAFE_TABLE_FLAG] = true
-- 设置新table的metatable
setmetatable(new, mt)
-- 返回新table和对应的代理table
return new, proxy
-- 开启全局保护
local proxy, old_env = SetupGlobal()
-- 在这里复制需要导出给新环境使用的Lua原生全局变量和函数
-- 被屏蔽的原生全局变量和函数有:
Lua 5.2推荐使用_ENV(你可以根据需要把它定义为_ENV)
我的工程需要屏遮文件系统,我没有评估过开放它对安全性有没有影响
-- loadfile 我的工程需要屏遮文件系统,我没有评估过开放它对安全性有没有影响
-- rawequal 需要覆盖,不应该直接操作安全table
需要覆盖,不应该直接操作安全table
需要覆盖,不应该直接操作安全table
需要覆盖,不应该直接操作安全table
-- require
我的工程需要屏遮文件系统,我没有评估过开放它对安全性有没有影响
proxy._VERSION = old_env._VERSION
proxy.assert = old_env.assert
proxy.collectgarbage = old_env.collectgarbage
proxy.error = old_env.error
proxy.getmetatable = old_env.getmetatable
proxy.ipairs = old_env.ipairs
proxy.load = old_env.load
proxy.next = old_env.next
proxy.pairs = old_env.pairs
proxy.pcall = old_env.pcall
proxy.print = old_env.print
proxy.select = old_env.select
proxy.setmetatable = old_env.setmetatable
proxy.tostring = old_env.tostring
proxy.tonumber = old_env.tonumber
proxy.type = old_env.type
proxy.xpcall = old_env.xpcall
-- 在这里导出给新环境使用的Lua原生全局table(将被设为只读table)
-- 被屏蔽的原生全局table有:
-- coroutine 我的工程里不需要coroutine,我没有评估过开放它对安全性有没有影响
会严重影响安全性,必须屏蔽
我的工程需要屏遮文件系统,我没有评估过开放它对安全性有没有影响
我的工程里不需要os,我没有评估过开放它对安全性有没有影响
-- package
我的工程需要屏遮文件系统,我没有评估过开放它对安全性有没有影响
proxy.bit32 = CreateSafeTable(old_env.bit32)
proxy.math = CreateSafeTable(old_env.math)
proxy.string = CreateSafeTable(old_env.string)
proxy.table = CreateSafeTable(old_env.table)
-- 实现安全版的rawequal
proxy.rawequal = function(v1, v2)
-- 获得真实的metatable
local mt1 = old_env.debug.getmetatable(v1)
local mt2 = old_env.debug.getmetatable(v2)
-- 如果是安全table则使用代理table
if mt1 and mt1[SAFE_TABLE_FLAG] then
v1 = mt1.__index
if mt2 and mt2[SAFE_TABLE_FLAG] then
v2 = mt2.__index
-- 调用原始rawequal
return old_env.rawequal(v1, v2)
-- 实现安全版的rawget
proxy.rawget = function(t, k)
-- 获得真实的metatable
local mt = old_env.debug.getmetatable(t)
-- 如果是安全table则使用代理table
if mt and mt[SAFE_TABLE_FLAG] then
t = mt.__index
-- 调用原始rawget
return old_env.rawget(t, k)
-- 实现安全版的rawlen
proxy.rawlen = function(v)
-- 获得真实的metatable
local mt = old_env.debug.getmetatable(v)
-- 如果是安全table则使用代理table
if mt and mt[SAFE_TABLE_FLAG] then
v = mt.__index
-- 调用原始rawlen
return old_env.rawlen(v)
-- 实现安全版的rawset
proxy.rawset = function(t, k, v)
-- 获得真实的metatable
local mt = old_env.debug.getmetatable(t)
-- 如果是安全table则使用代理table
if mt and mt[SAFE_TABLE_FLAG] then
t = mt.__index
-- 调用原始rawset
return old_env.rawset(t, k, v)
-- 这里可以自定义一些自己的内容
-- 脚本文件装载列表
local loaded_proxy
proxy.LOADED, loaded_proxy = CreateSafeTable()
-- 导入脚本文件
proxy.import = function(s)
-- 如果已经被导入则返回true
if LOADED[s] ~= nil then
return true
-- 装载文件
local f, msg = old_env.loadfile(s)
-- 如果装载失败,输出错误
if not f then
old_env.io.stderr:write(msg)
return false
-- 否则执行该脚本
local r, msg = pcall(f)
-- 如果执行过程中出错,输出错误
if not r then
old_env.io.stderr:write(msg)
return false
-- 记录文件名到装载列表
loaded_proxy[s] = f
return true
-- 由于外界(这里指的是main.lua)环境已经初始化过环境了,没办法在safe.lua里直接更改(我没找到办法)
-- 因此这里返回新环境给main.lua,main.lua需要在装载完该文件后把自己的环境设为该新环境
-- 对于C这一步是不需要的,本身main.lua做作的一切可以都在C里完成
do return _ENV end
入口脚本main.lua:
-- 开启全局保护,并且更新自己的环境(见safe.lua末尾的说明)
_ENV = dofile("safe.lua")
-- 装载其他脚本
import("test.lua")
-- 输出已装载脚本
for k, v in pairs(LOADED) do
print("["..k.."] = "..tostring(v))
-- 尝试重复装载脚本
import("test.lua")
测试脚本test.lua:
-- 尝试定义全局变量
-- 尝试修改已有全局变量
print = nil
print(print)
-- 尝试修改安全table
math.x = 0
print(math.x)
math.sin = nil
print(math.sin)
命令行里敲入lua main.lua,执行结果将为:
cannot modify global enviroment!
cannot modify global enviroment!
function: 6D793C3C
cannot modify safe table!
cannot modify safe table!
function: 6D796C34
[test.lua] = function: 003E8310
可以看出所有写操作都没有成功,并且test.lua只加载了一次,在LOADED中有其记录。
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:

我要回帖

更多关于 5.50gen d4系统下载 的文章

 

随机推荐