From: SMTP%"DSJ@WKUVX1.WKU.EDU" 9-APR-1994 15:35:09.70 To: EVERHART CC: Subj: APRIL94.QRDRVR Message-Id: <9404091921.AA24038@uu7.psi.com> X-Fileserver: Digital Systems Journal File Server Date: Sat, 09 Apr 1994 14:22:42 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: APRIL94.QRDRVR To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : QRDRVR $! By : @WKUVX1.BITNET $! Date : 8-APR-1994 05:24:58.38 $! 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. QRDRVR.DSJ;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 X`20`20`20`20`20`20`20`20.TITLE`20`20QRDRiver`20`20`20`20`20`20`20`20;skeleton V`20driver`20implementing`20ucb`20linkage X`20`20`20`20`20`20`20`20.IDENT`20`20'V01b' X;`20public`20domain,`20usage`20encouraged. X;`20Author:`20Glenn`20C.`20Everhart X; X;vms$$v6=0`20`20`20`20`20`20;add`20forvms`20v6`20def'n Xvms$v5=1 X;`20define`20v5$picky`20also`20for`20SMP`20operation Xv5$picky=1 X`20`20`20`20`20`20`20`20.SBTTL`20`20EXTERNAL`20AND`20LOCAL`20DEFINITIONS X X;`20 X;`20EXTERNAL`20SYMBOLS X;`20 X`20`20`20`20`20`20`20`20.library`20/SYS$SHARE:LIB/ X X;`20`20`20`20`20`20`20$ADPDEF`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;DEFINE`20ADAPTER`20CONTROL`20BLOCK X`20`20`20`20`20`20`20`20$CRBDEF`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;DEFINE`20CHANNEL`20REQUEST`20BLOCK X`20`20`20`20`20`20`20`20$DYNDEF`20;define`20dynamic`20data`20types X`20`20`20`20`20`20`20`20$DCDEF`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;DEFINE`20DEVICE`20CLASS X`20`20`20`20`20`20`20`20$DDBDEF`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;DEFINE`20DEVICE`20DATA`20BLOCK X`20`20`20`20`20`20`20`20$DEVDEF`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;DEFINE`20DEVICE`20CHARACTERISTICS X`20`20`20`20`20`20`20`20$DPTDEF`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;DEFINE`20DRIVER`20PROLOGUE`20TABLE X`20`20`20`20`20`20`20`20$EMBDEF`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;DEFINE`20ERROR`20MESSAGE`20BUFFER X`20`20`20`20`20`20`20`20$IDBDEF`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;DEFINE`20INTERRUPT`20DATA`20BLOCK X`20`20`20`20`20`20`20`20$IODEF`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;DEFINE`20I/O`20FUNCTION`20CODES X`20`20`20`20`20`20`20`20$DDTDEF`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;`20DEFINE`20DISPATCH`20TBL... X`20`20`20`20`20`20`20`20$ptedef X`20`20`20`20`20`20`20`20$vadef X`20`20`20`20`20`20`20`20$IRPDEF`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;DEFINE`20I/O`20REQUEST`20PACKET X`20`20`20`20`20`20`20`20$irpedef X`20`20`20`20`20`20`20`20$PRDEF`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;DEFINE`20PROCESSOR`20REGISTERS X`20`20`20`20`20`20`20`20$SSDEF`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;DEFINE`20SYSTEM`20STATUS`20CODES X`20`20`20`20`20`20`20`20$UCBDEF`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;DEFINE`20UNIT`20CONTROL`20BLOCK X`20`20`20`20`20`20`20`20$psldef X`20`20`20`20`20`20`20`20$prdef X`20`20`20`20`20`20`20`20$acldef X`20`20`20`20`20`20`20`20$rsndef`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;define`20resource`20numbers X`20`20`20`20`20`20`20`20$acedef X`20`20`20`20`20`20`20`20$VECDEF`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;DEFINE`20INTERRUPT`20VECTOR`20BLOCK X`20`20`20`20`20`20`20`20$pcbdef X`20`20`20`20`20`20`20`20$statedef X`20`20`20`20`20`20`20`20$jibdef X`20`20`20`20`20`20`20`20$acbdef X`20`20`20`20`20`20`20`20$vcbdef X`20`20`20`20`20`20`20`20$arbdef X`20`20`20`20`20`20`20`20$wcbdef X`20`20`20`20`20`20`20`20$ccbdef X`20`20`20`20`20`20`20`20$fcbdef X`20`20`20`20`20`20`20`20$phddef X`20`20`20`20`20`20`20`20$RABDEF`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;`20RAB`20structure`20defs X`20`20`20`20`20`20`20`20$RMSDEF`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;`20RMS`20constants X;`20defs`20for`20acl`20hacking X`20`20`20`20`20`20`20`20$fibdef X`20`20`20`20`20`20`20`20$atrdef Xp1=0`20`20`20`20;`20first`20qio`20param Xp2=4 Xp3=8 Xp4=12 Xp5=16 Xp6=20`20`20`20;6th`20qio`20param`20offsets X X`20`20`20`20`20`20`20`20.IF`20`20`20`20`20DF,VMS$V5`20`20`20`20`20`20`20;VMS V`20V5`20+`20LATER`20ONLY X`20`20`20`20`20`20`20`20$SPLCODDEF X`20`20`20`20`20`20`20`20$cpudef X`20`20`20`20`20`20`20`20.ENDC X;`20 X;`20UCB`20OFFSETS`20WHICH`20FOLLOW`20THE`20STANDARD`20UCB`20FIELDS X;`20 X`20`20`20`20`20`20`20`20$DEFINI`20UCB`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;START`20OF`20UCB`20DEFINITIONS X X.=UCB$K_LCL_DISK_LENGTH`20;v4`20def`20end`20of`20ucb X;`20USE`20THESE`20FIELDS`20TO`20HOLD`20OUR`20LOCAL`20DATA`20FOR`20VIRT`20DISK. V X;`20Add`20our`20stuff`20at`20the`20end`20to`20ensure`20we`20don't`20mess`20som Ve`20fields`20up`20that`20some X;`20areas`20of`20VMS`20may`20want. X;`20Leave`20thisfield`20first`20so`20we`20can`20know`20all`20diskswill`20have V`20it`20at`20the X;`20same`20offset. X$def`20`20`20`20ucb$l_oldfdt`20`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20;f Vdt`20tbl`20of`20prior`20fdt`20chain X; X; X; X;`20Add`20other`20fields`20here`20if`20desired. X; X; X; X; X; X;`20`20`20`20`20`20`20;`20here`20is`20one`20example`20additional`20field X$def`20`20`20`20ucb$l_ctlflgs`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;flags`20to`20control`20modes X; X$def`20`20`20`20ucb$l_QD_host_descr`20`20`20`20`20.blkl`20`20`202`20`20`20`20 V`20`20`20;`20char`20string`20descr X; X; X;`20DDT`20intercept`20fields X;`20following`20must`20be`20contiguous. X$def`20`20`20`20ucb$s_ppdbgn`20`20`20`20`20`20`20`20`20`20`20`20;add`20any`20m Vore`20prepended`20stuff`20after`20this X$def`20`20`20`20ucb$l_uniqid`20`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20;d Vriver-unique`20ID,`20gets`20filled`20in 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;`20by`20DPT`20address`20for`20easy V`20following 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;`20by`20SDA X$def`20`20`20`20ucb$l_intcddt`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20;`20 VOur`20interceptor's`20DDT`20address`20if 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;`20we`20are`20intercepted X$def`20`20`20`20ucb$l_prevddt`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20;`20 Vprevious`20DDT`20address X$def`20`20`20`20ucb$l_icsign`20`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20; V`20unique`20pattern`20that`20identifies 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;`20this`20as`20a`20DDT`20intercept V`20block X;`20NOTE:`20Jon`20Pinkley`20suggests`20that`20the`20DDT`20size`20should`20be V`20encoded`20in`20part`20of`20this X;`20unique`20ID`20so`20that`20incompatible`20future`20versions`20will`20be`20g Vuarded`20against. X$def`20`20`20`20ucb$s_ppdend X$def`20`20`20`20ucb$a_vicddt`20`20`20`20.blkb`20`20`20ddt$k_length 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;`20space`20for`20victim's`20DDT 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.blkl V`20`20`204`20`20`20`20`20`20`20;safety X$def`20`20`20`20ucb$l_backlk`20`20`20`20.blkl`20`20`201`20`20`20`20`20`20`20;b Vacklink`20to`20victim`20ucb X;`20Make`20the`20"unique`20magic`20number"`20depend`20on`20the`20DDT`20length, V`20and`20on`20the X;`20length`20of`20the`20prepended`20material.`20If`20anything`20new`20is`20add Ved,`20be`20sure`20that X;`20this`20magic`20number`20value`20changes. Xmagic=`5ExF012F000`20+`20ddt$k_length`20+`20<256*> Xp.magic=`5ExF012F000`20+`20ddt$k_length`20+`20<256*> X$DEF`20`20`20`20UCB$K_QD_LEN`20`20`20`20.BLKW`20`20`201`20`20`20`20`20`20`20;L VENGTH`20OF`20UCB X;UCB$K_QD_LEN=.`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;LENGTH`20OF`20UCB X X`20`20`20`20`20`20`20`20$DEFEND`20UCB`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;END`20OF`20UCB`20DEFINITONS X`20 X`20`20`20`20`20`20`20`20.SBTTL`20`20STANDARD`20TABLES X X;`20 X;`20DRIVER`20PROLOGUE`20TABLE X;`20 X;`20`20`20`20`20`20`20THE`20DPT`20DESCRIBES`20DRIVER`20PARAMETERS`20AND`20I/O V`20DATABASE`20FIELDS X;`20`20`20`20`20`20`20THAT`20ARE`20TO`20BE`20INITIALIZED`20DURING`20DRIVER`20L VOADING`20AND`20RELOADING X;`20 X`20`20`20`20`20`20`20`20.PSECT`20`20$$$105_PROLOGUE XQD_UNITS=3 XQD$DPT:: X`20`20`20`20`20`20`20`20.if`20ndf,vms$$v6 X`20`20`20`20`20`20`20`20DPTAB`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;DPT`20CREATION`20MACRO X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20END=QD_END,-`20`20`20`20`20`20 V`20`20`20`20`20`20;END`20OF`20DRIVER`20LABEL X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ADAPTER=NULL,-`20`20`20`20`20 V`20`20`20`20`20;ADAPTER`20TYPE`20=`20NONE`20(VIRTUAL) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20FLAGS=DPT$M_SMPMOD!DPT$M_NOUNL VOAD,`20-`20`20`20;SET`20TO`20USE`20SMP X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20DEFUNITS=2,-`20`20`20`20`20`20 V`20`20`20`20`20`20;UNITS`200`20THRU`201`20thru`2031 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20UCBSIZE=UCB$K_QD_LEN,-`20`20;L VENGTH`20OF`20UCB X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20MAXUNITS=QD_UNITS,-`20`20`20 V`20`20;FOR`20SANITY...CAN`20CHANGE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NAME=QDDRIVER`20`20`20`20`20 V`20`20`20`20`20`20;DRIVER`20NAME X`20`20`20`20`20`20`20`20.iff X`20`20`20`20`20`20`20`20DPTAB`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;DPT`20CREATION`20MACRO X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20END=QD_END,-`20`20`20`20`20`20 V`20`20`20`20`20`20;END`20OF`20DRIVER`20LABEL X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ADAPTER=NULL,-`20`20`20`20`20 V`20`20`20`20`20;ADAPTER`20TYPE`20=`20NONE`20(VIRTUAL) X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20FLAGS=DPT$M_SMPMOD!dpt$m_xpamo Vd!DPT$M_NOUNLOAD,`20-`20;SET`20TO`20USE`20 XSMP,xa X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20DEFUNITS=2,-`20`20`20`20`20`20 V`20`20`20`20`20`20;UNITS`200`20THRU`201`20thru`2031 X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20UCBSIZE=UCB$K_QD_LEN,-`20`20;L VENGTH`20OF`20UCB X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20MAXUNITS=QD_UNITS,-`20`20`20 V`20`20;FOR`20SANITY...CAN`20CHANGE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20NAME=QDDRIVER`20`20`20`20`20 V`20`20`20`20`20`20;DRIVER`20NAME X`20`20`20`20`20`20`20`20.endc X X`20`20`20`20`20`20`20`20DPT_STORE`20INIT`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;START`20CONTROL`20BLOCK`20INIT`20VALUES X`20`20`20`20`20`20`20`20DPT_STORE`20DDB,DDB$L_ACPD,L,<`5EA`5CF11`5C>`20`20;DEF VAULT`20ACP`20NAME X`20`20`20`20`20`20`20`20DPT_STORE`20DDB,DDB$L_ACPD+3,B,DDB$K_PACK`20;ACP`20CLA VSS X`20`20`20`20`20`20`20`20.IF`20`20`20`20`20NDF,VMS$V5 X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_FIPL,B,8`20`20`20`20;FORK`20IPL V`20(VMS`20V4.X) X`20`20`20`20`20`20`20`20.IFF`20`20`20`20;DEFINE`20FOR`20VMS`20V5.X`20`26`20LAT VER X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_FLCK,B,SPL$C_IOLOCK8`20`20;FORK V`20IPL`20(VMS`20V5.X`20+`20LATER) X`20`20`20`20`20`20`20`20.ENDC X;`20These`20characteristics`20for`20an`20intercept`20driver`20shouldn't`20look V`20just X;`20like`20a`20real`20disk`20unless`20it`20is`20prepared`20to`20handle`20being V`20mounted,`20etc. X;`20Therefore`20comment`20a`20couple`20of`20them`20out. X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$L_DEVCHAR,L,-`20;DEVICE`20CHARACTE VRISTICS X`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;`20RANDOM`20ACCESS X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$L_DEVCHAR2,L,-`20;DEVICE`20CHARACT VERISTICS X`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;`20Prefix`20name`20with`20"node$"`20(like`20rp06) X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_DEVCLASS,B,DC$_DISK`20`20;DEVICE V`20CLASS X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$W_DEVBUFSIZ,W,512`20`20;DEFAULT`20 VBUFFER`20SIZE X;`20FOLLOWING`20DEFINES`20OUR`20DEVICE`20"PHYSICAL`20LAYOUT".`20It's`20faked V`20here. X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_TRACKS,B,1`20`20;`201`20TRK/CYL V X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_SECTORS,B,64`20`20;NUMBER`20OF V`20SECTORS`20PER`20TRACK X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$W_CYLINDERS,W,16`20`20;NUMBER`20OF V`20CYLINDERS X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_DIPL,B,21`20`20`20;DEVICE`20IPL V X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$B_ERTMAX,B,10`20;MAX`20ERROR`20RET VRY`20COUNT X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$W_DEVSTS,W,-`20`20;INHIBIT`20LOG V`20TO`20PHYS`20CONVERSION`20IN`20FDT X`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;... X; X;`20don't`20mess`20with`20LBN;`20leave`20alone`20so`20it's`20easier`20to`20hac Vk`20on... X; X`20`20`20`20`20`20`20`20DPT_STORE`20REINIT`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20;START`20CONTROL`20BLOCK`20RE-INIT`20VALUES X`20`20`20`20`20`20`20`20DPT_STORE`20CRB,CRB$L_INTD+VEC$L_INITIAL,-`20`20;CONTR VOLLER`20INIT`20ADDRESS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20D,QD_ctrl_IN VIT`20`20`20`20`20`20`20`20`20`20`20`20`20`20;... X`20`20`20`20`20`20`20`20DPT_STORE`20CRB,CRB$L_INTD+VEC$L_UNITINIT,-`20;UNIT`20 VINIT`20ADDRESS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20D,QD_unit_IN VIT`20`20`20`20`20`20`20`20`20`20`20`20`20`20;... X`20`20`20`20`20`20`20`20DPT_STORE`20DDB,DDB$L_DDT,D,QD$DDT`20`20`20`20`20`20 V`20`20`20`20;DDT`20ADDRESS X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$L_UNIQID,D,DPT$TAB`20`20`20`20;sto Vre`20DPT`20address 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(change V`20"XX"`20to`20device 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;`20mnemonic V`20correct`20values) X`20`20`20`20`20`20`20`20DPT_STORE`20UCB,UCB$L_ICSIGN,L,magic`20`20`20`20`20`20 V;`20Add`20unique`20pattern`20(that`20might 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;`20bring`20 Vback`20some`20memories`20in 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;`20DOS-11 V`20users) X X;`20HISTORICAL`20NOTE:`20under`20DOS-11,`20one`20would`20get`20F012`20and`20F0 V24`20errors X;`20on`20odd`20address`20and`20illegal`20instruction`20traps.`20If`20we`20don' Vt`20have X;`20this`20magic`20number`20HERE,`20on`20the`20other`20hand,`20we're`20likely V`20to`20see X;`20bugchecks`20in`20VMS`20due`20to`20uncontrolled`20bashing`20of`20UCB`20fiel Vds! X`20`20`20`20`20`20`20`20DPT_STORE`20END`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;END`20OF`20INITIALIZATION`20TABLE X X;`20 X;`20DRIVER`20DISPATCH`20TABLE X;`20 X;`20`20`20`20`20`20`20THE`20DDT`20LISTS`20ENTRY`20POINTS`20FOR`20DRIVER`20SUBR VOUTINES`20WHICH`20ARE X;`20`20`20`20`20`20`20CALLED`20BY`20THE`20OPERATING`20SYSTEM. X;`20 X`20`20`20`20`20`20`20`20DDTAB`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;DDT`20CREATION`20MACRO X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20DEVNAM=QD,-`20`20`20`20`20`20 V`20`20`20`20`20`20`20;NAME`20OF`20DEVICE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20START=QD_STARTIO,-`20`20`20`20 V`20`20;START`20I/O`20ROUTINE X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20FUNCTB=QD_FUNCTABLE,-`20`20`20 V;FUNCTION`20DECISION`20TABLE X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20CANCEL=0,-`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;CANCEL=NO-OP`20FOR`20FILES`20DEVICE X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20REGDMP=0,-`20`20`20`20`20`20;REG VISTER`20DUMP`20ROUTINE X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20DIAGBF=0,-`20`20`20`20`20`20;BYT VES`20IN`20DIAG`20BUFFER X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ERLGBF=0`20`20`20`20`20`20`20 V`20;BYTES`20IN 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;ERRLOG`20BUFFER X;`20 X;`20FUNCTION`20DECISION`20TABLE X;`20 X;`20`20`20`20`20`20`20THE`20FDT`20LISTS`20VALID`20FUNCTION`20CODES,`20SPECIFIE VS`20WHICH X;`20`20`20`20`20`20`20CODES`20ARE`20BUFFERED,`20AND`20DESIGNATES`20SUBROUTINES V`20TO X;`20`20`20`20`20`20`20PERFORM`20PREPROCESSING`20FOR`20PARTICULAR`20FUNCTIONS. V X;`20 X;`20code`20chaining`20data: Xchnflg:`20.long`20`20`200`20`20`20`20`20`20`20;chain`20or`20use`20our`20FDT`20 Vchain`20flag...use`20ours`20if`200 Xmyonoff: Xfdtonoff:`20.long`200`20`20`20`20`20`20`20;switch`20my`20fdt`20stuff`20off`20i Vf`20non-0 X`20`20`20`20`20`20`20`20.ascii`20`20/flag/`20`20;define`20your`20own`20unique V`20flag`20here;`20just`20leave`20it`204`20bytes`20 Xlong! X`20`20`20`20`20`20`20`20.long`200`20`20`20`20`20`20`20`20`20;fdt`20tbl`20from V`20before`20patch Xfdt_chn`20`20=`20-12 Xfdt_prev`20=`20-4 Xfdt_idnt`20=`20-8 X;`20Note`20that`20function`20and`20buffered`20masks`20should`20be`20the`20same V`20as`20the`20victim X;`20device!!! XQD_FUNCTABLE: Xnewfdt: X`20`20`20`20`20`20`20`20FUNCTAB`20,-`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;LIST`20LEGAL`20FUNCTIONS 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 V`20`20`20`20`20`20`20`20`20`20;`20MOUNT`20VOLUME X;`20no-op`20phys`20I/O`20for`20a`20test`20here... X`20`20`20`20`20`20`20`20FUNCTAB`20,-`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;BUFFERED`20FUNCTIONS 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 V`20`20`20`20`20`20`20`20`20`20;`20MOUNT`20VOLUME X`20`20`20`20`20`20`20`20FUNCTAB`20QD_ALIGN,-`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20;TEST`20ALIGNMENT`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X;`20io$_format`20+`20modifiers`20(e.g.`20io$_format+128)`20as`20function`20cod Ve X;`20allows`20one`20to`20associate`20a`20QD`20unit`20and`20some`20other`20devic Ve;`20see X;`20the`20qd_format`20code`20comments`20for`20description`20of`20buffer`20to V`20be`20passed. X`20`20`20`20`20`20`20`20functab`20QD_format,-`20`20`20`20`20`20`20`20`20`20`20 V`20`20;point`20to`20host`20disk X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X; X;`20First`20our`20very`20own`20filter`20routines X; X;`20Following`20FDT`20function`20should`20cover`20every`20function`20in`20the V`20local X;`20FDT`20entries`20between`20"myfdtbgn"`20and`20"myfdtend",`20in`20this`20cas Ve`20just X;`20mount`20and`20modify.`20Its`20function`20is`20to`20switch`20these`20off`20 Vor`20on`20at X;`20need. X`20`20`20`20`20`20`20`20Functab`20fdtswitch,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 Xmyfdtbgn=. X;`20Leave`20a`20couple`20of`20these`20in`20place`20as`20an`20illustration.`20Y Vou`20would`20of`20course X;`20need`20to`20insert`20your`20own`20if`20you're`20messing`20with`20FDT`20cod Ve,`20or`20remove`20these`20if X;`20you`20don't`20want`20to.`20The`20FDT`20switch`20logic`20is`20a`20waste`20o Vf`20time`20and`20space`20if X;`20you`20do`20nothing`20with`20them... X;`20They`20don't`20actually`20do`20anything`20here,`20but`20could`20be`20added V`20to.`20Throw`20in`20one X;`20to`20call`20some`20daemon`20at`20various`20points`20and`20it`20can`20act V`20as`20a`20second`20ACP X;`20when`20control`20is`20inserted`20at`20FDT`20time`20(ahead`20of`20the`20DEC V`20ACP/XQP`20code!) X`20`20`20`20`20`20`20`20FUNCTAB`20MFYMOUNT,-`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20;MOUNT`20FUNCTION X`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;`20MOUNT`20VOLUME X`20`20`20`20`20`20`20`20FuncTab`20MFYFilt,- X`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;modify`20filter`20(e.g.`20extend) Xmyfdtend=. X;`20Note`20that`20if`20we`20want`20to`20allow`20numerous`20disk`20drivers`20to V`20be`20patched X;`20by`20this`20one`20there`20is`20not`20a`20unique`20path`20to`20the`20origin Val`20fdt X;`20routine.`20Therefore`20use`20a`20UCB`20cell`20for`20the`20patch,`20not`20a V`20cell X;`20ahead`20of`20the`20FDT.`20That`20way`20each`20unit`20gets`20a`20good`20ret Vurn X;`20path.`20That's`20why`20there's`20an`20"oldfdt"`20cell`20in`20the`20UCB`20h Vere. X; X;`20Following`20contains`20all`20legal`20functions`20in`20mask... X;`20That`20way`20it`20can`20transfer`20all`20control`20to`20a`20"previous"`20F VDT`20chain. X`20`20`20`20`20`20`20`20FuncTab`20fdttoorig,- 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 V`20`20`20`20`20`20`20`20`20`20;`20MOUNT`20VOLUME X;`20Now`20the`20"standard"`20disk`20FDT`20routines`20needed`20to`20let`20ODS-2 V`20work`20(or`20ods-1`20!) X;`20(Where`20we`20are`20doing`20read`20-`20or`20possibly`20write-`20virtual`20 Vby`20hand`20ourselves X;`20`20we`20may`20never`20get`20to`20these`20BTW...) X`20`20`20`20`20`20`20`20FUNCTAB`20+ACP$READBLK,-`20`20`20`20`20`20`20`20`20`20 V;READ`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+ACP$WRITEBLK,-`20`20`20`20`20`20`20`20`20;W VRITE`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+ACP$ACCESS,-`20`20`20`20`20`20`20`20`20`20 V`20;ACCESS`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+ACP$DEACCESS,-`20`20`20`20`20`20`20`20`20;D VEACCESS`20FUNCTION X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+ACP$MODIFY,-`20`20`20`20`20`20`20`20`20`20 V`20;MODIFY`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+ACP$MOUNT,-`20`20`20`20`20`20`20`20`20`20 V`20`20;MOUNT`20FUNCTION X`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;`20MOUNT`20VOLUME X`20`20`20`20`20`20`20`20FUNCTAB`20+EXE$ZEROPARM,-`20`20`20`20`20`20`20`20`20;Z VERO`20PARAMETER`20FUNCTIONS X`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;`20AVAILABLE X`20`20`20`20`20`20`20`20FUNCTAB`20+EXE$ONEPARM,-`20`20`20`20`20`20`20`20`20`20 V;ONE`20PARAMETER`20FUNCTION X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+EXE$SENSEMODE,-`20`20`20`20`20`20`20`20;SEN VSE`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20FUNCTAB`20+EXE$SETCHAR,-`20`20`20`20`20`20`20`20`20`20 V;SET`20FUNCTIONS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 X`20`20`20`20`20`20`20`20.PSECT`20`20$$$115_DRIVER X X;`20fdtswitch`20- X;`20`20`20Based`20on`20state`20of`20"myonoff"`20variable`20either`20enable`20o Vr`20disable X;`20my`20FDT`20processing,`20allowing`20the`20FDT`20chain`20to`20remain`20alwa Vys`20intact. X;`20This`20needs`20to`20be`20the`20first`20of`20a`20chain`20of`20FDT`20entries V`20added`20to`20the X;`20FDT`20processing`20of`20a`20driver. X Xfdtswitch: X`20`20`20`20`20`20`20`20tstl`20`20`20`20fdtonoff`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;global`20on/off X`20`20`20`20`20`20`20`20bneq`20`20`20`201$ X`20`20`20`20`20`20`20`20rsb`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;go`20to`20next`20FDT`20if`20null X1$:`20`20`20`20`20addl2`20`20`20#,r8`20;pass`20our`20fdt`20 Vcodes X`20`20`20`20`20`20`20`20rsb`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;return`20to`20std X;`20fdttoorig`20- X;`20`20This`20entry`20continues`20FDT`20processing`20at`20the`20point`20after V`20the`20new X;`20entries`20by`20returning`20to`20the`20original`20FDT`20chain`20at`20the`20 Vpoint`20where X;`20that`20chain`20begins.`20(It`20is`20presumed`20that`20FDT`20entries`20will V`20always`20be X;`20added`20ahead`20of`20existing`20ones`20due`20to`20the`20nonreturning`20nat Vure`20of X;`20FDT`20processing.)`20This`20is`20done`20instead`20of`20simply`20duplicatin Vg`20the X;`20DEC`20FDT`20entries`20because`20in`20this`20way`20multiple`20FDT`20patches V`20can X;`20coexist,`20as`20would`20be`20impossible`20if`20this`20trick`20were`20not V`20used.`20As X;`20can`20be`20seen,`20its`20overhead`20is`20minimal. X;`20`20The`20old`20FDT`20location`20is`20kept`20in`20the`20UCB`20for`20our`20d Vevice`20because X;`20that`20allows`20us`20to`20get`20back`20to`20different`20FDTs`20when`20seve Vral`20drivers' X;`20FDT`20chains`20are`20pointed`20here`20first. Xfdttoorig: X;`20As`20a`20performance`20feature,`20use`20a`20switch`20to`20let`20us`20just V`20use`20the X;`20FDT`20chain`20here`20rather`20than`20continuing`20an`20old`20one.`20This V`20needs`20to X;`20be`20settable`20externally`20since`20there`20is`20no`20need`20to`20return V`20down`20a X;`20chain`20unless`20something`20else`20is`20IN`20the`20chain. X;`20Control`20this`20with`20chnflg X`20`20`20`20`20`20`20`20tstl`20`20`20`20chnflg X`20`20`20`20`20`20`20`20beql`20`20`20`202$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;just`20continue`20if`20chnflg`20is`200 X`20`20`20`20`20`20`20`20pushl`20`20`20r0 X;`20(this`20routine`20gets`20called`20a`20fair`20bit`20and`20if`20GETQDUCB`20c Van`20be X;`20`20called`20less,`20things`20speed`20up.) X`20`20`20`20`20`20`20`20jsb`20`20`20`20`20getQDucb`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;get`20UCB`20for`20QD`20unit`20from`20stolen 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;one X`20`20`20`20`20`20`20`20tstl`20`20`20`20r0`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;r0`20is`20return`20UCB X`20`20`20`20`20`20`20`20bgeq`20`20`20`201$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20not`20negative,`20not`20a`20UCB X`20`20`20`20`20`20`20`20tstl`20`20`20`20ucb$l_oldfdt(r0)`20`20`20`20`20`20`20 V`20;a`20prior`20fdt`20exist? X`20`20`20`20`20`20`20`20beql`20`20`20`201$ X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_oldfdt(r0),r8`20`20`20`20`20`20; Vpoint`20to`20original`20FDT`20point X`20`20`20`20`20`20`20`20addl2`20`20`20#<16-12>,r8`20`20`20`20`20`20;pass`20the V`202`20entry`20masks X1$:`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;back`20up`20since`20sysqioreq`20adds`2012 X`20`20`20`20`20`20`20`20popl`20`20`20`20r0 X2$:`20`20`20`20`20`20`20`20rsb`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;off`20to`20the`20previous`20FDT`20routines. X; X;`20GETQDUCB`20-`20Find`20QD:`20UCB`20address,`20given`20r5`20points`20to`20UC VB`20of`20the`20patched X;`20device.`20Return`20the`20UCB`20in`20R0,`20which`20should`20return`200`20if V`20we`20can't`20find X;`20it. X;`20`20`20This`20routine`20is`20called`20a`20lot`20and`20therefore`20is`20made V`20as`20quick`20as X;`20it`20well`20can`20be,`20especially`20for`20the`20usual`20case. XgetQDucb: X;`20`20`20`20`20`20`20clrl`20`20`20`20r0`20`20`20`20`20`20;no`20UCB`20initiall Vy`20found X`20`20`20`20`20`20`20`20pushl`20`20`20r10 X`20`20`20`20`20`20`20`20pushl`20`20`20r11`20`20`20`20`20;faster`20than`20pushr V`20supposedly X;`20`20`20`20`20`20`20pushr`20`20`20#`5Em X;`20Assumes`20that`20R5`20is`20the`20UCB`20address`20of`20the`20device`20that V`20has`20had`20some X;`20code`20intercepted`20and`20that`20we`20are`20in`20some`20bit`20of`20code V`20that`20knows X;`20it`20is`20in`20an`20intercept`20driver.`20Also`20assumes`20R11`20may`20be V`20used`20as X;`20scratch`20registers`20(as`20is`20true`20in`20FDT`20routines).`20Control`20 Vreturns`20at X;`20label`20"err"`20if`20the`20DDT`20appears`20to`20have`20been`20clobbered`20 Vby X;`20something`20not`20following`20this`20standard,`20if`20conditional`20"chk.e Vrr" X;`20is`20defined. X;`20`20`20`20`20`20`20Entry:`20R5`20-`20victim`20device`20UCB`20address X;`20`20`20`20`20`20`20Exit:`20R11`20-`20intercept`20driver`20UCB`20address Xchk.err=0 X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_ddt(r5),r10`20`20`20`20`20`20`20 V;get`20the`20DDT`20we`20currently`20have X;`20note`20we`20know`20our`20virtual`20driver's`20DPT`20address!!! X`20`20`20`20`20`20`20`20movab`20`20`20QD$dpt,r11`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20;magic`20pattern`20is`20DPT`20addr. X;`20lock`20this`20section`20with`20forklock`20so`20we`20can`20safely`20remove V X;`20entries`20at`20fork`20also.`20Use`20victim`20device`20forklock. X;`20(don't`20preserve`20r0`20since`20we`20clobber`20it`20anyway.) X`20`20`20`20`20`20`20`20forklock`20lock=ucb$b_flck(r5),savipl=-(sp),preserve=N VO X2$:`20`20`20`20`20cmpl`20`20`20`20(r10),R11 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;this`20our`20own`20driver? X;`20`20`20`20`20`20`20`20beql`20`20`20`201$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20;if`20eql`20yes,`20end`20search X; X;`20The`20somewhat`20odd`20layout`20here`20removes`20extra`20branches`20in`20t Vhe X;`20most`20common`20case,`20i.e.,`20finding`20our`20driver`20the`20very`20firs Vt`20time X;`20through.`20The`20"bneq"`20branch`20next`20time`20is`20usually`20NOT`20take Vn. X; X`20`20`20`20`20`20`20`20bneq`20`20`20`205$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;check`20next`20in`20chain`20if`20not`20us X;`20At`20this`20point`20R10`20contains`20the`20DDT`20address`20within`20the`20 Vintercept X;`20driver's`20UCB.`20Return`20the`20address`20of`20the`20intercept`20driver's V`20UCB`20next. X`20`20`20`20`20`20`20`20movab`20`20`20<0-ucb$a_vicddt>(r10),r11`20`20`20`20`20 V`20`20;point`20R11`20at`20the`20intercept`20UCB X;`20`20`20`20`20`20`20brb`20`20`20`20`204$`20`20`20`20`20`20;`20note`20in`20th Vis`20layout`20we`20can`20comment`20this`20out. X4$: X`20`20`20`20`20`20`20`20forkunlock`20lock=ucb$b_flck(r5),newipl=(sp)+,preserve V=NO X;`20NOW`20clobber`20r0`20and`20put`20things`20back. X`20`20`20`20`20`20`20`20movl`20`20`20`20r11,r0 X;`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20popl`20`20`20`20r11 X`20`20`20`20`20`20`20`20popl`20`20`20`20r10`20`20`20`20`20;supposedly`20faster V`20than`20popr X`20`20`20`20`20`20`20`20rsb X;`20Make`20very`20sure`20this`20DDT`20is`20inside`20a`20UCB`20bashed`20accordi Vng`20to`20our X;`20specs.`20The`20"p.magic"`20number`20reflects`20some`20version`20info`20too V. X;`20If`20this`20is`20not`20so,`20not`20much`20sense`20searching`20more. X5$:`20`20`20`20`20cmpl`20`20`20`20(r10),#p.magic X`20`20`20`20`20`20`20`20bneq`20`20`20`203$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;exit`20if`20this`20is`20nonstd`20bash X;`20follow`20DDT`20block`20chain`20to`20next`20saved`20DDT. X`20`20`20`20`20`20`20`20movl`20`20`20`20(r10),r10 V 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;point`20R10`20at`20the`20next`20DDT V`20in`20the 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;chain X`20`20`20`20`20`20`20`20bgeq`20`20`20`203$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;`20(error`20check`20if`20not`20negative) X`20`20`20`20`20`20`20`20brb`20`20`20`20`202$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20;then`20check`20again X;1$: X3$: X`20`20`20`20`20`20`20`20clrl`20`20`20`20r11`20`20`20`20`20;return`200`20if`20n Vothing`20found X`20`20`20`20`20`20`20`20brb`20`20`20`20`204$ X; X;`20Few`20macros`20for`20long`20distance`20branches... X; X`20`20`20`20`20`20`20`20.macro`20`20beqlw`20`20`20lbl,?lbl2 X`20`20`20`20`20`20`20`20bneq`20`20`20`20lbl2 X`20`20`20`20`20`20`20`20brw`20`20`20`20`20lbl Xlbl2: X`20`20`20`20`20`20`20`20.endm X`20`20`20`20`20`20`20`20.macro`20`20bneqw`20`20`20lbl,?lbl2 X`20`20`20`20`20`20`20`20beql`20`20`20`20lbl2 X`20`20`20`20`20`20`20`20brw`20`20`20`20`20lbl Xlbl2: X`20`20`20`20`20`20`20`20.endm X`20`20`20`20`20`20`20`20.macro`20`20bleqw`20`20`20lbl,?lbl2 X`20`20`20`20`20`20`20`20bgtr`20`20`20`20lbl2 X`20`20`20`20`20`20`20`20brw`20`20`20`20`20lbl Xlbl2: X`20`20`20`20`20`20`20`20.endm X`20`20`20`20`20`20`20`20.macro`20`20bgeqw`20`20`20lbl,?lbl2 X`20`20`20`20`20`20`20`20blss`20`20`20`20lbl2 X`20`20`20`20`20`20`20`20brw`20`20`20`20`20lbl Xlbl2: X`20`20`20`20`20`20`20`20.endm X;`20allocate`20does`20not`20zero`20its`20result`20area. X;`20This`20macro`20makes`20it`20easy`20to`20zero`20an`20allocated`20area`20bef Vore`20using`20it. X;`20Leaves`20no`20side`20effects...just`20zeroes`20the`20area`20for`20"size" V`20bytes X;`20starting`20at`20"addr". X`20`20`20`20`20`20`20`20.macro`20`20zapz`20`20`20`20addr,size X`20`20`20`20`20`20`20`20pushr`20`20`20#`5Em`20`20;save`20re Vgs`20from`20movc5 X`20`20`20`20`20`20`20`20movc5`20`20`20#0,addr,#0,size,addr X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em`20`20;save`20 Vregs`20from`20movc5 X`20`20`20`20`20`20`20`20.endm X; X`20`20`20`20`20`20`20`20.SBTTL`20Our`20FDT`20Filter`20Routines X;`20These`20routines`20are`20edited`20from`20the`20QDdriver`20versions`20to`20 Vcall X;`20getQDucb,`20assuming`20they`20are`20called`20with`20R5`20pointing`20at`20t Vhe`20patched X;`20driver's`20UCB. X;`20INPUTS: X;`20 X;`20`20`20`20`20`20`20R3`20`20`20`20`20`20-`20IRP`20ADDRESS`20(I/O`20REQUEST V`20PACKET) X;`20`20`20`20`20`20`20R4`20`20`20`20`20`20-`20PCB`20ADDRESS`20(PROCESS`20CONTR VOL`20BLOCK) X;`20`20`20`20`20`20`20R5`20`20`20`20`20`20-`20UCB`20ADDRESS`20(UNIT`20CONTROL V`20BLOCK) X;`20`20`20`20`20`20`20R6`20`20`20`20`20`20-`20CCB`20ADDRESS`20(CHANNEL`20CONTR VOL`20BLOCK) X;`20`20`20`20`20`20`20R7`20`20`20`20`20`20-`20BIT`20NUMBER`20OF`20THE`20I/O`20 VFUNCTION`20CODE X;`20`20`20`20`20`20`20R8`20`20`20`20`20`20-`20ADDRESS`20OF`20FDT`20TABLE`20ENT VRY`20FOR`20THIS`20ROUTINE X;`20`20`20`20`20`20`20(AP)`20`20`20`20-`20ADDRESS`20OF`20FIRST`20QIO`20PARAMET VER X;`20Filter`20routines. X;`20These`20do`20the`20interesting`20stuff. XPopOut: X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20rsb Xmfyfilt:`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;filter`20on`20MODIFY`20requests`20(e.g.`20extend) X`20`20`20`20`20`20`20`20pushr`20`20`20#`5Em X;`20Example`20of`20getqducb`20call...`20we`20do`20it`20to`20test`20our`20enabl Ve`20flag`20in`20this X;`20intercept`20driver. X;`20(A`20priv'd`20image,`20derivable`20from`20asnvdm6.mar,`20can`20be`20used V`20to`20set`20the X;`20qd:`20unit`20online`20and`20issue`20the`20io$_format+128`20functioncode`20 Vi/o`20to X;`20associate`20the`20qd`20unit`20with`20another`20disk...or`20disassociate`20 Vit.) X`20`20`20`20`20`20`20`20jsb`20`20`20`20`20getQDucb`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;find`20QDdriver`20ucb X`20`20`20`20`20`20`20`20tstl`20`20`20`20r0 X`20`20`20`20`20`20`20`20bgeqw`20`20`20popout X`20`20`20`20`20`20`20`20movl`20`20`20`20r5,ucb$l_backlk(r0)`20`20`20`20`20;sav Ve`20link'd`20ucb`20in`20ours`20too. X`20`20`20`20`20`20`20`20movl`20`20`20`20r0,r5`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;point`20R5`20at`20QD`20UCB X`20`20`20`20`20`20`20`20bitl`20`20`20`20i`5E#2,ucb$l_ctlflgs(r5)`20`20;look`20 Vat`20mfy? X`20`20`20`20`20`20`20`20bneq`20`20`20`2011$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20neq`20yes X;`20(test`20later`20will`20see`20about`20space`20control`20if`20doing`20this) V X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20rsb X11$: X;`20Here`20we`20could`20alter`20stuff`20about`20a`20user's`20fib`20or`20the`20 Vlike... X;`20Note`20we`20also`20ought`20to`20check`20the`20FIB`20readability/writeabili Vty X;`20more`20carefully. X`20`20`20`20`20`20`20`20pushl`20`20`20r0 X`20`20`20`20`20`20`20`20movl`20`20`20`20p1(ap),r0`20`20`20`20`20`20`20;get`20f Vib X`20`20`20`20`20`20`20`20beql`20`20`20`20m2$`20`20`20`20`20`20`20`20`20`20`20 V`20`20;skip`20if`20it`20looks`20illegal X`20`20`20`20`20`20`20`20movl`20`20`20`204(r0),r0`20`20`20`20`20`20`20`20;...fr Vom`20descriptor X`20`20`20`20`20`20`20`20beql`20`20`20`20m2$ X`20`20`20`20`20`20`20`20bitw`20`20`20`20#fib$m_extend,fib$w_exctl(r0)`20`20`20 V;extending`20at`20all? X`20`20`20`20`20`20`20`20beql`20`20`20`20m2$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20no`20extend,`20leave`20fib`20alone X;`20maybe`20set`20fib`20bits`20here...? X;`20User`20fib`20address`20is`20in`20r0... X;`20Here's`20an`20example X`20`20`20`20`20`20`20`20bitw`20`20`20`20#fib$m_alcon,fib$w_exctl(r0)`20`20`20 V`20;contig`20alloc? X`20`20`20`20`20`20`20`20bneq`20`20`20`20m2$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20contig,`20leave`20it`20alone X;`20this`20forces`20contig`20best`20try`20allocation`20to`20keep`20the`20exten Vt`20cache X;`20flushed,`20slowing`20fragmentation`20a`20bit. X`20`20`20`20`20`20`20`20bisw`20`20`20`20#fib$m_alconb,fib$w_exctl(r0)`20;else V`20set`20contig`20best`20try Xm2$: X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20rsb Xmfymount: X;`20stick`20processing`20in`20here`20if`20doing`20anything`20at`20io$_mount`20 Vi/o`20time. X;`20for`20here,`20do`20nothing. X`20`20`20`20`20`20`20`20rsb X;++ X; X;`20QD_format`20-`20bash`20host`20disk`20tables`20to`20point`20at`20ours. X; X;`20With`20no`20function`20modifiers,`20this`20routine`20takes`20as`20argument Vs`20the`20name X;`20of`20the`20host`20disk`20(the`20real`20disk`20where`20the`20virtual`20disk V`20will`20exist), X;`20the`20size`20of`20the`20virtual`20disk,`20and`20the`20LBN`20where`20the`20 Vvirtual`20disk X;`20will`20start.`20After`20these`20are`20set`20up,`20the`20device`20is`20put V`20online`20and`20is X;`20software`20enabled. X; X;`20This`20routine`20does`20virtually`20no`20checking,`20so`20the`20parameters V`20must`20be X;`20correct. X; X;`20Inputs: X;`20`20`20`20`20`20`20p1`20-`20pointer`20to`20buffer.`20The`20buffer`20has`20t Vhe`20following`20format: X;`20`20`20`20`20`20`20`20`20`20`20`20longword`200`20-`20(was`20hlbn)`20-`20fla Vg`20for`20function.`201`20to`20bash 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`20th Ve`20targetted`20disk,`202`20to`20unbash`20it,`20else 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`20il Vlegal. X;`20`20`20`20`20`20`20`20`20`20`20`20longword`201`20-`20virtual`20disk`20lengt Vh,`20the`20number`20of`20blocks`20in 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`20th Ve`20virtual`20disk.`20If`20negative`20disables 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`20FD VT`20chaining;`20otherwise`20ignored. X;`20`20`20`20`20`20`20`20`20`20`20`20longword`202`20through`20the`20end`20of V`20the`20buffer,`20the`20name`20of`20the 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`20vi Vrtual`20disk.`20This`20buffer`20must`20be`20blank 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`20pa Vdded`20if`20padding`20is`20necessary X; X; X;`20`20`20`20`20`20`20p2`20-`20size`20of`20the`20above`20buffer X;-- XQD_format: X`20`20`20`20`20`20`20`20bicw3`20`20`20#io$m_fcode,irp$w_func(r3),r0`20`20`20;m Vask`20off`20function`20code X`20`20`20`20`20`20`20`20bneq`20`20`20`2020$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;branch`20if`20modifiers,`20special X;thus,`20normal`20io$_format`20will`20do`20nothing. X`20`20`20`20`20`20`20`20rsb`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;regular`20processing X100$: X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X10$: X`20`20`20`20`20`20`20`20movzwl`20`20#SS$_BADPARAM,r0`20`20`20`20`20`20`20`20;i Vllegal`20parameter X`20`20`20`20`20`20`20`20clrl`20`20`20`20r1 X`20`20`20`20`20`20`20`20jmp`20`20`20`20`20g`5Eexe$abortio X20$: X`20`20`20`20`20`20`20`20movl`20`20`20`20p1(ap),r0`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;buffer`20address X`20`20`20`20`20`20`20`20movl`20`20`20`20p2(ap),r1`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;length`20of`20buffer X`20`20`20`20`20`20`20`20jsb`20`20`20`20`20g`5Eexe$writechk`20`20`20`20`20`20 V`20`20`20`20;read`20access?`20doesn't`20return`20on`20error X;`20`20`20`20`20`20`20clrl`20`20`20`20irp$l_bcnt(r3)`20`20`20`20`20`20`20`20 V`20`20;paranoia,`20don't`20need`20to`20do`20this... X`20`20`20`20`20`20`20`20pushr`20`20`20#`5Em X`20`20`20`20`20`20`20`20movl`20`20`20`20p1(ap),r0`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;get`20buffer`20address X`20`20`20`20`20`20`20`20movl`20`20`20`20(r0)+,r7`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;get`20option`20code X`20`20`20`20`20`20`20`20bleq`20`20`20`20100$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;0`20or`20negative`20illegal X`20`20`20`20`20`20`20`20cmpl`20`20`20`20r7,#2`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;3`20and`20up`20illegal`20too X`20`20`20`20`20`20`20`20bgtr`20`20`20`20100$ X`20`20`20`20`20`20`20`20incl`20`20`20`20chnflg X`20`20`20`20`20`20`20`20movl`20`20`20`20(r0)+,r6`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;size`20of`20virtual`20disk`20(ignored) X`20`20`20`20`20`20`20`20bleq`20`20`20`2070$ X`20`20`20`20`20`20`20`20clrl`20`20`20`20chnflg`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;if`200`20or`20neg.`20size`20don't`20chain... X70$: X`20`20`20`20`20`20`20`20movab`20`20`20(r0),-`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;name`20of`20"real"`20disk X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ucb$l_QD_host_descr+4(r5) X`20`20`20`20`20`20`20`20subl3`20`20`20#8,p2(ap),-`20`20`20`20`20`20`20`20`20 V`20`20`20`20;set`20length`20of`20name`20in`20descriptor X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ucb$l_QD_host_descr(r5) X`20`20`20`20`20`20`20`20bleq`20`20`20`20100$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;bad`20length X`20`20`20`20`20`20`20`20movab`20`20`20ucb$l_QD_host_descr(r5),r1`20`20`20`20 V`20`20;descriptor`20for... X`20`20`20`20`20`20`20`20jsb`20`20`20`20`20g`5Eioc$searchdev`20`20`20`20`20`20 V`20`20`20;search`20for`20host`20device X`20`20`20`20`20`20`20`20blbs`20`20`20`20r0,30$`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;branch`20on`20success X;`20fail`20the`20associate... X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20movzwl`20`20#ss$_nosuchdev+2,r0`20`20`20`20`20;make`20 Van`20error,`20usually`20a`20warning X`20`20`20`20`20`20`20`20clrl`20`20`20`20r1 X`20`20`20`20`20`20`20`20jmp`20`20`20`20`20g`5Eexe$abortio`20`20`20`20`20`20`20 V`20`20`20`20;exit`20with`20error X30$:`20`20`20`20;found`20the`20device X;`20r1`20is`20target`20ucb`20address... X;`20move`20it`20to`20r11`20to`20be`20less`20volatile X`20`20`20`20`20`20`20`20movl`20`20`20`20r1,r11 X`20`20`20`20`20`20`20`20cmpl`20`20`20`20r7,#1`20`20`20`20`20`20`20`20`20`20`20 V;bashing`20the`20target`20UCB? X`20`20`20`20`20`20`20`20bneq`20`20`20`2031$ X`20`20`20`20`20`20`20`20jsb`20`20`20`20`20mung`20`20`20`20`20`20`20`20`20`20 V`20`20;go`20mung`20target... X`20`20`20`20`20`20`20`20brb`20`20`20`20`2032$ X31$:`20`20`20`20jsb`20`20`20`20`20umung`20`20`20`20`20`20`20`20`20`20`20;unmun Vg`20target X32$: X;`20`20`20`20`20`20`20bisw`20`20`20`20#ucb$m_valid,ucb$w_sts(r5)`20`20`20`20 V`20`20;set`20volume`20valid X;`20`20`20`20`20`20`20bisw`20`20`20`20#ucb$m_online,ucb$w_sts(r5)`20`20`20`20 V`20;set`20unit`20online X;`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_irp(r5),r3`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;restore`20r3,`20neatness`20counts X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20movzwl`20`20#ss$_normal,r0`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;success X`20`20`20`20`20`20`20`20jmp`20`20`20`20`20g`5Eexe$finishioc`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20;wrap`20things`20up. Xmung: X;`20steal`20DDT`20from`20host.`20Assumes`20that`20the`20intercept`20UCB`20addr Vess X;`20is`20in`20R5`20(that`20is,`20the`20UCB`20in`20which`20we`20will`20place`20 Vthe`20DDT`20copy), X;`20and`20that`20the`20UCB`20of`20the`20device`20whose`20DDT`20we`20are`20stea Vling`20is X;`20pointed`20to`20by`20R11.`20All`20registers`20are`20preserved`20explicitly V`20so`20that X;`20surrounding`20code`20cannot`20be`20clobbered.`20R0`20is`20returned`20as`20 Va`20status X;`20code`20so`20that`20if`20it`20returns`20with`20low`20bit`20clear,`20it`20me Vans`20something X;`20went`20wrong`20so`20the`20bash`20did`20NOT`20occur.`20This`20generally`20m Veans`20some`20other X;`20code`20that`20does`20not`20follow`20this`20standard`20has`20grabbed`20the V`20DDT`20already. X;`20The`20following`20example`20assumes`20the`20code`20lives`20in`20a`20driver V`20so`20the X;`20unique`20ID`20field`20and`20magic`20number`20are`20set`20already. X X`20`20`20`20`20`20`20`20pushr`20`20`20#`5Em X;`20Acquire`20victim's`20fork`20lock`20to`20synchronize`20all`20this. X`20`20`20`20`20`20`20`20movl`20`20`20`20#ss$_normal,r0`20`20`20`20`20`20`20`20 V`20`20;assume`20success X`20`20`20`20`20`20`20`20forklock`20ucb$b_flck(r11),- X`20`20`20`20`20`20`20`20savipl=-(sp),preserve=YES X;`20find`20the`20current`20DDT`20address`20from`20the`20UCB`20(leaving`20the V`20copy`20in X;`20the`20DDB`20alone) X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_ddt(r11),r10`20`20`20`20`20`20;p Voint`20at`20victim's`20DDB X;`20see`20if`20this`20DDT`20is`20the`20same`20as`20the`20original X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_ddb(r11),r9`20`20`20`20`20`20`20 V;the`20ddb$l_ddt`20is`20the`20original X`20`20`20`20`20`20`20`20cmpl`20`20`20`20ddb$l_ddt(r9),r10`20`20`20`20`20`20`20 V;bashing`20driver`20the`20first`20time? X`20`20`20`20`20`20`20`20beql`20`20`20`201$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20eql`20yes X;`20driver`20was`20bashed`20already.`20Check`20that`20the`20current`20basher V`20followed`20the X;`20standard.`20Then`20continue`20if`20it`20looks`20OK. X`20`20`20`20`20`20`20`20cmpl`20`20`20`20(r10),#p.ma Vgic 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;does`20the`20magic`20pattern`20exis Vt? X;`20if`20magic`20pattern`20is`20missing`20things`20are`20badly`20messed. X`20`20`20`20`20`20`20`20beql`20`20`20`202$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20eql`20looks`20like`20all's`20well X`20`20`20`20`20`20`20`20movl`20`20`20`20#2,r0`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;say`20things`20failed X`20`20`20`20`20`20`20`20brw`20`20`20`20`20100$`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;(brb`20might`20work`20too) X2$: X;`20set`20our`20new`20ddt`20address`20in`20the`20previous`20interceptor's`20sl Vot X`20`20`20`20`20`20`20`20movab`20`20`20ucb$a_vicddt(r5),(r10) 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;store`20next-DDT`20address`20relati Vve 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;to`20the`20original`20victim`20one V X1$: X`20`20`20`20`20`20`20`20movl`20`20`20`20r10,ucb$l_prevddt(r5)`20`20`20;set`20p Vrevious`20DDT`20address`20up X`20`20`20`20`20`20`20`20clrl`20`20`20`20ucb$l_intcddt(r5)`20`20`20`20`20`20`20 V;clear`20intercepting`20DDT`20initially X3$: X`20`20`20`20`20`20`20`20pushl`20`20`20r5 X;`20copy`20a`20little`20extra`20for`20good`20luck... X`20`20`20`20`20`20`20`20movc3`20`20`20#,(r10),ucb$a_vicddt(r5 V)`20`20`20`20;copy`20the`20DDT X`20`20`20`20`20`20`20`20popl`20`20`20`20r5`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;get`20UCB`20pointer`20back`20(movc3`20bashes`20 Vit) X; X;`20Here`20make`20whatever`20mods`20to`20the`20DDT`20you`20need`20to. X; X;`20FOR`20EXAMPLE`20make`20the`20following`20mods`20to`20the`20FDT`20pointer X;`20(These`20assume`20the`20standard`20proposed`20for`20FDT`20pointers) X`20`20`20`20`20`20`20`20movab`20`20`20ucb$a_vicddt(r5),r8`20`20`20`20`20;get V`20a`20base`20register`20for`20the`20DDT X`20`20`20`20`20`20`20`20movl`20`20`20`20r5,QD_functable+fdt_prev`20`20`20`20;s Vave`20old`20FDT`20ucb`20address X`20`20`20`20`20`20`20`20movl`20`20`20`20ddt$l_fdt(r10),ucb$l_oldfdt(r5) X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_uniqid(r5),QD_functable+fdt_idnt V`20;save`20unique`20ID`20also X`20`20`20`20`20`20`20`20movab`20`20`20QD_functable,ddt$l_fdt(r8)`20;point`20at V`20our`20FDT`20table X`20`20`20`20`20`20`20`20clrl`20`20`20`20myonoff`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;turn`20my`20FDTs`20on X; X;`20Finally`20clobber`20the`20victim`20device's`20DDT`20pointer`20to`20point V`20to`20our`20new X;`20one. X`20`20`20`20`20`20`20`20movab`20`20`20ucb$a_vicddt(r5),ucb$l_ddt(r11) X;`20Now`20the`20DDT`20used`20for`20the`20victim`20device`20unit`20is`20that`20 Vof`20our`20UCB X;`20and`20will`20invoke`20whatever`20special`20processing`20we`20need.`20This V`20processing`20in X;`20the`20example`20here`20causes`20the`20intercept`20driver's`20FDT`20routine Vs`20to`20be X;`20used`20ahead`20of`20whatever`20was`20in`20the`20original`20driver's`20FDTs V.`20Because X;`20the`20DDT`20is`20modified`20using`20the`20UCB`20pointer`20only,`20target V`20device`20units X;`20that`20have`20not`20been`20patched`20in`20this`20way`20continue`20to`20use V`20their`20old X;`20DDTs`20and`20FDTs`20unaltered. X; X;`20Processing`20complete;`20release`20victim's`20fork`20lock X100$: X`20`20`20`20`20`20`20`20forkunlock`20lock=ucb$b_flck(r11),newipl=(sp)+,- X`20`20`20`20`20`20`20`20`20preserve=YES X`20`20`20`20`20`20`20`20popr`20`20`20`20#`5Em X`20`20`20`20`20`20`20`20rsb Xumung: X; X;`20Entry:`20R11`20points`20at`20victim`20device`20UCB`20and`20current`20drive Vr`20is`20the`20one X;`20desiring`20to`20remove`20its`20entry`20from`20the`20DDT`20chain.`20Thus`20 Vits`20xx$dpt:`20address X;`20is`20the`20one`20being`20sought.`20("Current`20driver"`20here`20means`20th Ve`20intercept X;`20driver.) X;`20`20`20It`20is`20assumed`20that`20the`20driver`20knows`20that`20the`20DDT V`20chain`20was`20patched X;`20so`20that`20its`20UCB`20contains`20an`20entry`20in`20the`20DDT`20chain X`20`20`20`20`20`20`20`20pushr`20`20`20#`5Em X`20`20`20`20`20`20`20`20movl`20`20`20`20r11,r5`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;hereafter`20use`20r5`20as`20victim's`20UCB X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_ddt(r5),r10`20`20`20`20`20`20`20 V;get`20the`20DDT`20we`20currently`20have X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_ddb(r5),r1`20`20`20`20`20`20`20 V`20;get`20ddb`20of`20victim X`20`20`20`20`20`20`20`20movl`20`20`20`20ddb$l_ddt(r1),r1`20`20`20`20`20`20`20 V`20;and`20real`20original`20DDT X`20`20`20`20`20`20`20`20movl`20`20`20`20r10,r0`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;save`20ucb$l_ddt`20addr`20for`20later X`20`20`20`20`20`20`20`20movab`20`20`20DPT$TAB,r11`20`20`20`20`20`20`20`20`20 V`20`20`20`20;magic`20pattern`20is`20DPT`20addr. X;`20lock`20this`20section`20with`20forklock`20so`20we`20can`20safely`20remove V X;`20entries`20at`20fork`20also.`20Use`20victim`20device`20forklock. X`20`20`20`20`20`20`20`20forklock`20lock=ucb$b_flck(r5),savipl=-(sp),preserve=Y VES X2$:`20`20`20`20`20cmpl`20`20`20`20(r10),R11 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;this`20our`20own`20driver? X`20`20`20`20`20`20`20`20beql`20`20`20`201$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20eql`20yes,`20end`20search X`20`20`20`20`20`20`20`20.if`20`20`20`20`20df,chk.err X`20`20`20`20`20`20`20`20cmpl`20`20`20`20(r10),#p.ma Vgic X`20`20`20`20`20`20`20`20bneqw`20`20`20`204$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;exit`20if`20this`20is`20nonstd`20bash X`20`20`20`20`20`20`20`20.endc`20`20`20;chk.err X;`20follow`20DDT`20block`20chain`20to`20next`20saved`20DDT. X`20`20`20`20`20`20`20`20movl`20`20`20`20(r10),r10 V 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;point`20R10`20at`20the`20next`20DDT V`20in`20the 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;chain X`20`20`20`20`20`20`20`20.if`20`20`20`20`20df,chk.err X`20`20`20`20`20`20`20`20bgeqw`20`20`204$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;`20(error`20check`20if`20not`20negative) X`20`20`20`20`20`20`20`20.endc`20`20`20;chk.err X`20`20`20`20`20`20`20`20brb`20`20`20`20`202$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20;then`20check`20again X1$: X;`20At`20this`20point`20R10`20contains`20the`20DDT`20address`20within`20the`20 Vintercept X;`20driver's`20UCB.`20Return`20the`20address`20of`20the`20intercept`20driver's V`20UCB`20next. X`20`20`20`20`20`20`20`20tstl`20`20`20`20(r10)`20 V`20`20`20`20`20`20;were`20we`20intercepted? X`20`20`20`20`20`20`20`20bgeq`20`20`20`203$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20geq`20no,`20skip`20back-fixup X;`20we`20were`20intercepted.`20Fix`20up`20next`20guy`20in`20line. X`20`20`20`20`20`20`20`20movl`20`20`20`20(r10),r11 V`20`20;point`20at`20interceptor X`20`20`20`20`20`20`20`20movl`20`20`20`20 X(r10),(r11) X3$: X;`20if`20we`20intercepted`20someone,`20fix`20up`20our`20intercepted`20victim V`20to`20skip`20by X;`20us`20also. X`20`20`20`20`20`20`20`20movl`20`20`20`20(r10),r2 V`20`20`20`20;did`20we`20intercept 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;original`20driver? X`20`20`20`20`20`20`20`20cmpl`20`20`20`20r2,r1`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;test`20if`20this`20is`20original X`20`20`20`20`20`20`20`20beql`20`20`20`205$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20eql`20yes,`20no`20bash X;`20replace`20previous`20intercept`20address`20by`20ours`20(which`20might`20be V`20zero) X`20`20`20`20`20`20`20`20movl`20`20`20`20 X(r10),(r2) X5$: X;`20Here`20remove`20FDT`20entries`20from`20the`20list`20if`20they`20were`20mod Vified. X;`20This`20needs`20a`20scan`20of`20the`20FDT`20chain`20starting`20at`20the`20v Victim's X;`20ddt$l_fdt`20pointer`20and`20skipping`20around`20any`20entry`20that`20has V`20address X;`20QD_functable: X;`20`20The`20FDT`20chain`20is`20singly`20linked.`20The`20code`20here`20assumes V`20everybody X;`20plays`20by`20the`20same`20rules! X;`20NOTE:`20Omit`20this`20code`20if`20we`20didn't`20insert`20our`20FDT`20code V`20in`20the`20chain!!! X`20`20`20`20`20`20`20`20movl`20`20`20`20ddt$l_fdt(r0),r1`20`20`20`20`20`20`20 V`20;start`20of`20FDT`20chain X`20`20`20`20`20`20`20`20movab`20`20`20QD_functable,r2`20`20`20`20`20`20`20`20 V`20;address`20of`20our`20FDT`20table X`20`20`20`20`20`20`20`20clrl`20`20`20`20r3 X`20`20`20`20`20`20`20`20movab`20`20`20<0-ucb$a_vicddt>(r10),r4`20;initially`20 Vpoint`20at`20our`20ucb X6$:`20`20`20`20`20cmpl`20`20`20`20r1,r2`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;current`20fdt`20point`20at`20us? X`20`20`20`20`20`20`20`20beql`20`20`20`207$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20eql`20yes,`20fix`20up`20chain X`20`20`20`20`20`20`20`20movl`20`20`20`20r1,r3`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;else`20store`20last`20pointer X`20`20`20`20`20`20`20`20movl`20`20`20`20fdt_prev(r1),r4`20`20`20`20`20`20`20 V`20`20;and`20point`20at`20next X`20`20`20`20`20`20`20`20bgeq`20`20`20`208$ X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_oldfdt(r4),r1`20`20`20`20`20;whe Vre`20last`20FDT`20pointer`20is`20in`20the`20ucb X;;;BUT`20not`20all`20UCBs`20will`20have`20the`20fdt`20offset`20at`20the`20same V`20place!!! X;;;HOWEVER`20we`20will`20leave`20this`20in,`20putting`20the`20oldfdt`20field V`20first`20after X;;;the`20regular`20UCB`20things. X`20`20`20`20`20`20`20`20bgeq`20`20`20`208$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20not`20sys`20addr,`20no`20messin' X`20`20`20`20`20`20`20`20brb`20`20`20`20`206$`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20;look`20till`20we`20find`20one. X7$: X;r3`20is`200`20or`20fdt`20pointing`20to`20our`20block`20next X;r1`20points`20at`20our`20fdt`20block X`20`20`20`20`20`20`20`20tstl`20`20`20`20r3`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20r3=0`20nobody`20points`20at`20us X`20`20`20`20`20`20`20`20bgeq`20`20`20`208$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;so`20nothing`20to`20do X`20`20`20`20`20`20`20`20movl`20`20`20`20fdt_prev(r1),r4 X`20`20`20`20`20`20`20`20bgeq`20`20`20`2017$ X`20`20`20`20`20`20`20`20movl`20`20`20`20ucb$l_oldfdt(r4),-(sp)`20`20;save`20ol Vd`20fdt`20loc X`20`20`20`20`20`20`20`20movl`20`20`20`20fdt_prev(r3),r4 X`20`20`20`20`20`20`20`20blss`20`20`20`2018$ X`20`20`20`20`20`20`20`20tstl`20`20`20`20(sp)+ X`20`20`20`20`20`20`20`20brb`20`20`20`20`2017$ X18$:`20`20`20`20movl`20`20`20`20(sp)+,ucb$l_oldfdt(r4) X17$:`20`20`20`20movl`20`20`20`20fdt_prev(r1),fdt_prev(r3)`20`20;else`20point V`20our`20next-fdt`20pointer`20at 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;last`20fdt`20addr. X8$: X; X;`20Finally`20if`20the`20victim`20UCB`20DDT`20entry`20points`20at`20ours,`20ma Vke`20it`20point`20at X;`20our`20predecessor.`20If`20it`20points`20at`20a`20successor,`20we`20can`20l Veave`20it`20alone. X`20`20`20`20`20`20`20`20cmpl`20`20`20`20r10,r0`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;does`20victim`20ucb`20point`20at`20our`20DDT? X`20`20`20`20`20`20`20`20bneq`20`20`20`204$`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;if`20not`20cannot`20replace`20it X`20`20`20`20`20`20`20`20movl`20`20`20`20(r10),ucb$ Vl_ddt(r5) X4$: X`20`20`20`20`20`20`20`20forkunlock`20lock=ucb$b_flck(r5),newipl=(sp)+,preserve V=YES X`20`20`20`20`20`20`20popr`20`20`20`20#`5Em 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;copy`20our`20prior`20DDT`20ptr`20to V`20next`20one X`20`20`20`20`20`20`20`20rsb X X`20`20`20`20`20`20`20`20.SBTTL`20`20CONTROLLER`20INITIALIZATION`20ROUTINE X;`20++ X;`20 X;`20QD_ctrl_INIT`20-`20CONTROLLER`20INITIALIZATION`20ROUTINE X;`20 X;`20FUNCTIONAL`20DESCRIPTION: X;`20noop X;`20INPUTS: X;`20R4`20-`20CSR`20ADDRESS X;`20R5`20-`20IDB`20ADDRESS X;`20R6`20-`20DDB`20ADDRESS X;`20R8`20-`20CRB`20ADDRESS X;`20 X;`20`20`20`20`20`20`20THE`20OPERATING`20SYSTEM`20CALLS`20THIS`20ROUTINE: X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20AT`20SYSTEM`20STARTUP X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20DURING`20DRIVER`20LOADING X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20DURING`20RECOVERY`20FROM`20P VOWER`20FAILURE X;`20`20`20`20`20`20`20THE`20DRIVER`20CALLS`20THIS`20ROUTINE`20TO`20INIT`20AFTE VR`20AN`20NXM`20ERROR. X;-- X XQD_ctrl_INIT:`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;QD`20CONTROLLER`20INITIALIZATION X`20`20`20`20`20`20`20`20CLRL`20`20`20`20CRB$L_AUXSTRUC(R8)`20`20`20`20`20`20; V`20SAY`20NO`20AUX`20MEM X`20`20`20`20`20`20`20`20RSB`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;RETURN X`20`20`20`20`20`20`20`20.SBTTL`20`20INTERNAL`20CONTROLLER`20RE-INITIALIZATION V X; X;`20INPUTS: X;`20`20`20`20`20`20`20R4`20=>`20controller`20CSR`20(dummy) X;`20`20`20`20`20`20`20R5`20=>`20UCB X; Xctrl_REINIT: X`20`20`20`20`20`20`20`20RSB`20`20`20`20`20`20`20`20`20`20`20`20`20;`20RETURN V`20TO`20CALLER X`20`20`20`20`20`20`20`20.SBTTL`20`20UNIT`20INITIALIZATION`20ROUTINE X;++ X;`20 X;`20QD_unit_INIT`20-`20UNIT`20INITIALIZATION`20ROUTINE X;`20 X;`20FUNCTIONAL`20DESCRIPTION: X;`20 X;`20`20`20`20`20`20`20THIS`20ROUTINE`20SETS`20THE`20QD:`20ONLINE. X;`20 X;`20`20`20`20`20`20`20THE`20OPERATING`20SYSTEM`20CALLS`20THIS`20ROUTINE: X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20AT`20SYSTEM`20STARTUP X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20DURING`20DRIVER`20LOADING X;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20DURING`20RECOVERY`20FROM`20P VOWER`20FAILURE X;`20 X;`20INPUTS: X;`20 X;`20`20`20`20`20`20`20R4`20`20`20`20`20`20-`20CSR`20ADDRESS`20(CONTROLLER`20ST VATUS`20REGISTER) X;`20`20`20`20`20`20`20R5`20`20`20`20`20`20-`20UCB`20ADDRESS`20(UNIT`20CONTROL V`20BLOCK) X;`20`20`20`20`20`20`20R8`20`20`20`20`20`20-`20CRB`20ADDRESS X;`20 X;`20OUTPUTS: X;`20 X;`20`20`20`20`20`20`20THE`20UNIT`20IS`20SET`20ONLINE. X;`20`20`20`20`20`20`20ALL`20GENERAL`20REGISTERS`20(R0-R15)`20ARE`20PRESERVED. V X;`20 X;-- X XQD_unit_INIT:`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;QD`20UNIT`20INITIALIZATION X;`20Don't`20set`20unit`20online`20here.`20Priv'd`20task`20that`20assigns`20QD V`20unit X;`20to`20a`20file`20does`20this`20to`20ensure`20only`20assigned`20QDn:`20get V`20used. X;`20`20`20`20`20`20`20BISW`20`20`20`20#UCB$M_ONLINE,UCB$W_STS(R5)`20`20;SET`20 VUCB`20STATUS`20ONLINE X;limit`20size`20of`20QD:`20data`20buffers XQD_bufsiz=8192 X`20`20`20`20`20`20`20`20movl`20`20`20`20#QD_bufsiz,ucb$l_maxbcnt(r5)`20`20`20 V`20;limit`20transfers`20to`208k X`20`20`20`20`20`20`20`20MOVB`20`20`20`20#DC$_DISK,UCB$B_DEVCLASS(R5)`20;SET`20 VDISK`20DEVICE`20CLASS X X;`20NOTE:`20we`20may`20want`20to`20set`20this`20as`20something`20other`20than V`20an`20RX`20class X;`20disk`20if`20MSCP`20is`20to`20use`20it.`20MSCP`20explicitly`20will`20NOT`20 Vserve`20an X;`20RX`20type`20device.`20For`20now`20leave`20it`20in,`20but`20others`20can`20 Valter. X;`20(There's`20no`20GOOD`20reason`20to`20disable`20MSCP,`20but`20care!!!) X`20`20`20`20`20`20`20`20movl`20`20`20`20#`5EXb22b4001,ucb$l_media_id(r5)`20`20 V;`20set`20media`20id`20as`20QD X;`20(note`20the`20id`20might`20be`20wrong`20but`20is`20attempt`20to`20get`20it V.)`20(used`20only`20for X;`20MSCP`20serving.) X`20`20`20`20`20`20`20`20MOVB`20`20`20`20#DT$_FD1,UCB$B_DEVTYPE(R5)`20`20;Make V`20it`20foreign`20disk`20type`201 X;`20(dt$_rp06`20works`20but`20may`20confuse`20analyze/disk) X;`20MSCP`20may`20still`20refuse`20to`20do`20a`20foreign`20drive`20too;`20jigge Vry-pokery`20later X;`20to`20test`20if`20there's`20occasion`20to`20do`20so. X;`20Set`20up`20crc`20polynomial X`20`20`20`20`20`20`20`20clrl`20`20`20`20chnflg`20`20`20`20`20`20`20`20`20`20;i Vnitially`20set`20to`20use`20our`20chain`20of`20FDTs X`20`20`20`20`20`20`20`20RSB`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;RETURN`20 X X`20`20`20`20`20`20`20`20.SBTTL`20`20Other`20FDT`20ROUTINES`20 X;++ X;`20 X;`20QD_ALIGN`20-`20FDT`20ROUTINE`20TO`20TEST`20XFER`20BYTE`20COUNT X;`20 X;`20FUNCTIONAL`20DESCRIPTION: X;`20 X;`20`20`20`20`20`20`20THIS`20ROUTINE`20IS`20CALLED`20FROM`20THE`20FUNCTION`20D VECISION`20TABLE`20DISPATCHER X;`20`20`20`20`20`20`20TO`20CHECK`20THE`20BYTE`20COUNT`20PARAMETER`20SPECIFIED V`20BY`20THE`20USER`20PROCESS X;`20`20`20`20`20`20`20FOR`20AN`20EVEN`20NUMBER`20OF`20BYTES`20(WORD`20BOUNDARY V). X;`20 X;`20INPUTS: X;`20 X;`20`20`20`20`20`20`20R3`20`20`20`20`20`20-`20IRP`20ADDRESS`20(I/O`20REQUEST V`20PACKET) X;`20`20`20`20`20`20`20R4`20`20`20`20`20`20-`20PCB`20ADDRESS`20(PROCESS`20CONTR VOL`20BLOCK) X;`20`20`20`20`20`20`20R5`20`20`20`20`20`20-`20UCB`20ADDRESS`20(UNIT`20CONTROL V`20BLOCK) X;`20`20`20`20`20`20`20R6`20`20`20`20`20`20-`20CCB`20ADDRESS`20(CHANNEL`20CONTR VOL`20BLOCK) X;`20`20`20`20`20`20`20R7`20`20`20`20`20`20-`20BIT`20NUMBER`20OF`20THE`20I/O`20 VFUNCTION`20CODE X;`20`20`20`20`20`20`20R8`20`20`20`20`20`20-`20ADDRESS`20OF`20FDT`20TABLE`20ENT VRY`20FOR`20THIS`20ROUTINE X;`20`20`20`20`20`20`204(AP)`20`20`20-`20ADDRESS`20OF`20FIRST`20FUNCTION`20DEPE VNDENT`20QIO`20PARAMETER X;`20 X;`20OUTPUTS: X;`20 X;`20`20`20`20`20`20`20IF`20THE`20QIO`20BYTE`20COUNT`20PARAMETER`20IS`20ODD,`20 VTHE`20I/O`20OPERATION`20IS X;`20`20`20`20`20`20`20TERMINATED`20WITH`20AN`20ERROR.`20IF`20IT`20IS`20EVEN, V`20CONTROL`20IS`20RETURNED X;`20`20`20`20`20`20`20TO`20THE`20FDT`20DISPATCHER. X;`20 X;-- Xnolchk=0 XQD_ALIGN:`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;CHECK`20BYTE`20COUNT`20AT`20P1(AP) X`20`20`20`20`20`20`20`20RSB`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;EVEN`20-`20RETURN`20TO`20CALLER X X`20`20`20`20`20`20`20`20.SBTTL`20`20START`20I/O`20ROUTINE X;++ X;`20 X;`20QD_STARTIO`20-`20START`20I/O`20ROUTINE X;`20 X;`20FUNCTIONAL`20DESCRIPTION: X;`20 X;`20`20`20`20`20`20`20THIS`20FORK`20PROCESS`20IS`20ENTERED`20FROM`20THE`20EXEC VUTIVE`20AFTER`20AN`20I/O`20REQUEST X;`20`20`20`20`20`20`20PACKET`20HAS`20BEEN`20DEQUEUED. X;`20 X;`20INPUTS: X;`20 X;`20`20`20`20`20`20`20R3`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20IRP`20AD VDRESS`20(I/O`20REQUEST`20PACKET) X;`20`20`20`20`20`20`20R5`20`20`20`20`20`20`20`20`20`20`20`20`20`20-`20UCB`20AD VDRESS`20(UNIT`20CONTROL`20BLOCK) X;`20`20`20`20`20`20`20IRP$L_MEDIA`20`20`20`20`20-`20PARAMETER`20LONGWORD`20(LO VGICAL`20BLOCK`20NUMBER) X;`20 X;`20OUTPUTS: X;`20 X;`20`20`20`20`20`20`20R0`20`20`20`20`20`20-`20FIRST`20I/O`20STATUS`20LONGWORD: V`20STATUS`20CODE`20`26`20BYTES`20XFERED X;`20`20`20`20`20`20`20R1`20`20`20`20`20`20-`20SECOND`20I/O`20STATUS`20LONGWORD V:`200`20FOR`20DISKS X;`20 X;`20`20`20`20`20`20`20THE`20I/O`20FUNCTION`20IS`20EXECUTED. X;`20 X;`20`20`20`20`20`20`20ALL`20REGISTERS`20EXCEPT`20R0-R4`20ARE`20PRESERVED. X;`20 X;-- XQD_STARTIO:`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;START`20I/O`20OPERATION X;`20 X;`20`20`20`20`20`20`20PREPROCESS`20UCB`20FIELDS X;`20 X;`20`20`20`20`20`20`20ASSUME`20`20RY_EXTENDED_STATUS_LENGTH`20`20EQ`20`208 X;`20`20`20`20`20`20`20CLRQ`20`20`20`20UCB$Q_QD_EXTENDED_STATUS(R5)`20`20`20`20 V;`20Zero`20READ`20ERROR`20REGISTER`20area. X;`20 X;`20`20`20`20`20`20`20BRANCH`20TO`20FUNCTION`20EXECUTION X`20`20`20`20`20`20`20`20bbs`20`20`20`20`20#ucb$v_online,-`20;`20if`20online`20 Vset`20software`20valid X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ucb$w_sts(r5),210$ X216$:`20`20`20movzwl`20`20#ss$_volinv,r0`20`20;`20else`20set`20volume`20invali Vd X`20`20`20`20`20`20`20`20brw`20`20`20`20`20resetxfr`20`20`20`20`20`20`20`20;`20 Vreset`20byte`20count`20`26`20exit X210$: X;`20Unless`20we`20use`20this`20entry,`20we`20want`20to`20junk`20any`20calls`20 Vhere. X`20`20`20`20`20`20`20`20brb`20`20`20`20`20216$`20`20`20`20`20`20`20`20`20`20 V`20`20;just`20always`20say`20invalid`20volume. X X;`20Get`20here`20for`20other`20start-io`20entries`20if`20the`20virtual`20disk V`20code`20is X;`20commented`20out`20also,`20as`20it`20must`20be. XFATALERR:`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;UNRECOVERABLE`20ERROR X`20`20`20`20`20`20`20`20MOVZWL`20`20#SS$_DRVERR,R0`20`20`20`20`20`20`20`20`20 V`20;ASSUME`20DRIVE`20ERROR`20STATUS X XRESETXFR:`20`20`20`20`20`20`20;`20dummy`20entry`20...`20should`20never`20reall Vy`20get`20here X`20`20`20`20`20`20`20`20MOVL`20`20`20`20UCB$L_IRP(R5),R3`20`20`20`20`20`20`20 V`20;GET`20I/O`20PKT X`20`20`20`20`20`20`20`20MNEGW`20`20`20IRP$W_BCNT(R3),UCB$W_BCR(R5)`20;`20RESET V`20BYTECOUNT X;`20`20`20`20`20`20`20BRW`20`20`20`20`20FUNCXT XFUNCXT:`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;FUNCTION`20EXIT X`20`20`20`20`20`20`20`20CLRL`20`20`20`20R1`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20;CLEAR`202ND`20LONGWORD`20OF`20IOSB X`20`20`20`20`20`20`20`20REQCOM`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;`20COMPLETE`20REQUEST X;`20 XPWRFAIL:`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;POWER`20FAILURE X`20`20`20`20`20`20`20`20BICW`20`20`20`20#UCB$M_POWER,UCB$W_STS(R5)`20`20;CLEAR V`20POWER`20FAILURE`20BIT X`20`20`20`20`20`20`20`20MOVL`20`20`20`20UCB$L_IRP(R5),R3`20`20`20`20`20`20`20 V`20;GET`20ADDRESS`20OF`20I/O`20PACKET X`20`20`20`20`20`20`20`20MOVQ`20`20`20`20IRP$L_SVAPTE(R3),-`20`20`20`20`20`20;R VESTORE`20TRANSFER`20PARAMETERS X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20UCB$L_SVAPTE(R5)`20`20`20`20 V`20`20`20`20;... X`20`20`20`20`20`20`20`20BRW`20`20`20`20`20QD_STARTIO`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20;START`20REQUEST`20OVER XQD_INT:: XQD_UNSOLNT:: X`20`20`20`20`20`20`20`20POPR`20`20`20`20#`5EM X`20`20`20`20`20`20`20`20REI`20`20`20`20`20;DUMMY`20RETURN`20FROM`20ANY`20INTER VRUPT X`20`20`20`20`20`20`20`20;; X XQD_END:`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;ADDRESS`20OF`20LAST`20LOCATION`20IN`20DRIVER X`20`20`20`20`20`20`20`20.END X $ call unpack QRDRVR.DSJ;1 1348825312 "" 90 1 1 $ v=f$verify(v) $ exit