.TITLE LAZRUS ; ; THIS PROGRAM IS A MODIFIED VERSION OF MIKE HIGGINS "UICREC" ; PROGRAM. LIKE "UICREC" IT IS BEING WRITTEN IN GREAT HASTE ; SO PLEASE FORGIVE THE LACK OF DOCUMENTATION. ; ; THIS PROGRAM IS INTENDED TO RESURRECT FILES THAT WERE ACCIDENTALLY ; DELETED (VIA PIP *.*;*/DE) FROM THE DEAD. ; ; WE WILL REFER TO THE VOLUME ON WHICH THE PIP *.*;*/DE WAS ; DONE AS THE "DEAD" VOLUME. THE "GOOD" VOLUME IS ; ANY NORMAL FILES-11 DISK WHICH HAS ENOUGH SCRATCH SPACE ; TO HOLD AT LEAST THE RESURRECTED FILES FOR ONE UIC. ; ; THIS PROGRAM WILL SCAN A "DEAD" VOLUME FOR ALL FILES ; IN A GIVEN UIC THAT HAVE BEEN DELETED. IT WILL COPY EACH ; FILE TO THE SAME UIC ON THE "GOOD" VOLUME. IT ONLY DOES ; ONE UIC AT A TIME, AND THE UIC IT WORKS ON IS ; THE SET /UIC THAT IS IN EFFECT WHEN THE PROGRAM IS RUN. ; ; ; NOTE: THIS PROGRAM DOES NOT ATTEMPT TO CORRECT THE BIT MAP ; AND ALL THAT JAZZ ON THE "DEAD" VOLUME. IN FACT ; IT DOES NOT WRITE ON THE "DEAD" VOLUME AT ALL. THUS ; THERE IS NO NEED TO MAKE AN EMERGENCY COPY OF THE ; "DEAD" VOLUME. WHEN RUNNING THE "LAZRUS" PROGRAM ; YOU MAY WRITE PROTECT THE "DEAD" VOLUME. ; ; ; A TYPICAL SENIARO IS AS FOLLOWS: ; YOU HAVE A DUAL RK05 SYSTEM. YOUR SYSTEM DISK IS DK0: AND YOU ; HAVE YOUR APPLICATION SOFTWARE ON DK1:. ; YOU (YES YOU BIG DUMMY) DELETED THE FILES ON DK1:[50,50] ; WITH THE COMMAND PIP *.*;*/DE. ; SO NOW YOU WANT TO GET THEM BACK. ; THE FILES IN DK1:[50,50] TOTALED 349. BLOCKS, YOU DO ; A PIP DK0:/FR AND FIND THAT YOU HAVE 518. BLOCKS FREE. ; ; ; FIRST PUT LAZRUS ON YOUR SYSTEM DISK IN UIC [307,22] (IT DOESN'T REALLY ; MATTER WHERE). ; MOU DK1:GOLD MOUNT THE "DEAD" VOLUME (YOU CAN SET THE WRITE PROTECT ; SWITCH, BUT I PROMISE I WON'T WRITE ON IT.) ; ASN DK1:=DD: ASSIGN THE DEAD VOLUME TO THE DEVICE DD:. ; ; SET /UIC=[50,50] SET THE UIC TO THE UIC YOU WANT TO RESURRECT. ; ASN DK0:=GD: ASSIGN THE GOOD VOLUME TO THE DEVICE GD: ; UFD GD:[50,50] MAKE SURE THE UFD ON THE GOOD VOLUME EXIST TO HOLD THE ; FILES THAT WILL BE RESURRECTED. ; RUN SY:[307,22]LAZRUS RUN THE PROGRAM ; ; NOW THE RESURRECTED PROGRAMS WILL BE ON THE "GOOD" VOLUME UNDER THE ; SAME UIC. ; ; ; SOME LIMITATIONS: ; ; SINCE LAZRUS SCANS ALL OF THE BLOCKS ON A DISK VOLUME, IT ; MAY RESURRECT A PROGRAM THAT HAS BEEN DELETED A LONG TIME ; AGO. THIS PROGRAM COULD HAVE THE SAME NAME AND VERSION NUMBER AS ONE ; THAT WAS DELETED A SHORT TIME AGO. IT IS POSSIBLE THAT LAZRUS ; WILL RESURRECT BOTH VERSIONS. THE USER MUST DECIDE WHICH ; VERSION IS THE CURRENT ONE. AS OF RIGHT NOW LAZRUS WILL NOT RESTORE ; THE CREATATION DATE OF THE RESURRECTED FILE. ; ; ; ; A DELETED FILE HEADER IS IDENTIFIED AS FOLLOWS ; ; WD 0 - 27027 (IN OCTAL) THIS IS A STATIC OFFSET IN THE FILE HEADER ; WD 1 - ZERO, THE FILE FILE ID NUMBER OF A DELETED FILE IS ZERO ; WD 10 - THE UIC ; WD 377 - ZERO, THE CHECKSUM OF A DELETED FILE IS ZERO ; ; PHILIP H. CANNON ; SCIENCE APPLICATIONS, INC. ; 1211 W 22ND STREET ; OAK BROOK, IL. 60521 ; ; (312) 655-5960 ; NBLK=30. .MCALL QIOW$S,QIOW$,GTSK$C,DIR$,ALUN$C,FHDOF$ .MCALL EXIT$S,QIOW$C FHDOF$ DEF$L ; ; LAZRUS::GTSK$C TBUF ;GET THE TASK PARAMETRS (TO GET THE UIC) ALUN$C 1,DD,0 HDLUP: DIR$ #RDBLK ;READ A BUNCH OF BLOCKS TSTB IOSTAT ;TEST FOR ERROR IN ANY OF THEM BMI SMALL ;GO DO THEM ONE AT A TIME IF ERROR MOV #HEADER,R5 ;R5 POINTS TO THE NEXT HEADER IN CORE MOV BBHI,HDRHI MOV BBLO,NXTHDR ALLH: CALL REST ;CALL THE REST OF THE PROGRAM FOR EACH HEADER ADD #512.,R5 ;SKIP TO THE NEXT HEADER ADD #1,NXTHDR ADC HDRHI CMP R5,#ENDH ;TEST FOR DONE BLT ALLH ;GO DO THE NEXT ONE NEXTB: ADD #NBLK,BBLO ;INCRIMENT TO THE NEXT BLOCK OF HEADERS ADC BBHI BR HDLUP ;GO RECOVER ALL OF THEM ;CONTROL BRANCHES HERE IF THERE IS AN ERROR IN THE ;BIG READ ABOVE. SMALL: MOV #NBLK,R4 ;LOOP FOR ALL BLOCKS REQUESTED MOV BBHI,HDRHI ;INITALIZE TO THE START OF THE BIG READ MOV BBLO,NXTHDR MOV #HEADER,R5 SLUP: MOV R4,-(SP) ;SAVE LOOP COUNTER DIR$ #RDHDR ;READ ONE BLOCK TSTB IOSTAT ;IS THIS THE BAD BLOCK? BGT NOPE CMPB IOSTAT,#IE.BLK ;ARE THERE NO MORE BLOCKS? BNE ESLUP QIOW$C IO.WVB,5,5,,,, EXIT$S NOPE: CALL REST ;NO, RECOVER THIS FILE ESLUP: ADD #1,NXTHDR ADC HDRHI MOV (SP)+,R4 ;RECOVER THE LUP COUNT SOB R4,SLUP ;LUP FOR ALL BLOCKS BR NEXTB REST: CMP #27027,(R5) ;IS THIS A HEADER BLOCK BNE NEXT ;NO, SKIP TO NEXT BLOCK TST 2(R5) ;IF THE FILE IS DELETED, THE FILE ID NUMBER SHOULD BNE NEXT ;BE ZERO. MOV R5,R0 ;IF THE CHECKSUM AT THE END OF THE BLOCK IS ADD #776,R0 ;THEN IT REALLY IS A HEADER BLOCK TST (R0) BNE NEXT CMP H.PROG(R5),UIC ;IS THIS FILE IN THE UIC I WANT?? BNE NEXT ;NO, THROW IT OUT THIS TIME MOV #STRING,R0 ;START SETTING UP FOR EDITMSG MOV #EDIT,R1 MOV R5,R2 ;CALCULATE THE ADDRESS OF THE FILE ADD #56,R2 ;INFORMATION SECTION OF THE HEADER CALL $EDMSG ;CONVERT TO ASCII MOV R1,NAM ;SAVE LENGTH MOV #STRING,NAM+2 ;AND ADDRESS IN DSDB FOR OUTPUT FILE QIOW$S #IO.WVB,#6,#6,,,,<#STRING,R1,#'$> MOV #BSTRING,R0 MOVB #11,(R0)+ MOV HDRHI,R1 MOV #30010,R2 CALL $CBTA MOVB #54,(R0)+ MOV NXTHDR,R1 MOV #30010,R2 CALL $CBTA MOVB #11,(R0)+ MOV R0,R1 SUB #BSTRING,R1 QIOW$S #IO.WVB,#6,#6,,,,<#BSTRING,R1,#0> ;THIS IS A HEADER THAT WE WANT, RECOVER IT. JSR PC,WRTBLK NEXT: RTS PC RDBLK: QIOW$ IO.RLB,1,1,,IOSTAT,, BBHI=RDBLK+Q.IOPL+6 BBLO=RDBLK+Q.IOPL+10 HEADER: .BLKB 512.*NBLK ENDH: RDHDR: QIOW$ IO.RLB,1,1,,IOSTAT,, HDRHI=RDHDR+Q.IOPL+6 NXTHDR=RDHDR+Q.IOPL+10 TBUF: .BLKW 16. UIC=TBUF+16 EDIT: .ASCII /%X/ .WORD 0 STRING: .BLKB 32. BSTRING: .BLKB 32. YN: .BLKB 10. DONE: .ASCII /I'M DONE/<7><7><7><7> DL=.-DONE ; .END LAZRUS