1 ; SCCSID = @(#)segcheck.asm 1.2 85/07/24
2 TITLE SegCheck
- internal consistency check
21 CODE SEGMENT BYTE PUBLIC 'CODE'
24 SHARE
SEGMENT BYTE PUBLIC 'SHARE'
30 BREAK <SegCheck
- validate segments
in MSDOS
>
36 mov reg
,offset DOSGroup
:var
46 If (not sharef
) and (not redirector
)
50 MOV AX,OFFSET DOSGROUP
:a
55 b: mov ax,offset share
:a
57 b: mov ax,offset netwrk
:a
85 ; SegCheck - assure that segments are correctly set up
87 ; Inputs: top of stack points to:
89 ; byte flags 04h is ES 02h is DS 01 is CS/SS
90 ; offset asciz message
92 ; Outputs: message to screen (via INT 29h)
93 ; Nothing modified (flags too)
95 Procedure SegCheck
,NEAR
96 ASSUME
DS:NOTHING
,ES:NOTHING
,SS:NOTHING
98 MOV BP,SP ; set up addressing
100 SaveReg
<AX,BX,CX,DX>
101 MOV AL,BYTE PTR [BP].segtemp
; get flags
103 TEST AL,1 ; shall we use CS or SS?
105 MOV CX,CS ; use CS instead
107 TEST AL,2 ; do we check DS?
108 JZ SegTestES
; no, go check ES
111 JZ SegTestES
; DS is valid, go check ES
113 zfmt
<"Assumed DS invalid $s\n">,<AX>
115 TEST AL,4 ; do we check ES?
116 JZ SegTestDone
; no, all done
119 JZ SegTestDone
; ES is valid, all done
121 zfmt
<"Assumed ES invalid $s\n">,<AX>
123 RestoreReg
<DX,CX,BX,AX>
126 ret 4 ; release message, temp
132 I_need BuffHead
,DWORD
137 I_need CurrentPDB
,WORD
138 I_need User_In_AX
,WORD
152 Public SGCHK001S
,SGCHK001E
154 DPBMes
DB "DPB assertion failed: ",0
155 BUFMes
DB "BUF assertion failed: ",0
156 SFTMes
DB "SFT assertion failed: ",0
165 Extrn SectPDB
:WORD, SectRef
:WORD
168 ; DPBCheck - validate a supposed DPB pointer
169 ; Inputs: Pushed arguments
170 ; Outputs: Message to screen
171 ; Registers modified: none
173 Procedure DPBCheck
,NEAR
174 MOV Msg
,OFFSET DOSGroup
:DPBMes
178 SaveReg
<AX,BX,DS,SI,ES,DI>
185 LES DI,ES:[DI.dpb_next_dpb
]
189 zfmt
<"$s$x:$x $s\n">,<msg
,ds,si,AX>
191 a: JMP a
; slam the door.
192 DPBRet: RestoreReg
<DI,ES,SI,DS,BX,AX> ; Done:
198 ; SFTCheck - validate a supposed SFT pointer
199 ; Inputs: Pushed arguments
200 ; Outputs: Message to screen
201 ; Registers modified: none
203 Procedure SFTCheck
,NEAR
204 MOV Msg
,OFFSET DOSGroup
:SFTMes
208 SaveReg
<AX,BX,DS,SI,ES,DI>
213 invoke SFFromSFN
; while ((d=SF(i)) != NULL)
217 JZ DPBRet
; goto Done;
218 SFTNext:INC BX ; else
221 MOV BX,ES:[DI.sfCount
]
230 ; The SFT is not in the allocated tables. See if it is one of the static
234 MOV DI,OFFSET DOSGROUP
:AUXSTACK
- SIZE SF_ENTRY
237 MOV DI,OFFSET DOSGROUP
:RenBuf
244 ; BUFCheck - validate a supposed BUF pointer
245 ; Inputs: Pushed arguments
246 ; Outputs: Message to screen
247 ; Registers modified: none
249 Procedure BUFCheck
,NEAR
250 MOV Msg
,OFFSET DOSGroup
:BUFMes
254 SaveReg
<AX,BX,DS,SI,ES,DI>
256 ; CheckDisk - make sure that we are in the disk critical section...
258 MOV AL,BYTE PTR ECritDisk
262 CMP SectPDB
+ 2 * critDisk
,AX
265 zfmt
<"$p: $x $s critDisk owned by $x\n">,<User_In_AX
,AX,SectPDB
+2*critDisk
>
267 CMP SectRef
+ 2 * critDisk
,0
269 zfmt
<"$p: $x $s critDisk ref count is 0\n">,<User_In_AX
,AX>
280 LES DI,ES:[DI.buf_link
]