summaryrefslogtreecommitdiff
path: root/v4.0/src/DOS/SEGCHECK.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/DOS/SEGCHECK.ASM')
-rw-r--r--v4.0/src/DOS/SEGCHECK.ASM288
1 files changed, 288 insertions, 0 deletions
diff --git a/v4.0/src/DOS/SEGCHECK.ASM b/v4.0/src/DOS/SEGCHECK.ASM
new file mode 100644
index 0000000..992eac2
--- /dev/null
+++ b/v4.0/src/DOS/SEGCHECK.ASM
@@ -0,0 +1,288 @@
1; SCCSID = @(#)segcheck.asm 1.2 85/07/24
2TITLE SegCheck - internal consistency check
3NAME SegCheck
4
5.xlist
6INCLUDE DOSSYM.INC
7INCLUDE DEVSYM.INC
8
9ShareF = FALSE
10
11IF NOT SHAREF
12include dosseg.asm
13ENDIF
14.list
15
16AsmVars <NET, DEBUG>
17
18DEBUG = FALSE
19
20IF NOT SHAREF
21CODE SEGMENT BYTE PUBLIC 'CODE'
22ASSUME CS:DOSGroup
23ELSE
24SHARE SEGMENT BYTE PUBLIC 'SHARE'
25ASSUME CS:SHARE
26ENDIF
27
28DEBUG = FALSE
29
30BREAK <SegCheck - validate segments in MSDOS>
31
32Off Macro reg,var
33IF SHAREF
34 mov reg,offset var
35else
36 mov reg,offset DOSGroup:var
37endif
38endm
39
40zfmt MACRO fmts,args
41local a,b
42 PUSHF
43 PUSH AX
44 PUSH BP
45 MOV BP,SP
46If (not sharef) and (not redirector)
47Table segment
48a db fmts,0
49Table ends
50 MOV AX,OFFSET DOSGROUP:a
51else
52 jmp short b
53a db fmts,0
54if sharef
55b: mov ax,offset share:a
56else
57b: mov ax,offset netwrk:a
58endif
59endif
60 PUSH AX
61cargs = 2
62IRP item,<args>
63IFIDN <AX>,<item>
64 MOV AX,[BP+2]
65ELSE
66 MOV AX,item
67ENDIF
68 PUSH AX
69cargs = cargs + 2
70ENDM
71 invoke PFMT
72 ADD SP,Cargs
73 POP BP
74 POP AX
75 POPF
76ENDM
77
78segFrame Struc
79segbp DW ?
80segip DW ?
81segmes dw ?
82segtemp DW ?
83segFrame 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
95Procedure 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
106SegUseSS:
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>
114SegTestES:
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>
122SegTestDone:
123 RestoreReg <DX,CX,BX,AX>
124 POPF
125 RestoreReg <BP>
126 ret 4 ; release message, temp
127EndProc SegCheck
128
129
130IF NOT SHAREF
131I_need DPBHead,DWORD
132I_need BuffHead,DWORD
133I_need sftFCB,DWORD
134I_need AuxStack,BYTE
135I_need IOStack,BYTE
136I_need renbuf,byte
137I_need CurrentPDB,WORD
138I_need User_In_AX,WORD
139
140extrn ECritDisk:NEAR
141
142CritNOP label byte
143 RET
144
145AstFrame STRUC
146Astbp dw ?
147Astip dw ?
148Astmes dw ?
149Astarg dd ?
150AstFrame ENDS
151
152Public SGCHK001S,SGCHK001E
153SGCHK001S label byte
154DPBMes DB "DPB assertion failed: ",0
155BUFMes DB "BUF assertion failed: ",0
156SFTMes DB "SFT assertion failed: ",0
157BlankSp DB " ",0
158Colon DB ":",0
159
160Msg DW ?
161
162SGCHK001E label byte
163
164Table segment
165 Extrn SectPDB:WORD, SectRef:WORD
166Table ends
167
168; DPBCheck - validate a supposed DPB pointer
169; Inputs: Pushed arguments
170; Outputs: Message to screen
171; Registers modified: none
172
173Procedure 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
181DPBLoop:CMP DI,-1
182 JZ DPBNotFound
183 invoke PointComp
184 JZ DPBRet
185 LES DI,ES:[DI.dpb_next_dpb]
186 JMP DPBLoop
187DPBNotFound:
188 MOV AX,[BP].Astmes
189 zfmt <"$s$x:$x $s\n">,<msg,ds,si,AX>
190 CLI
191a: JMP a ; slam the door.
192DPBRet: RestoreReg <DI,ES,SI,DS,BX,AX> ; Done:
193 POPF
194 RestoreReg <BP>
195 RET 6
196EndProc DPBCheck
197
198; SFTCheck - validate a supposed SFT pointer
199; Inputs: Pushed arguments
200; Outputs: Message to screen
201; Registers modified: none
202
203Procedure 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;
211SFTLoop:
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;
218SFTNext:INC BX ; else
219 JMP SFTLoop ; i++;
220SFT1: LES DI,sftFCB
221 MOV BX,ES:[DI.sfCount]
222 LEA DI,[DI.sfTable]
223SFT2:
224 invoke PointComp
225DPBRETJ: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
240DPBNotFoundJ:
241 JMP DPBNotFound
242EndProc SFTCheck
243
244; BUFCheck - validate a supposed BUF pointer
245; Inputs: Pushed arguments
246; Outputs: Message to screen
247; Registers modified: none
248
249Procedure 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>
266CheckRef:
267 CMP SectRef + 2 * critDisk,0
268 JNZ CheckDone
269 zfmt <"$p: $x $s critDisk ref count is 0\n">,<User_In_AX,AX>
270CheckDone:
271
272 LDS SI,[BP].Astarg
273 LES DI,BUFFHead
274BUFLoop:CMP DI,-1
275 JZ DPBNotFoundJ
276 invoke PointComp
277 JNZ BufNext
278 JMP DPBRet
279BufNext:
280 LES DI,ES:[DI.buf_link]
281 JMP BUFLoop
282EndProc BUFCheck
283
284CODE ENDS
285ELSE
286SHARE ENDS
287ENDIF
288END