]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DOS/SEGCHECK.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / DOS / SEGCHECK.ASM
1 ; SCCSID = @(#)segcheck.asm 1.2 85/07/24
2 TITLE SegCheck - internal consistency check
3 NAME SegCheck
4
5 .xlist
6 INCLUDE DOSSYM.INC
7 INCLUDE DEVSYM.INC
8
9 ShareF = FALSE
10
11 IF NOT SHAREF
12 include dosseg.asm
13 ENDIF
14 .list
15
16 AsmVars <NET, DEBUG>
17
18 DEBUG = FALSE
19
20 IF NOT SHAREF
21 CODE SEGMENT BYTE PUBLIC 'CODE'
22 ASSUME CS:DOSGroup
23 ELSE
24 SHARE SEGMENT BYTE PUBLIC 'SHARE'
25 ASSUME CS:SHARE
26 ENDIF
27
28 DEBUG = FALSE
29
30 BREAK <SegCheck - validate segments in MSDOS>
31
32 Off Macro reg,var
33 IF SHAREF
34 mov reg,offset var
35 else
36 mov reg,offset DOSGroup:var
37 endif
38 endm
39
40 zfmt MACRO fmts,args
41 local a,b
42 PUSHF
43 PUSH AX
44 PUSH BP
45 MOV BP,SP
46 If (not sharef) and (not redirector)
47 Table segment
48 a db fmts,0
49 Table ends
50 MOV AX,OFFSET DOSGROUP:a
51 else
52 jmp short b
53 a db fmts,0
54 if sharef
55 b: mov ax,offset share:a
56 else
57 b: mov ax,offset netwrk:a
58 endif
59 endif
60 PUSH AX
61 cargs = 2
62 IRP item,<args>
63 IFIDN <AX>,<item>
64 MOV AX,[BP+2]
65 ELSE
66 MOV AX,item
67 ENDIF
68 PUSH AX
69 cargs = cargs + 2
70 ENDM
71 invoke PFMT
72 ADD SP,Cargs
73 POP BP
74 POP AX
75 POPF
76 ENDM
77
78 segFrame Struc
79 segbp DW ?
80 segip DW ?
81 segmes dw ?
82 segtemp DW ?
83 segFrame ENDS
84 ;
85 ; SegCheck - assure that segments are correctly set up
86 ;
87 ; Inputs: top of stack points to:
88 ; 2-byte jump
89 ; byte flags 04h is ES 02h is DS 01 is CS/SS
90 ; offset asciz message
91 ;
92 ; Outputs: message to screen (via INT 29h)
93 ; Nothing modified (flags too)
94
95 Procedure SegCheck,NEAR
96 ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
97 SaveReg <BP>
98 MOV BP,SP ; set up addressing
99 PUSHF
100 SaveReg <AX,BX,CX,DX>
101 MOV AL,BYTE PTR [BP].segtemp; get flags
102 MOV CX,SS
103 TEST AL,1 ; shall we use CS or SS?
104 JZ SegUseSS ; use SS
105 MOV CX,CS ; use CS instead
106 SegUseSS:
107 TEST AL,2 ; do we check DS?
108 JZ SegTestES ; no, go check ES
109 MOV DX,DS
110 CMP CX,DX
111 JZ SegTestES ; DS is valid, go check ES
112 MOV AX,[BP].segmes
113 zfmt <"Assumed DS invalid $s\n">,<AX>
114 SegTestES:
115 TEST AL,4 ; do we check ES?
116 JZ SegTestDone ; no, all done
117 MOV DX,ES
118 CMP CX,DX
119 JZ SegTestDone ; ES is valid, all done
120 MOV AX,[BP].segmes
121 zfmt <"Assumed ES invalid $s\n">,<AX>
122 SegTestDone:
123 RestoreReg <DX,CX,BX,AX>
124 POPF
125 RestoreReg <BP>
126 ret 4 ; release message, temp
127 EndProc SegCheck
128
129
130 IF NOT SHAREF
131 I_need DPBHead,DWORD
132 I_need BuffHead,DWORD
133 I_need sftFCB,DWORD
134 I_need AuxStack,BYTE
135 I_need IOStack,BYTE
136 I_need renbuf,byte
137 I_need CurrentPDB,WORD
138 I_need User_In_AX,WORD
139
140 extrn ECritDisk:NEAR
141
142 CritNOP label byte
143 RET
144
145 AstFrame STRUC
146 Astbp dw ?
147 Astip dw ?
148 Astmes dw ?
149 Astarg dd ?
150 AstFrame ENDS
151
152 Public SGCHK001S,SGCHK001E
153 SGCHK001S label byte
154 DPBMes DB "DPB assertion failed: ",0
155 BUFMes DB "BUF assertion failed: ",0
156 SFTMes DB "SFT assertion failed: ",0
157 BlankSp DB " ",0
158 Colon DB ":",0
159
160 Msg DW ?
161
162 SGCHK001E label byte
163
164 Table segment
165 Extrn SectPDB:WORD, SectRef:WORD
166 Table ends
167
168 ; DPBCheck - validate a supposed DPB pointer
169 ; Inputs: Pushed arguments
170 ; Outputs: Message to screen
171 ; Registers modified: none
172
173 Procedure DPBCheck,NEAR
174 MOV Msg,OFFSET DOSGroup:DPBMes
175 SaveReg <BP>
176 MOV BP,SP
177 PUSHF
178 SaveReg <AX,BX,DS,SI,ES,DI>
179 LES DI,DPBHead
180 LDS SI,[BP].Astarg
181 DPBLoop:CMP DI,-1
182 JZ DPBNotFound
183 invoke PointComp
184 JZ DPBRet
185 LES DI,ES:[DI.dpb_next_dpb]
186 JMP DPBLoop
187 DPBNotFound:
188 MOV AX,[BP].Astmes
189 zfmt <"$s$x:$x $s\n">,<msg,ds,si,AX>
190 CLI
191 a: JMP a ; slam the door.
192 DPBRet: RestoreReg <DI,ES,SI,DS,BX,AX> ; Done:
193 POPF
194 RestoreReg <BP>
195 RET 6
196 EndProc DPBCheck
197
198 ; SFTCheck - validate a supposed SFT pointer
199 ; Inputs: Pushed arguments
200 ; Outputs: Message to screen
201 ; Registers modified: none
202
203 Procedure SFTCheck,NEAR
204 MOV Msg,OFFSET DOSGroup:SFTMes
205 SaveReg <BP>
206 MOV BP,SP
207 PUSHF
208 SaveReg <AX,BX,DS,SI,ES,DI>
209 LDS SI,[BP].Astarg
210 XOR BX,BX ; i = 0;
211 SFTLoop:
212 SaveReg <BX>
213 invoke SFFromSFN ; while ((d=SF(i)) != NULL)
214 RestoreReg <BX>
215 JC Sft1
216 invoke PointComp
217 JZ DPBRet ; goto Done;
218 SFTNext:INC BX ; else
219 JMP SFTLoop ; i++;
220 SFT1: LES DI,sftFCB
221 MOV BX,ES:[DI.sfCount]
222 LEA DI,[DI.sfTable]
223 SFT2:
224 invoke PointComp
225 DPBRETJ:JZ DPBRet
226 ADD DI,SIZE sf_entry
227 DEC BX
228 JNZ SFT2
229 ;
230 ; The SFT is not in the allocated tables. See if it is one of the static
231 ; areas.
232 ;
233 Context ES
234 MOV DI,OFFSET DOSGROUP:AUXSTACK - SIZE SF_ENTRY
235 Invoke PointComp
236 JZ DPBRet
237 MOV DI,OFFSET DOSGROUP:RenBuf
238 Invoke PointComp
239 JZ DPBRetj
240 DPBNotFoundJ:
241 JMP DPBNotFound
242 EndProc SFTCheck
243
244 ; BUFCheck - validate a supposed BUF pointer
245 ; Inputs: Pushed arguments
246 ; Outputs: Message to screen
247 ; Registers modified: none
248
249 Procedure BUFCheck,NEAR
250 MOV Msg,OFFSET DOSGroup:BUFMes
251 SaveReg <BP>
252 MOV BP,SP
253 PUSHF
254 SaveReg <AX,BX,DS,SI,ES,DI>
255 ;
256 ; CheckDisk - make sure that we are in the disk critical section...
257 ;
258 MOV AL,BYTE PTR ECritDisk
259 CMP AL,CritNOP
260 JZ CheckDone
261 MOV AX,CurrentPDB
262 CMP SectPDB + 2 * critDisk,AX
263 MOV AX,[BP].astmes
264 JZ CheckRef
265 zfmt <"$p: $x $s critDisk owned by $x\n">,<User_In_AX,AX,SectPDB+2*critDisk>
266 CheckRef:
267 CMP SectRef + 2 * critDisk,0
268 JNZ CheckDone
269 zfmt <"$p: $x $s critDisk ref count is 0\n">,<User_In_AX,AX>
270 CheckDone:
271
272 LDS SI,[BP].Astarg
273 LES DI,BUFFHead
274 BUFLoop:CMP DI,-1
275 JZ DPBNotFoundJ
276 invoke PointComp
277 JNZ BufNext
278 JMP DPBRet
279 BufNext:
280 LES DI,ES:[DI.buf_link]
281 JMP BUFLoop
282 EndProc BUFCheck
283
284 CODE ENDS
285 ELSE
286 SHARE ENDS
287 ENDIF
288 END