home *** CD-ROM | disk | FTP | other *** search
- (188) Thu 2 Dec 93 1:08p Rcvd: Sat 4 Dec 12:16a
- By: Ed Beroset, Durham Net NEC (1:3641/1.250)
- To: Terry Carmen
- Re: Handles to filenames
- St: Pvt Kill Rcvd
- ---------------------------------------------------------------------------
- @INTL 1:260/338 1:3641/1
- @FMPT 250
- @MSGID: 1:3641/1.250 3801a007
- @REPLY: 1:260/338@Fidonet a7814fc3
- In a msg on <Dec 02 13:08>, to Ed Beroset, Terry Carmen writes:
- TC> Ed, is this yours?
-
- Yep. Sure is.
-
- TC> Could you send me a copy of your original? I'll replace it in the
- TC> snippets file. Inbar either sent or posted this as his, since I
- TC> don't change the files when they come in.
-
- Cheeky devil, isn't he? Here's the original:
-
- ; HNDLNAME.ASM
- ; written on 3 February 1993 by Ed Beroset
- ; released to the public domain by the author.
- ;
- ; Given a DOS handle number, the hndl2name function will return a
- ; pointer to the associated file name. This code illustrates the
- ; use of this function.
- ;
- MODEL small
- IDEAL
- STACK 100h
-
- DOS_GET_DOS_VERSION = 030h
- DOS_OPEN_FILE = 03Dh
- DOS_CLOSE_FILE = 03Eh
- DOS_WRITE_TO_HANDLE = 040h
- DOS_TERMINATE_EXE = 04Ch
- DOS_GET_LIST_OF_LISTS = 052h
- DOS_GET_PSP = 062h
-
- STDOUT = 1 ; stdout device handle
- READ_ONLY = 0 ; file mode equate
-
- MACRO DosInt function
- mov ah,function ; this doesn't require much explanation
- int 21h
- ENDM
-
- MACRO ShowStr string, strlen, device
- IFDIF <string>,<dx>
- lea dx,[string] ; note that string is assumed to be in DS
- ENDIF
- mov cx,strlen ; note no error checking
- IFB <device>
- mov bx,STDOUT ; default device...
- ELSE
- mov bx,device ; ...or passed device
- ENDIF
- DosInt DOS_WRITE_TO_HANDLE ; show the string
- ENDM
-
- DATASEG
-
- Msg1 DB "This program tests the hndl2name function.",13,10
- Msg1Len = $-Msg1
-
- STRUC magic
- dosmin DB 0 ; minor DOS version
- dosmaj DB 0 ; major DOS version
- SFTsize DB ? ; system file table entry size (in bytes)
- NameOffs DB ? ; offset from SFT start to first name
- ENDS magic
-
- voodoo magic <0,4,3bh,26h> ; DOS 4.0
- magic <1,3,35h,26h> ; DOS 3.1
- magic <0,3,38h,27h> ; DOS 3.0
- magic <0,2,28h,0ah> ; DOS 2.0
- magic <> ; end of table marker
-
- SFTlength DB ?
- SFTname DB ?
-
- Dummy DB "hndlname.asm",0 ; the name of this file
- Handle DW ? ; handle for this file when opened
-
-
- CODESEG
- Start:
- mov ax,@data ; point DS to our own data segment
- mov ds,ax
- ShowStr Msg1,Msg1Len ; print first message to user
- DosInt DOS_GET_DOS_VERSION
- xchg al,ah ; now straighten things out for our compares
- mov cx,4 ; four entries in table
- lea bx,[voodoo] ; consult our magic table
-
- @@looky:
- cmp ax,[WORD PTR bx] ; is DOS version/rev correct?
- ja @@got_values ; if it's greater than table value, it's OK
- add bx,SIZE voodoo ; otherwise increment to the next table entry
- loop @@looky ; and jump back up
- ; should err_exit if < DOS 2.0 here, but...
- @@got_values:
- mov ax,[WORD PTR bx+2] ; get both SFTsize and NameOffs all at once
- mov [WORD PTR SFTlength],ax ; stow them the same way (cheat!)
- mov dx,OFFSET Dummy ; open dummy file
- mov al,READ_ONLY ; we don't need to modify this file!
- DosInt DOS_OPEN_FILE ;
- mov [Handle],ax ; save the handle for later use
- mov bx,ax ; Hndl2Name requires handle number in BX
- call Hndl2Name ; test new function
- push ds ; now ES:DX points to 11 chars
- push es ;
- pop ds ; but we need DS:DX for ShowStr macro
- ShowStr dx,11
- pop ds ; restore proper DS register
- mov bx,[Handle] ; close our dummy file
- DosInt DOS_CLOSE_FILE ;
- mov al,0 ; all successful, so error code = 0
- DosInt DOS_TERMINATE_EXE
-
- ; hndl2name
- ;
- ; PURPOSE: given a handle, return pointer to ASCII file name
- ; INPUTS: BX = handle of file to be named
- ; SFTlength must be initialized and in current DS
- ; SFTname must be initialized and in current DS
- ; OUTPUTS: ES:DX => ASCII file name (exactly 11 bytes long) (FCB format)
- ;
- PROC hndl2name
- push ax ; save used registers
- push bx
- push si
-
- mov si,bx ; save original file handle in SI
- DosInt DOS_GET_PSP ; now get the PSP of this program
- mov es,bx ; look in the PSP segment for the job file table
- les bx,[es:34h] ; now ES:BX => JFT
- mov al,[es:bx+si] ; now read table entry (index into SFT)
- xor ah,ah ; clear out hi half of AX
- mov si,ax ; now stow the SFT index
- DosInt DOS_GET_LIST_OF_LISTS ; ES:BX => List Of Lists
- les bx,[es:bx+4] ; load up ES:BX => SFT
-
- @@nextSFT: ; ES:BX => SFT at this point
- cmp si,[es:bx+4] ; is this handle in this SFT?
- jb @@SFT_ok ; if so, we're in the correct table
- sub si,[es:bx+4] ; otherwise, adjust index for next table
- les bx,[es:bx] ; and load address of next SFT
- jmp @@nextSFT ; loop back again
-
- @@SFT_ok:
- mov ax,si ; recall our adjusted SFT index
- mov dl,[SFTlength] ; SFTlength is the length of an SFT entry
- mul dl ; ax = (SFT index) * (SFT length)
- mov dl,[SFTname] ; SFTname =offset from beginning of SFT to name
- xor dh,dh ; clear out hi half of DX
- add ax,dx ; ax = SFTindex * SFTlength + SFTname
- add bx,ax ; bx = original offset + calc offset
- mov dx,bx ; now ES:DX => file name string
- pop si ; restore used registers
- pop bx
- pop ax
- ret
- ENDP hndl2name
-
- END Start
- ---------------------
-
- Hmmm... Maybe I should take a look at the snippets file and see if he's
- appropriated any other work of mine. Thanks for your attention to this.
- Although the code has been in the public domain for almost two years now, it's
- still annoying to see somebody else's name on one's own work. I think I'll
- just send a little netmail to Inbar Raz asking for an explanation.
-
- -> Ed <-
-
- @Via 1:3641/1@fidonet.org @19931203.110648 FrontDoor 2.20a.mL
- @Via 1:151/1003, Dec 03 12:47:10 (QM v1.23/b)
- @Via QM 1:270/101, Fri Dec 03 22:15 UTC (v1.26/a49)
- @Via MsgTrack* 1:260/1@fidonet, Sat Dec 04 1993 at 03:25 UTC
- @Via MsgTrack 1:260/362@Fidonet, Sat Dec 04 1993 at 05:07 UTC
- @Via 1:260/362@fidonet @19931204.001211 FrontDoor 2.11.SW
-