From: SMTP%"DSJ@WKUVX1.WKU.EDU" 21-DEC-1993 10:54:05.60 To: EVERHART CC: Subj: AUGUST93.NDELET X-FileServer: Digital Systems Journal File Server Date: Tue, 21 Dec 1993 09:54:46 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: AUGUST93.NDELET To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : NDELET $! By : Hunter Goatley $! Date : 12-AUG-1993 12:21:59.58 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. DELETE_UNDELETE.MAR;1 $! 2. MODIFY_PROCESS_STATUS.MAR;1 $! 3. NDELET.DESC;1 $! 4. TEST_NODELETE.C;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X;`20DELETE_UNDELETE X; X;`20This`20routine`20clears`20the`20NODELETE`20flag`20in`20the`20PCB`20so`20th Vat`20a`20process X;`20previously`20marked`20as`20NODELETE`20can`20now`20be`20deleted. X; X; X;`20CAUTION:`09This`20feature`20is`20UNDOCUMENTED`20`26`20UNSUPPORTED`20by`20D VIGITAL!!!!!! X;`09`09Use`20at`20your`20own`20risk.`20Neither`20the`20author`20nor`20Informat Vion X;`09`09America`20is`20responsible`20for`20this`20code.`20 X;`09`09This`20code`20has`20been`20tested`20on`20a`20multiprocessor`20VMS`205.2 V`20machine`20 X;`09`09in`20a`20VAXcluster`20with`20no`20problems. X; X; X;`09`09`09`20`20`20`20`20Information`20America X;`09`09`09`20`20`20`20`20`20`20`20J.`20Wren`20Hunt X;`09`09`09`20`20`20`20`20`20`20June`201,`201990 X; X; X;`20ENVIRONMENT:`09VAX`20MACRO X;`09`20`20`20`20`20`20`20`20VAX`20VMS`20V5.2-1 X; X; X;`20`20THE`20INFORMATION`20IN`20THIS`20SOFTWARE`20IS`20`20SUBJECT`20TO`20CHANG VE`20WITHOUT`20NOTICE`20`20`20 X;`20`20AND`20`20SHOULD`20`20NOT`20`20BE`20`20CONSTRUED`20AS`20`20A`20COMMITMEN VT`20BY`20EITHER`20THE`20AUTHOR X;`20`20AND/OR`20INFORMATION`20AMERICA. X; X;`20 X;`20MODIFICATION`20HISTORY: X; X;`20V000-03/15/91-JWH`09Original`20skeleton`20template`20from`20Bruce`20Ellis' Vs X;`09`09`09"Ghost`20in`20the`20Machine"`20DECUS`20presymposium`20seminar`20a X;`09`09`09few`20years`20back.`20Upgraded`20for`20VMS`20version`205.x X X X Xfirst_arg`20=`204 X X`09.macro`09error_check`09?l1`09`09;`20macro`20to`20check`20return`20status X`09blbs`09r0,l1 X`09$exit_s`09r0 Xl1: X`09.endm`09error_check X X X`09.library`09/sys$library:lib.mlb/ X`09.link`09`09/sys$system:sys.stb/ X X`09$pcbdef`09`09;`20give`20me`20process-control-block`20definitions X`09$phddef`09`09;`20`20and`20process-header`20definitions`20too. X`09$dscdef`09`09;`20string`20descriptor`20definitions X X XBegin_lock:`09`09;`20Start`20locking`20working`20set`20pages`20here`20(we`20wa Vnt X`09`09`09;`20`20to`20ensure`20we`20don't`20page`20fault`20above`20IPL`202`20wh Ven X`09`09`09;`20`20we`20go`20to`20fetch`20this`20piece`20of`20data). XCmkrnl_args: X`09.long`091`09;`201`20argument`20to`20be`20passed`20`20 X`09.address`20pid`20`20`20`20;`20`20and`20this`20is`20it! X Xpid:`09.blkl`091`09;`20Store`20the`20user-specified`20PID`20of`20process`20to V`20undelete. X XEnd_lock: X X X;`20Setup`20a`20descriptor`20for`20use`20by`20the`20LIB$GET_INPUT`20routine. X Xpid_desc: X`09.word`098`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20;`208`20bytes`20long X`09.byte`09DSC$K_DTYPE_T`09`09;`20datatype`20is`20text X`09.byte`09DSC$K_CLASS_S`09`09;`20class`20is`20fixed-length X`09.address`20.+4 X`09.blkb`098`20`20`09`09`09;`208`20bytes`20ought`20to`20hold`20it! X Xprompt:`09.ascid`09/Pid?`20/ X X X;`20Specify`20the`20range`20of`20code/data`20residing`20in`20user-mode`20that V`20we`20need`20to`20lock`20 X;`20down. X XUser_data_to_lock: X`09.address`09begin_lock X`09.address`09end_lock X X X X`09.ENTRY`09Delete_Undelete,`5EM<> X X;`20Get`20PID`20(in`20character`20form) X X`09pushal`09pid_desc`09`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20;`20res Vultant-length X`09pushal`09prompt`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;`20prompt-string X`09pushal`09pid_desc`09`09`09;`20resultant-string X`09calls`09#3,g`5Elib$get_input`09`09;`20ask`20user`20for`20EPID X`09error_check`09`09`09`09;`20any`20errors? X X;`20Convert`20it`20from`20character`20to`20longword`20format. X X`09pushal`09pid`09`09`09`09;`20output`20longword`20value X`09pushal`09pid_desc`09`09`09;`20input`20string X`09calls`09#2,g`5Eots$cvt_tz_l`09`09;`20convert`20text`20PID`20to`20integer X`09error_check`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;`20any`20errors? X X X;`20Since`20we're`20raising`20our`20IPL`20to`20IPL$_ASTDEL`20('cause`20we`20do Vn't`20want`20the X;`20possibility`20of`20our`20being`20deleted`20while`20we're`20messing`20with V`20system X;`20data`20structures)`20we`20must`20also`20lock`20down`20our`20code`20since V`20we`20can't`20page X;`20fault`20at`20elevated`20IPL. X X X`09$lkwset_s`09inadr=User_data_to_lock`20`20`20;`20lock`20down`20data`20in`20u Vser`20mode X`09error_check X X;`20Get`20into`20kernel`20mode`20to`20do`20the`20real`20work. X X`09$cmkrnl_s`09routin=Zap_It,arglst=Cmkrnl_args X`09error_check X X`09ret`09`09`09`09;`20Drop`20back`20to`20DCL! X X X;********************************************************************** X; X;`20Kernel`20mode`20to`20reverse`20NODELETE`20flag`20in`20PCB X; X;********************************************************************** X XKernel_lock:`09`09`09`09 X`09.address`09kernel_beg X`09.address`09kernel_end X X`09.ENTRY`09Zap_It,`5EM X X;`20Lock`20down`20memory`20so`20that`20we`20don't`20fault`20above`20IPL$_ASTDE VL`20(2).`20Page`20faults X;`20*are*`20allowed`20in`20Kernel`20mode`20-`20just`20not`20at`20elevated`20IP VL. X X`09$lkwset_s`09inadr=kernel_lock`09;`20Lock`20down`20kernel`20mode`20code X`09blbc`09r0,error_routine`09`09;`20If`20problems`20then`20leave X X;`20$CMKRNL`20argument`20list`20specifies`201`20argument:`20the`20user-entered V`20PID. X X`09movl`09@first_arg(ap),R0`20`09`09;`20EPID`20is`20in`20R0`20so`20now`20let X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20;`20`20VMS V`20convert`20to`20IPID X X;`20We`20need`20an`20internal`20PID`20(IPID)`20so`20convert`20it.`20Input`20is V`20R0,`20output`20is`20R0. X X`09jsb`09g`5Eexe$epid_to_ipid`09`09 X X X;`20Obtain`20the`20SCHED`20spinlock`20so`20that`20we`20can`20raise`20IPL`20on V`20a`20multiprocessor X;`20system. X Xkernel_beg:`20lock`20lockname=sched,-`09`09;`20Synch`20w/schedulers`20database V X`09`20`20`20`20`20`20`20`20`20preserve=YES`09`09`09;`20Save`20R0 X X`09movl`09g`5Esch$gl_pcbvec,r2`09`09;`20Get`20base`20of`20PCB`20vector`20table V X`09movzwl`09r0,r0`09`09`09`09;`20Just`20use`20low`20order`20PID X`09movl`09(r2)`5Br0`5D,r0`09`09`09;`20Grab`20his`20PCB X`09cmpl`09pcb$l_epid(r0),@first_arg(ap)`09;`20Is`20he`20still`20there? X`09bneq`09error_routine`09`09`09;`20If`20not;`20wrapup`20`26`20leave X`09bbc`09#pcb$v_phdres,pcb$l_sts(r0),error_routine`20;`20If`20PHD`20not`20resi Vdent, X`09`09`09`09`09`09`09`20`20;`20`20skip`20it. X`09bicl`09#pcb$m_nodelet,pcb$l_sts(r0)`09;`20turn`20off`20NODELETE`20flag X X X`09unlock`09lockname=sched,newipl=#0`09;`20Give`20up`20SCHED`20spinlock X`09movl`09#ss$_normal,r0`09`09`09;`20Plug`20good`20status X`09ret`09`09`09`09`09;`20Exit`20kernel`20mode X X Xerror_routine:`09`09`09`09`09;`20cleanup`20after`20ourselves... X X`09unlock`09lockname=sched,newipl=#0`09;`20give`20up`20SCHED`20spinlock X X`09movl`09#ss$_nonexpr,r0`09`09`09;`20Tell`20user`20the`20process`20is`20not V`20 X`09ret`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20;`20`20`20here`20and`20return`20back. X Xkernel_end: X X`09.end`09Delete_Undelete $ call unpack DELETE_UNDELETE.MAR;1 1097043716 "" 10 1 4 $! $ create 'f' X;`20MODIFY_PROCESS_STATUS X; X;`20This`20routine`20marks`20the`20NODELETE`20flag`20in`20the`20PCB`20so`20tha Vt`20a`20process X;`20in`20effect`20is`20"un-deletable".`20Attempting`20to`20stop`20a`20process V`20marked`20NODELETE X;`20(even`20will`20all`20privileges`20turned`20on)`20will`20result`20in`20the V`20following`20message: X; X;`09`20%SYSTEM-F-NODELETE,`20object`20cannot`20be`20deleted; X; X; X;`20For`20information`20on`20using`20this`20routine`20to`20turn`20on`20"Networ Vk"`20status,`20please X;`20see`20the`20comments`20in`20the`20code`20below. X; X; X;`09`09`09`20`20`20`20`20Information`20America X;`09`09`09`20`20`20`20`20`20`20`20J.`20Wren`20Hunt X;`09`09`09`20`20`20`20`20`20`20June`201,`201990 X; X; X;`20OPERATION:`20To`20use`20this`20routine`20from`20a`20high-level`20language V`20such`20as`20FORTRAN X;`09`20`20`20`20`20simply`20do`20a`20CALL: X; X;`09`09`09CALL`20MODIFY_PROCESS_STATUS() X; X; X;`20`20`20`20`20`20`20 X;`20CAUTION:`09This`20feature`20is`20UNDOCUMENTED`20`26`20UNSUPPORTED`20by`20D VIGITAL!!!!!! X;`09`09Use`20at`20your`20own`20risk.`20Neither`20the`20author`20nor`20Informat Vion X;`09`09America`20is`20responsible`20for`20this`20code.`20 X; X;`09`09This`20code`20has`20been`20tested`20on`20single`20`26`20multiprocessor V`20machines X;`09`09both`20in`20and`20out`20of`20a`20VAXcluster`20running`20VMS`205.2`20thr Vough`20VMS`205.5 X;`09`09with`20no`20apparent`20problems. X; X; X;`20ENVIRONMENT:`09VAX`20MACRO X;`09`20`20`20`20`20`20`20`20VAX`20VMS`20V5.2-1 X; X; X;`20`20THE`20INFORMATION`20IN`20THIS`20SOFTWARE`20IS`20`20SUBJECT`20TO`20CHANG VE`20WITHOUT`20NOTICE`20`20`20 X;`20`20AND`20`20SHOULD`20`20NOT`20`20BE`20`20CONSTRUED`20AS`20`20A`20COMMITMEN VT`20BY`20EITHER`20THE`20AUTHOR X;`20`20NOR`20INFORMATION`20AMERICA. X; X;`20 X X`09.library`09/sys$library:lib.mlb/ X`09.link`09`09/sys$system:sys.stb/ X X`09$pcbdef`09`09`09`09;`20process`20control`20block`20defs X X X;`20Save`20all`20registers`20since`20we`20don't`20know`20which`20ones`20may`20 Vor`20may`20not`20be`20used X;`20by`20the`20compiler`20of`20your`20choice`20(if`20called`20from`20a`20high- Vlevel`20language). X X`09.psect`20`20code,exe,rd,nowrt X`09.entry`09MODIFY_PROCESS_STATUS,`5Em X X;`20Get`20into`20kernel`20mode`20and`20have`20fun!`20(Remember:`20any`20errors V`20while`20in`20Kernel X;`20mode`20and`20your`20system`20will`20bite`20the`20farm!`20Note`20that`20we V`20don't`20have`20to`20lock X;`20down`20our`20working`20set`20pages`20since`20we're`20not`20running`20at`20 Velevated`20IPL.`20Page X;`20faults`20*ARE*`20allowed`20in`20Kernel`20mode;`20only`20when`20you're`20ab Vove`20IPL`202`20(ASTDEL) X;`20do`20they`20cause`20problems) X X`09$cmkrnl_s`09routin=change_status X`09ret`09`09`09`09`09;`20back`20to`20DCL! X X`20 X X`09.Entry`09change_status,`5Em X X;`09Modify`20the`20following`20lines`20depending`20on`20what`20type`20status V`20you`20want. X`09 X`09bisl`09#pcb$m_nodelet,pcb$l_sts(r4)`09;`20set`20the`20NODELETE`20bit`20in V`20PCB X X;`20NOTE:`20It`20is`20also`20possible`20to`20make`20your`20process`20a`20"Netw Vork"`20process`20(visible X;`20`20`20`20`20`20`20via`20a`20DCL`20$`20SHOW`20SYSTEM/NETWORK`20command)`20b Vy`20changing`20PCB$M_NODELET`20to`20 X;`20`20`20`20`20`20`20PCB$M_NETWRK`20as`20illustrated`20below.`20Comment-out V`20or`20remove`20the`20preceeding X;`09line`20and`20un-comment`20the`20following`20line. X X;`09bisl`09#pcb$m_netwrk,pcb$l_sts(r4)`09;`20set`20the`20NETWORK`20bit`20in`20 VPCB X X`09movl`09#ss$_normal,r0`09`09`09;`20pass`20back`20a`20successful`20stat X`09ret`09`09`09`09`09;`20exit`20kernel`20mode X`20 X`09.end`09;`20don't`20put`20module`20name`20to`20avoid`20"multiple`20xfer`20ad Vdress"`20error $ call unpack MODIFY_PROCESS_STATUS.MAR;1 1681929744 "" 6 2 4 $! $ create 'f' XThis`20file`20offers`20a`20program`20originally`20published`20in`20the`20July/ VAugust`201993 Xissue`20of`20Digital`20Systems`20Journal.`20It`20was`20first`20run`20as`20part V`20of`20J.`20Wren XHunt's`20article`20"Modifying`20OpenVMS`20Process`20Statuses,"`20found`20on`20 Vpage`2025.`20`20It Xpresents`20a`20MACRO`20routine`20that`20demonstrates`20how`20to`20modify`20Ope VnVMs`20process Xstatuses`20to`20solve`20accidental`20deletion`20of`20an`20importat`20process, V`20or`20to`20have Xour`20network-related`20jobs`20show`20up`20on`20a`20DCL`20$`20SHOW`20SYSTEM/NE VTWORK`20command. $ call unpack NDELET.DESC;1 1140937117 "" 1 3 4 $! $ create 'f' X/*`20TEST_NODELETE X X`20`20`20This`20is`20a`20simple`20program`20to`20test`20the`20features`20of`20 Vthe`20MODIFY_PROCESS_STATUS X`20`20`20routine.`20After`20calling`20the`20routine`20it`20will`20hibernate`20 Vand`20will`20be`20 X`20`20`20"undeletable"`20by`20a`20system`20service`20$DELPRC`20or`20a`20DCL`20 VSTOP/ID=pid. X X`20`20`20`20To`20delete`20the`20process,`20run`20the`20DELETE_UNDELETE`20progr Vam`20to`20reset`20the`20job X`20`20`20`20and`20then`20delete`20the`20job`20normally. X X`20`20`20`20To`20build:`20`20`20$`20CC`20TEST_NODELETE X`09`20`20`20`20`20`20`20`20$`20LINK`20TEST_NODELETE,MODIFY_PROCESS_STATUS X X`20`20`20`20To`20run:`09$`20RUN/DETACH`20TEST_NODELETE X X X`09`09`09J.`20Wren`20Hunt X`09`09`09October`201,`201992 X*/ X X#include`20descrip`09/*`20string`20descriptor`20definitions`20for`20C`20*/ X Xmain() X`7B Xregister`20sts$value; Xstatic`09$DESCRIPTOR`20(process_name,`20"Can't`20kill`20me!"); X X`20`20`20`20sts$value`20=`20sys$setprn`20(`26process_name); X`20`20`20`20if`20((sts$value`20`26`201)`20!=`201)`20lib$stop(sts$value); X X`20`20`20`20modify_process_status();`09`20`20`20`20/*`20make`20it`20immortal V`09`20`20`20`20*/ X X`20`20`20`20sts$value`20=`20sys$hiber();`09`20`20`20`20/*`20...and`20go`20to V`20sleep`20`20`20*/ X`20`20`20`20if`20((sts$value`20`26`201)`20!=`201)`20lib$stop(sts$value); X`7D $ call unpack TEST_NODELETE.C;1 1813113729 "" 2 4 4 $ v=f$verify(v) $ exit