📄 gshare2.asm
字号:
cps2:
cmp ds:[arena_signature],arena_signature_end
jz cps3 ; no more blocks to do
mov bx,ds ; get current address
add bx,DS:[Arena_size] ; add on size of block
inc bx ; remember size of header
mov ds,bx ; link to next
jmp cps1
;---------------------------------------
; Just for good measure, use CurrentPDB
; and clean off him
;---------------------------------------
cps3:
mov ds,CurrentPDB
call CPJ
cps31:
RestoreReg <
RestoreReg <CX,BX,AX,DI,ES,SI,DS>
ret
EndProc CPS
;******************* START OF SPECIFICATIONS ***********************************
;
; CPJ -
;
; Scan JFN table for SFT # and put in -1 if found
;
; Input: DS:0 is PDB
; AL is SFT index # of interest
;
; Output: None
;
; Uses: Flags,CX,ES,DI
;
;******************* END OF SPECIFICATIONS *************************************
Procedure CPJ,NEAR
assume ds:nothing,es:nothing
mov cx,ds:[PDB_JFN_length]
les di,ds:[PDB_JFN_pointer]
cld
cpj1: repne scasb
retnz ; none found
mov byte ptr es:[di-1],-1 ; free this
jcxz CPJret ; Found one in last JFN entry
jmp cpj1 ; keep looking
CPJret:
ret
EndProc CPJ
Break <SFM - convert an mft pointer into a serial number>
;******************* START OF SPECIFICATIONS ***********************************
;
; SFM - convert a pointer to a mft entry into the serial number for that
; entry. We keep these around to see if a FCB really points to the correct
; SFT.
;
; Inputs: BX is the mft pointer
; Outputs: BX is the serial number
; Registers Revised: none
;
;******************* END OF SPECIFICATIONS *************************************
Procedure SFM,NEAR
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:DOSDATA
mov bx,cs:[bx].mft_serl
ret
EndProc SFM
Break <ShChk - check a fcb for share related information>
;******************* START OF SPECIFICATIONS ***********************************
;
; ShChk - check a fcb for share related information
;
; ShChk - checks the reserved field contents of an FCB with a SFT to see
; if they represent the same file. The open ref count must be > 0.
;
; Inputs: DS:SI point to FCB
; ES:DI point to SFT
; Outputs: Carry Set if contents do not match
; Carry clear if contents match
; BX has first cluster
; Registers Revised: none
;
;******************* END OF SPECIFICATIONS *************************************
Procedure ShChk,NEAR
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:DOSDATA
CMP ES:[DI].sf_ref_count,0
JZ BadSFT
MOV BX,ES:[DI].sf_mft ; Local file or dev with sharing
call SFM
CMP BX,[SI].fcb_l_mfs
JNZ BadSFT
MOV BX,[SI].fcb_l_firclus
ret
BadSFT: stc
ret
EndProc ShChk
Break <ShSave - save information from SFT into an FCB>
;******************* START OF SPECIFICATIONS ***********************************
;
; ShSave - save information from SFT into an FCB
;
; ShSave - copy information into the reserved area of an FCB from a SFT.
; This is so that we can later match the SFT with the FCB.
;
; Inputs: ES:DI point to SFT
; DS:SI point to FCB
; Outputs: FCB reserved field is filled in
; BL = FCBSHARE
; Registers Revised: AX,BX
;
;******************* END OF SPECIFICATIONS *************************************
Procedure ShSave,NEAR
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:DOSDATA
MOV AL,ES:[DI].sf_attr ; move attribute (for reopen)
MOV [SI].FCB_l_attr,AL
MOV AX,ES:[DI].sf_firclus ; get first cluster
MOV [SI].FCB_l_firclus,AX
MOV BX,ES:[DI].sf_mft ; get sharing pointer
call SFM
MOV [SI].FCB_l_mfs,BX
MOV BL,FCBSHARE
ret
EndProc ShSave
Break <ShCol - collapse identical handle SFTs in mode 70 only>
;******************* START OF SPECIFICATIONS ***********************************
;
; ShCol - collapse identical handle SFTs in mode 70 only
;
; ShCol - collapse same 70-mode handles together. This represents network
; originated FCBs. Since FCB's are incredibly mis-behaved, we collapse the
; SFT's for identical files, thus using a single sft for each file instead
; of a separate sft for each instance of the file.
;
; Note that the redirectors will collapse multiple instances of these
; files together. FCB's are pretty misbehaved, so the redirector will
; inform us of EACH close done on an FCB. Therefore, we must increment
; the ref count each time we see a collapse here.
;
; Inputs: DS:SI ThisSFT has new sft to find.
; Outputs: Carry set - no matching SFT was found
; Carry clear - matching SFT was found and all collapsing done.
; AX has proper handle
; Registers Revised: all.
;
;******************* END OF SPECIFICATIONS *************************************
Procedure ShCol,NEAR
ASSUME CS:SHARE,DS:NOTHING,ES:NOTHING,SS:DOSDATA
;---------------------------------------
; Collapse the files ONLY if
; the mode is for net FCB's
;---------------------------------------
MOV AL,BYTE PTR [SI].sf_mode
AND AL,sharing_mask
CMP AL,sharing_net_FCB
JNZ UseJFN
;---------------------------------------
; In share support
;---------------------------------------
XOR BX,BX ; for (i=0; sffromsfn(i); i++) {
OpenScan:
CallInstall SFFromSFN,multDOS,22,bx,bx
JC UseJFN
CallInstall PointComp,multDOS,20 ; if (!pointcomp (s,d))
JZ OpenNext
CMP ES:[DI].sf_ref_count,0
JZ OpenNext
MOV AX,ES:[DI].sf_mode
CMP AX,[SI].sf_mode
JNZ OpenNext
MOV AX,ES:[DI].sf_mft
CMP AX,[SI].sf_mft
JNZ OpenNext
MOV AX,WORD PTR ES:[DI].sf_UID
CMP AX,WORD PTR [SI].sf_uid
JNZ OpenNext
MOV AX,WORD PTR ES:[DI].sf_pid
CMP AX,WORD PTR [SI].sf_pid
JZ OpenFound
OpenNext:
INC BX
JMP OpenScan
;--------------------------------------
; DS:SI points to an sft which is a
; duplicate of that found in
; ES:DI is the older one.
;
; We call mftclose to release the
; appropriate info.
;--------------------------------------
OpenFound:
MOV [SI].sf_ref_count,0 ; free 'new' sft
SaveReg <DS,SI,ES,DI,BX>
Context DS
LES DI,ThisSFT
call MFTClose
RestoreReg <AX,DI,ES,SI,DS>
ASSUME DS:NOTHING
INC ES:[DI].sf_ref_count ; d->refcount++;
XOR BX,BX ; find jfn with sfn as contents
JFNScan:
CallInstall pJFNFromHandle,multDOS,32,AX,AX
JC UseJFN ; ran out of handles?
CMP AL,BYTE PTR ES:[DI] ; does JFN have SFN?
jz JFNfound ; YES, go return JFN
INC BX ; no, look at next
JMP JFNScan
JFNFound:
LDS SI,pJFN
MOV BYTE PTR [SI],0FFh ; free JFN
MOV AX,BX ; return JFN
ret
UseJFN:
MOV AX,JFN
ret
EndProc ShCol
Break <ShCloseFile - close a particular file for a particular UID/PID>
;******************* START OF SPECIFICATIONS ***********************************
;
; ShCloseFile - close a particular file for a particular UID/PID
;
; ShCloseFile - Compatability mode programs will often delete files that
; they had open. This was perfectly valid in the 2.0 days, but this
; presents a reliability problem in the network based operating environment.
; As a result, both RENAME and DELETE will call us to see if the file is
; open by is only. If it is not open or is open by us only, we close it.
; Note that we will ONLY close compatability SFTs.
; Otherwise, we signal and error.
;
; Inputs: WFT_Start has a DOSDATA offset to the file name
; DS is DOSData
; Outputs: nothing relevant.
; Registers Revised: None.
;
;******************* END OF SPECIFICATIONS *************************************
Procedure ShCloseFile,NEAR
ASSUME DS:DOSDATA,ES:NOTHING,SS:DOSDATA
SaveReg <AX,BX,CX,DX,SI,DI,BP,DS,ES>
EnterCrit critShare
ShCl:
MOV SI,WFP_Start
XOR AL,AL
call FNM ; attempt to find name in list
ASSUME DS:NOTHING
JC ShCloseDone ; can't find, signal success
;--------------------------------------
; We have found a file in the MFT.
; Walk the open sft list to find
; the SFTs for the current UID/PID.
;--------------------------------------
MOV CX,DS
LDS SI,[BX].mft_sptr
ShClCheck:
MOV AX,Proc_ID
CMP [SI].sf_PID,AX
JNZ ShCloseDone
MOV AX,User_ID
CMP [SI].sf_UID,AX
JNZ ShCloseDone
MOV AX,[SI].sf_mode
AND AX,sharing_mask
CMP AX,sharing_net_fcb
jz ShClNext
CMP AX,sharing_compat
jnz ShCloseDOne
ShClNext:
LDS SI,[SI].sf_chain
OR SI,SI
JNZ ShClCheck
MOV DS,CX
LDS SI,[BX].mft_sptr
;--------------------------------------
; Everything matches. Set up ThisSFT
; and walk the chain from the beginning.
;--------------------------------------
MOV WORD PTR ThisSFT,SI
MOV WORD PTR ThisSFT+2,DS
;--------------------------------------
; Close all handles for this SFT
;--------------------------------------
call CPS
;--------------------------------------
; Close the sft itself.
;--------------------------------------
Context DS
CallInstall DOS_Close,multDos,1
;--------------------------------------
; The SFT may be free and we have no
; idea where the next is. Go and loop
; all over.
;--------------------------------------
JMP ShCl
;--------------------------------------
; There are no more SFTs to close. Leave
;---------------------------------------
ShCloseDone:
LeaveCrit critShare
STC
RestoreReg <ES,DS,BP,DI,SI,DX,CX,BX,AX>
ret
EndProc ShCloseFile
.xall
Break <ShSU - update all SFTs for a specified change>
;******************* START OF SPECIFICATIONS ***********************************
;
; NAME: ShSU - update all SFTs for a specified change>
;
; FUNCTION: In a shared environment, we want to propogate the SFT
; changes for a particular file to all other SFTs for that
; file. The types of things we propogate are:
;
; - Time of last write - we only do this on CLOSE and on
; FILETIMES.
;
; - Size and allocation information - we do this ONLY when
; we change sf_size.
;
; We achieve this by walking the linked list of SFTs for the
; file. See PSEUDOCODE below
;
; INPUT: ES.DI has SFT that was just Revised.
; AX = 0 for updating of time from ES:DI into old sfts
; AX = 1 for updating of size/allocation for growth from ES:DI
; AX = 2 for updating of size/allocation for shrink from ES:DI
; AX = 3 for new instance copy into ES:DI
; AX = 4 for update of codepage and high attribute
;
; OUTPUT: All relevant SFTs are updated.
;
; REGISTERS USED: All except ES:DI and DS:SI
; (NOT RESTORED)
;
; LINKAGE: DOS Jump Table
;
; EXTERNAL Invoke: New_Sft, Call_IFS
; REFERENCES: Callinstall
;
; NORMAL -
; EXIT:
;
; ERROR -
; EXIT:
;
; CHANGE 04/15/87 - Major overhaul and IFS support
; LOG:
;
;******************* END OF SPECIFICATIONS *************************************
;******************+ START OF PSEUDOCODE +**************************************
;
; START ShSU
;
; if not a device and
; if not a network
; search
; if our SFT
; advance to next SFT
; endif
; leave if no more SFT's
; exitif cx = 3
; invoke New_Sft
; orelse
; if cx = 0
; update time
; update date
; if non - FAT file system
; call IFSFUNC
; endif
; else cx = 1 or 2
; update size
; if non - FAT file system
; call IFSFUNC
; else
; update first cluster
; if cx = 2 or
; if lstclus un-set from create
; update cluster position
; update last cluster
; endif
; endif
; endif
; advance to next SFT
; endloop
; endsearch
; endif
; return
;
; END ShSU
;
;******************+ END OF PSEUDOCODE +**************************************
Procedure ShSU,near
ASSUME DS:NOTHING,ES:NOTHING
nop
; int 3
nop
ifs_flag equ 8000h ; ;AN000;
;---------------------------------------
; Do nothing for device or network
;---------------------------------------
mov bx,es:[di].sf_flags ; M004: must check sf_flags field
;; mov bx,es:[di].sf_mode ; M004: sf_mode
and bx,sf_isnet + devid_device
; $if z,and,long ; if not device and ;AC000;
JZ $$XL1
JMP $$IF4
$$XL1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -