nacer@orstcs.UUCP (nacer) (04/20/86)
If someone has downloaded NO.COM from the PC magazine Interactive Reader Service at (212)696-0360 please post it here ! If possible post NO.ASM as well Thank you! hp-pcd!orstcs!nacer
mbailey@ncrcae.UUCP (Merle Bailey) (04/24/86)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# The uencoded no.com --> no.com.u no.asm
echo x - no.com.u
sed 's/^X//' > "no.com.u" << '//E*O*F no.com.u//'
Xbegin 644 no.com
XMZ0@!0V]P>7)I9VAT(#$Y.#8@6FEF9BU$879I<R!0=6)L:7-H:6YG($-O+AH@
XM4')O9W)A;6UE9"!B>2!#:&%R;&5S(%!E='IO;&0@&E-Y;G1A>#H@3D\@9FEL
XM97-P96,@8V]M;6%N9"!;<&%R86UE=&5R<UTD3D\Z($YE961S($1/4R R+C @
XM*R1.3SH@26YC;W)R96-T($9I;&4@4W!E8R1.3SH@5&]O(&UA;GD@9FEL97,@
XM=&\@:&ED921.3SH@06QL;V-A=&EO;B!0<F]B;&5M)$Y/.B!#3TU-04Y$(%!R
XM;V)L96TD"2 L.ST 0T]-4U!%0ST !< ; M##-
XM(3P"<Q>Z=0&T"<TAS2"L/ UT];_G ;D% /*NP[I, ;Z! /SHZ/]T^XO>2^C@
XM_W7[3H?SOPL$@'P!.G4%K23?ZPBT&<TA!$&T.JNP7#@$=".J5HOWBE3]@.I
XMM$?-(;J) 7*E*L X!'0)N4 \JY/L%RJ7HO+*\[SI"K JHD^[ &#ZP2@@ $
XM@"K#M"")!\=' B]#H2P H_L!B1[] 8P._P&,#@,"C X% KK@ [0:S2&+/NP!
XMN@L$*\FT3LTA<PL]$@!T);J) >D^_XO'!0 "<@0[Q'(&NJ$!Z2W_OOX#Z.D
XM_P;N ;1/Z]*)/O !BS[L ;E +!<_?*NQD4" /RX #/-(8@6\@$JTK@!,\TA
XML_^W NB& (L>\ &!PP "B^.#PP^Q!-/KM$K-(;J\ 7)6!HX&+ K_[[S ;K3
XM 2: /0!T0U97N0@ \Z9?7G0)*L"Y___RKNOF@\<('@8?!XDF"0*+U[O[ ;@
XM2\TAC,B.V([ CM"+)@D"G"K2N $SS2&=NM,!<P2T"<TAL_VW .@+ (H6\@&X
XM 3/-(<T@BP[N >,HBS;L 8L6\ %6O@L$B_KH& !/7N@3 %&X $/-(2++"L^X
XM 4/-(5GBX,.D@'W_ '7YPP
X#
X
Xend
//E*O*F no.com.u//
echo x - no.asm
sed 's/^X//' > "no.asm" << '//E*O*F no.asm//'
X; NO.ASM -- Hides specified files from command that follows
X; ======
X
XCSEG Segment
X Assume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
X Org 002Ch
XEnvironment Label Word ; Segment of Environment is here
X Org 0080h
XParameter Label Byte ; Parameter is here
X Org 0100h
XEntry: Jmp Begin ; Entry Point
X
X; Most Data (some more at end of program)
X; ---------------------------------------
X
X db "Copyright 1986 Ziff-Davis Publishing Co.",1Ah
X db " Programmed by Charles Petzold ",1Ah
XSyntaxMsg db "Syntax: NO filespec command [parameters]$"
XDosVersMsg db "NO: Needs DOS 2.0 +$"
XFileSpecMsg db "NO: Incorrect File Spec$"
XTooManyMsg db "NO: Too many files to hide$"
XMemAllocMsg db "NO: Allocation Problem$"
XCommandMsg db "NO: COMMAND Problem$"
XDelimiters db 9,' ,;='
XFileList dw ? ; Storage of found files
XFileCount dw 0 ; Count of found files
XFileListEnd dw ? ; End of storage of found files
XBreakState db ? ; Store original break state here
XComspec db 'COMSPEC=' ; String for Environment search
XParamBlock dw ? ; Parameter block for EXEC call
X dw ?, ?
X dw 5Ch, ?
X dw 6Ch, ?
XStackPointer dw ? ; Save SP during EXEC call
X
X; Check DOS Version
X; -----------------
X
XBegin: Mov AH, 30h ; Check for DOS Version
X Int 21h ; through DOS call
X Cmp AL, 2 ; See if it's 2.0 or above
X Jae DosVersOK ; If so, continue
X
X Mov DX, Offset DosVersMsg ; Error message
XErrorExit: Mov AH, 9 ; Print String function call
X Int 21h ; Do it
X Int 20h ; And exit prematurely
X
X; Parse Command Line to get NO File specification
X; -----------------------------------------------
X
XScanParam: Lodsb ; SUBROUTINE: Get byte
X Cmp AL, 13 ; See if end of parameter
X Je ErrorExit ; If so, exit
X Mov DI, Offset Delimiters ; Check if delimiter
X Mov CX, 5 ; There are 5 of them
X Repne Scasb ; Scan the string
X Ret ; And return
X
XDosVersOK: Mov DX, Offset SyntaxMsg ; Possible error msg
X Mov SI, 1+Offset Parameter ; NO Parameter string
X Cld ; Directions forward
X
XBegSearch: Call ScanParam ; Check byte in subroutine
X Je BegSearch ; If delimiter, keep searching
X Mov BX, SI ; Save pointer in BX
X Dec BX ; BX points to NO file spec
X
XEndSearch: Call ScanParam ; Check byte in subroutine
X Jne EndSearch ; If not delimiter, keep going
X
X; Construct full FilePath and save down at end of program
X; -------------------------------------------------------
X
X Dec SI ; Points after NO file spec
X Xchg SI, BX ; SI points to beg, BX to end
X Mov DI, Offset FullPath ; Points to destination
X Cmp Byte Ptr [SI + 1], ':' ; See if drive spec included
X Jnz GetDrive ; If not, must get the drive
X Lodsw ; Otherwise, grab drive spec
X And AL, 0DFh ; Capitalize drive letter
X Jmp Short SaveDrive ; And skip next section
X
XGetDrive: Mov AH, 19h ; Get current drive
X Int 21h ; through DOS
X Add AL, 'A' ; Convert to letter
X Mov AH, ':' ; Colon after drive letter
X
XSaveDrive: Stosw ; Save drive spec and colon
X Mov AL, '\' ; Directory divider byte
X Cmp [SI], AL ; See if spec starts at root
X Jz HaveFullPath ; If so, no need to get path
X Stosb ; Store that character
X Push SI ; Save pointer to parameter
X Mov SI, DI ; Destination of current path
X Mov DL, [SI - 3] ; Drive letter specification
X Sub DL, '@' ; Convert to number
X Mov AH, 47h ; Get current directory
X Int 21h ; through DOS
X Mov DX, Offset FileSpecMsg ; Possible error message
X Jc ErrorExit ; Exit if error
X Sub AL, AL ; Search for terminating zero
X Cmp [SI], AL ; Check if Root Directory
X Jz RootDir ; If so, don't use it
X Mov CX, 64 ; Number of bytes to search
X Repnz Scasb ; Do the search
X Dec DI ; DI points to last zero
X Mov AL, '\' ; Put a backslash in there
X Stosb ; So filespec can follow
XRootDir: Pop SI ; Get back SI
X
XHaveFullPath: Mov CX, BX ; End of NO file spec
X Sub CX, SI ; Number of bytes to transfer
X Rep Movsb ; Transfer them
X Sub AL, AL ; Terminating zero
X Stosb ; Save it
X Mov [FileList], DI ; Repository for found files
X
X; Fix up parameter and ParamBlock for eventual COMMAND load
X; ---------------------------------------------------------
X
X Sub BX, 4 ; Points to new param begin
X Mov AL, [Parameter] ; Old byte count of parameter
X Add AL, 80h ; Add beginning of old param
X Sub AL, BL ; Subtract beginning of new
X Mov AH, ' ' ; Space separator
X Mov Word Ptr [BX], AX ; Store it
X Mov Word Ptr [BX + 2], 'C/' ; Add /C to beginning of rest
X Mov AX, [Environment] ; Get environment segment
X Mov [ParamBlock], AX ; Save it
X Mov [ParamBlock + 2], BX ; Save parameter pointer
X Mov [ParamBlock + 4], CS ; Save segment of ParamBlock
X Mov [ParamBlock + 8], CS
X Mov [ParamBlock + 10], CS
X
X; Find Files from NO File Specification
X; -------------------------------------
X
X Mov DX, Offset DTABuffer ; Set File Find buffer
X Mov AH, 1Ah ; by calling DOS
X Int 21h
X
X Mov DI, [FileList] ; Address of destination
X Mov DX, Offset FullPath ; Search string
X Sub CX, CX ; Search Normal files only
X Mov AH, 4Eh ; Find first file
X
XFindFile: Int 21h ; Call DOS to find file
X Jnc Continue ; If no error continue
X Cmp AX, 18 ; If no more files
X Jz NoMoreFiles ; get out of the loop
X Mov DX, Offset FileSpecMsg ; Error message otherwise
X Jmp ErrorExit ; Exit and print message
X
XContinue: Mov AX, DI ; Address of destination
X Add AX, 512 ; See if near top of segment
X Jc TooManyFiles ; If so, too many files
X Cmp AX, SP ; See if getting too many
X Jb StillOK ; If not, continue
X
XTooManyFiles: Mov DX, Offset TooManyMsg ; Otherwise error message
X Jmp ErrorExit ; And terminate
X
XStillOK: Mov SI, 30+Offset DTABuffer ; Points to filename
X Call AsciizTransfer ; Transfer it to list
X Inc [FileCount] ; Kick up counter
X Mov AH, 4Fh ; Find next file
X Jmp FindFile ; By looping around
X
XNoMoreFiles: Mov [FileListEnd], DI ; Points after last file
X Mov DI, [FileList] ; Points to end of find string
X Mov CX, 64 ; Search up to 64 bytes
X Mov AL, '\' ; For the backslash
X Std ; Search backwards
X Repnz Scasb ; Do the search
X Mov Byte Ptr [DI + 2], 0 ; Stick zero in there
X Cld ; Fix up direction flag
X
X; Stop Ctrl-Break Exits and Hide the files
X; ----------------------------------------
X
X Mov AX,3300h ; Get Break State
X Int 21h ; By calling DOS
X Mov [BreakState],DL ; Save it
X Sub DL,DL ; Set it to OFF
X Mov AX,3301h ; Set Break State
X Int 21h ; By calling DOS
X Mov BL, 0FFh ; Value to AND attribute
X Mov BH, 02h ; Value to OR attribute
X Call ChangeFileMode ; Hide all the files
X
X; Un-allocate rest of memory
X; --------------------------
X
X Mov BX, [FileListEnd] ; Beyond this we don't need
X Add BX, 512 ; Allow 512 bytes for stack
X Mov SP, BX ; Set new stack pointer
X Add BX, 15 ; Prepare for truncation
X Mov CL,4 ; Prepare for shift
X Shr BX,CL ; Convert to segment form
X Mov AH,4Ah ; Shrink allocated memory
X Int 21h ; By calling DOS
X Mov DX,Offset MemAllocMsg ; Possible Error Message
X Jc ErrorExit2 ; Print it and terminate
X
X; Search for Comspec in Environment
X; ---------------------------------
X
X Push ES ; We'll be changing this
X Mov ES, [Environment] ; Set ES to Environment
X Sub DI, DI ; Start at the beginning
X Mov SI, Offset ComSpec ; String to search for
X Mov DX, Offset CommandMsg ; Possible error message
X
XTryThis: Cmp Byte Ptr ES:[DI], 0 ; See if points to zero
X Jz ErrorExit2 ; If so, we can't go on
X Push SI ; Temporarily save these
X Push DI
X Mov CX, 8 ; Search string has 8 chars
X Repz Cmpsb ; Do the string compare
X Pop DI ; Get back the registers
X Pop SI
X Jz LoadCommand ; If equals, we've found it
X Sub AL, AL ; Otherwise search for zero
X Mov CX, -1 ; For 'infinite' bytes
X Repnz Scasb ; Do the search
X Jmp TryThis ; And try the next string
X
X; Load COMMAND.COM
X; -----------------
X
XLoadCommand: Add DI, 8 ; so points after 'COMSPEC='
X Push DS ; Switch DS and ES registers
X Push ES
X Pop DS
X Pop ES
X Mov [StackPointer],SP ; Save Stack Pointer
X Mov DX, DI ; DS:DX = Asciiz of COMMAND
X Mov BX, Offset ParamBlock ; ES:BX = parameter block
X Mov AX, 4B00h ; EXEC function call
X Int 21h ; Load command processor
X
X; Return from COMMAND.COM
X; -----------------------
X
X Mov AX, CS ; Current code segment
X Mov DS, AX ; Reset DS to this segment
X Mov ES, AX ; Reset ES to this segment
X Mov SS, AX ; Reset stack segment to it
X Mov SP, [StackPointer] ; Reset SP
X Pushf ; Save error flag
X Sub DL,DL ; Set Ctrl Break to OFF
X Mov AX,3301h
X Int 21h ; By calling DOS
X Popf ; Get back error flag
X Mov DX,Offset CommandMsg ; Set up possible error msg
X Jnc Terminate ; And print if EXEC error
X
X; Unhide the Files, restore Ctrl-Break state, and exit
X; ----------------------------------------------------
X
XErrorExit2: Mov AH,9 ; Will print the string
X Int 21h ; Print it
XTerminate: Mov BL, 0FDh ; AND value for change
X Mov BH, 00h ; OR value for change
X Call ChangeFileMode ; Change file attributes
X Mov DL,[BreakState] ; Original break-state
X Mov AX,3301h ; Change the break-state
X Int 21h ; by calling DOS
X Int 20h ; Terminate
X
X; SUBROUTINE: Change File Mode (All files, BL = AND, BH = OR)
X; -----------------------------------------------------------
X
XChangeFileMode: Mov CX, [FileCount] ; Number of files
X Jcxz EndOfChange ; If no files, do nothing
X Mov SI, [FileList] ; Beginning of list
X Mov DX, [FileListEnd] ; End of List
XChangeLoop: Push SI ; Save pointer
X Mov SI, Offset FullPath ; Preceeding path string
X Mov DI, DX ; Destination of full name
X Call AsciizTransfer ; Transfer it
X Dec DI ; Back up to end zero
X Pop SI ; Get back pointer to filename
X Call AsciizTransfer ; Transfer it
X Push CX ; Save the counter
X Mov AX, 4300h ; Get attribute
X Int 21h ; by calling DOS
X And CL, BL ; AND with BL
X Or CL, BH ; OR with BH
X Mov AX, 4301h ; Now set attribute
X Int 21h ; by calling DOS
X Pop CX ; Get back counter
X Loop ChangeLoop ; And do it again if necessary
XEndOfChange: Ret ; End of subroutine
X
X; SUBROUTINE: Asciiz String Transfer (SI, DI in, returned incremented)
X; --------------------------------------------------------------------
X
XAsciizTransfer: Movsb ; Transfer Byte
X Cmp Byte Ptr [DI - 1], 0 ; See if it was end
X Jnz AsciizTransfer ; If not, loop
X Ret ; Or leave subroutine
X
X; Variable length data stored at end
X; ----------------------------------
X
XDTABuffer Label Byte ; For file find calls
XFullPath equ DTABuffer + 43 ; For file path and names
XCSEG EndS ; End of the segment
X End Entry ; Denotes entry point
//E*O*F no.asm//
echo Possible errors detected by \'wc\' [hopefully none]:
temp=/tmp/shar$$
trap "rm -f $temp; exit" 0 1 2 3 15
cat > $temp <<\!!!
21 78 1083 no.com.u
311 1819 17410 no.asm
332 1897 18493 total
!!!
wc no.com.u no.asm | sed 's=[^ ]*/==' | diff -b $temp -
exit 0