]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/DOS/IFS.ASM
5 include dosseg
.asm
;AN000;
7 CODE SEGMENT BYTE PUBLIC 'CODE' ;AN000;
8 ASSUME
CS:DOSGROUP
, SS:DOSGROUP
;AN000;
10 include dossym
.inc ;AN000;
11 include devsym
.inc ;AN000;
12 include doscntry
.inc ;AN000;
15 StackSize
= 180h
; gross but effective
17 i_need VERFLG
; verify status flag ;AN000;
18 i_need CNTCFLAG
; break status flag ;AN000;
19 i_need CPSWFLAG
; CP switch logic ON/OFF ;AN000;
20 I_need CURRENTPDB
,WORD ; Current process identifier ;AN000;
21 I_need HIGH_SECTOR
,WORD ;AN000;
22 I_need BUF_HASH_COUNT
,WORD ;AN000;
23 I_need FAILERR
,WORD ;AN000;
24 I_need USER_ID
,WORD ;AN000;
25 I_need CALLDEVAD
,DWORD ; ;AN000;
26 I_need SYSINITVAR
,WORD ;AN000;
27 I_need MYNAME
,16 ; NetBIOS name ;AN000;
28 I_need RETRYCOUNT
,WORD ; retry count ;AN000;
29 I_need COUNTRY_CDPG
,BYTE ;AN000;
30 i_need DAY
,BYTE ; date ;AN000;
31 i_need MONTH
,BYTE ;AN000;
32 i_need YEAR
,WORD ;AN000;
33 i_need CURBUF
,DWORD ;AN000;
34 i_need IFS_DRIVER_ERR
,WORD ;AN000;
35 i_need DOS34_FLAG
,WORD ; IFS function Read/Write flag ;AN000;
36 i_need Callback_SS
,WORD ; ;AN000;
37 i_need Callback_SP
,WORD ;AN000;
38 i_need SaveBX
,WORD ;AN000;
39 i_need Temp_Var
,WORD ;AN000;
40 i_need INDOS
,BYTE ;AN000;
41 i_need DskStack
,BYTE ;AN000;
42 i_need IOStack
,BYTE ;AN000;
43 i_need Callback_flag
,BYTE ;AN000;
58 extrn ABSDRD
:NEAR ;AN000;
59 extrn ABSDWRT
:NEAR ;AN000;
60 extrn READTIME
:NEAR ;AN000;
61 extrn CHECKFLUSH
:NEAR ;AN000;
62 extrn GETCURHEAD
:NEAR ;AN000;
65 ;******************************************************************************
67 ; * MODULE: IFS_DOSCALL
69 ; * FUNCTION: IFS to DOS function request dispatcher
71 ; * FUNCTION: This procedure dispatches the IFS DOS service requests
72 ; * by calling various DOS service routines
76 ; * CALL DWORD PTR IFS_DOSCALL@
81 ; * If AX = 0 No error
87 ; * INTERNAL REFERENCES: None
90 ; * EXTERNAL REFERENCES: STRATEGY, INTERRUPT, ABSDRD, ABSDWRT,
91 ; * FIND_SECTOR, MARK_SECTOR, WRITE_BUFFR,
92 ; * READ_BUFFR, WRITE_BUFFR, FREE_BUFFR,
93 ; * GET_DOS_INFO, FLUSH_BUFF
97 ; * REVISION HISTORY: New
99 ; * COPYRIGHT: "MS DOS IFS Function"
100 ; * "Version 1.00 (C) Copyright 1988 Microsoft Corporation"
101 ; * "Licensed Material - Program Property of Microsoft"
103 ; *************************************************************************
109 PROCEDURE IFS_DOSCALL
,FAR ;AN000;
110 assume
DS:NOTHING
,ES:NOTHING
;AN000;
115 INC CS:[INDOS
] ; in DOS ;AN000;
119 JNZ others2
; ;AN000;
120 DEC CS:[INDOS
] ; out DOS ;AN000;
124 JNZ not_stack
; ;AN000;
127 MOV SI,OFFSET DOSGROUP
:IOSTACK
;AN000;
128 MOV CX,stacksize
;AN000;
132 MOV CS:[Temp_Var
],DS; save ds for strcmp strcpy ;AN000;
135 assume
DS:DOSGROUP
;AN000;
136 INC [INDOS
] ; in DOS ;AN000;
137 PUSH CX ; save cx ;AN000;
138 PUSH DX ; save cx ;AN000;
139 MOV CX,SS ; cx=stack ;AN000;
140 MOV DX,CS ; cx=stack ;AN000;
141 CMP CX,DX ; dosgroup stack ? ;AN000;
142 POP DX ; save cx ;AN000;
143 POP CX ; restore cx ;AN000;
144 JZ withSS_SP
; yes ;AN000;
145 MOV [Callback_SS
],SS ;save SS:SP ;AN000;
146 MOV [Callback_SP
],SP ;AN000;
147 MOV [SaveBX
],BX ; ;AN000;
148 MOV BX,CS ; prepare system stack ;AN000;
150 MOV SP,OFFSET DOSGROUP
:DSKSTACK
;AN000;
151 MOV BX,[SaveBX
] ; ;AN000;
152 MOV [Callback_flag
],1 ;set flag ;AN000;
155 ASSUME
DS:NOTHING
;AN000;
156 ; OR [DOS34_FLAG],Force_I24_Fail ;AN000;
158 ; cmp ah,0 ; call Strategy routine ?? ;AN000;
159 ; jne dos_chk_ah1 ; jump if not ;AN000;
160 ; CALL STRATEGY ; else call strategy routine ;AN000;
161 ; jmp dos_exit ; then exit ;AN000;
163 ;Dos_Chk_Ah1: ;AN000;
164 ; cmp ah,1 ; call interrupt routine ;AN000;
165 ; jne dos_chk_ah2 ; jump if not ;AN000;
166 ; CALL INTERRUPT ; else call interrupt routine ;AN000;
167 ; jmp dos_exit ; then exit ;AN000;
169 ;Dos_Chk_Ah2: ;AN000;
171 ; jae Dos_Chk_Ah8 ;AN000;
172 ; mov High_Sector,si ; save HI sector word ;AN000;
173 ; mov dx,di ; save low sector ;AN000;
175 ; invoke FIND_DPB ; ds:si -> DPB ;AN000;
178 ; pop es ; es:bp -> DPB ;AN000;
179 ; pop ds ; DS:BX-->Input buffer ;AN000;
181 ; cmp ah,2 ; absolute read ?? ;AN000;
182 ; jne dos_chk_ah3 ; jump if not ;AN000;
184 ; invoke DSKREAD ; else do absolute read ;AN000;
185 ; jmp dos_exit ; then return ;AN000;
187 ;Dos_Chk_Ah3: ;AN000;
188 ; invoke DSKWRITE ; do absolute write ;AN000;
189 ; jmp dos_exit ; then exit ;AN000;
193 Dos_chk_ah32: ;AN000;
196 CALL GET_DOS_INFO
; else get DOS information ;AN000;
197 jmp SHORT dos_exit
;AN000; ;AN000;
199 mov DS,[Temp_Var
] ; restore DS ;AN000;
202 invoke strcmp
; string compare ;AN000;
203 jmp SHORT dos_exit
;AN000;
206 jne dos_error
;AN000;
207 invoke strcpy
; string copy ;AN000;
208 jmp SHORT dos_exit
;AN000;
216 AND [DOS34_FLAG
],No_Force_I24_Fail
;AN000;
217 DEC [INDOS
] ; exit DOS ;AN000;
218 CMP [Callback_flag
],0 ;from dosgroup
219 JZ noSS_SP
;yes ;AN000;
220 MOV [Callback_flag
],0 ; ;AN000;
222 MOV SP,CS:[Callback_SP
]; ;AN000;
223 MOV SS,CS:[Callback_SS
]; restore user's SS:SP ;AN000;
224 JMP SHORT DOSend
;AN000;
233 ENDPROC IFS_DOSCALL
;AN000;
239 ; ****************************************************************************
243 ; * FUNCTION: Call Strategy Routine
245 ; * FUNCTION: This procedure dispatches the IFS DOS service requests
246 ; * by calling various DOS service functions
248 ; * INPUT: ES:BX ---> Device Request Header
253 ; * OUTPUT: output of driver
255 ; * INTERNAL REFERENCES: None
258 ; * EXTERNAL REFERENCES: GETTHISDRV
262 ; * REVISION HISTORY: New
264 ; *************************************************************************
266 ;PROCEDURE STRATEGY,NEAR ;AN000;
268 ; INVOKE FIND_DPB ; get DPB from drive number ;AN000;
269 ; ; DS:SI-->DPB for drive ;AN000;
270 ; LDS DI,DS:[SI.DPB_Driver_Addr] ; get driver addres from DPB ;AN000;
271 ; MOV DX,WORD PTR [DI.SDEVSTRAT] ;get strategy routine address;AN000;
272 ;Driver_Call: ;AN000;
273 ; MOV WORD PTR [CALLDEVAD],DX ; save it ;AN000;
274 ; MOV WORD PTR [CALLDEVAD+2],DS ; ;AN000;
275 ; CALL DWORD PTR [CALLDEVAD] ; call strategy routine ;AN000;
277 ; RET ; return ;AN000;
279 ;ENDPROC STRATEGY ;AN000;
288 ; ****************************************************************************
290 ; * MODULE: INTERRUPT
292 ; * FUNCTION: This procedure calls the interrupt routine of the drive
293 ; * specified in the drive#.
295 ; * INPUT: AL = Drive #
298 ; * OUTPUT: output of driver
301 ; * INTERNAL REFERENCES: None
304 ; * EXTERNAL REFERENCES: FIND_DPB
308 ; * REVISION HISTORY: New
310 ; *************************************************************************
312 ;PROCEDURE INTERRUPT,NEAR ;AN000;
314 ; INVOKE FIND_DPB ; get DPB from drive number ;AN000;
315 ; LDS DI,DS:[SI.DPB_Driver_Addr] ; get driver addres from DPB ;AN000;
316 ; MOV DX,WORD PTR [DI.SDEVINT] ; get interrupt routine addrs;AN000;
317 ; JMP Driver_Call ;AN000;
319 ;ENDPROC INTERRUPT ;AN000;
328 ; ************************************************************************* *
330 ; * MODULE: Get_Dos_Info
332 ; * FUNCTION: Get DOS information
334 ; * INPUT: AL = Dos info code
336 ; * OUTPUT: Dos Information in registers
338 ; * INTERNAL REFERENCES: None
341 ; * EXTERNAL REFERENCES: READTIME, $GETEXTCNTRY
345 ; * REVISION HISTORY: New
347 ; *************************************************************************
349 PROCEDURE GET_DOS_INFO
,NEAR ;AN000;
351 cmp al,0 ; TIME and DATE ?? ;AN000;
354 Invoke ReadTime
; get time in CX:DX ;AN000;
356 push cx ; save time ;AN000;
359 MOV CX,[YEAR
] ;AN000;
361 MOV DX,WORD PTR [DAY
] ; fetch both day and month ;AN000;
363 pop bx ; bh = seconds bl = hundredths ;AN000;
364 pop ax ; ah = hour al = minutes ;AN000;
365 ; cx = year dh = month ;AN000;
366 jmp get_info_exit
;AN000;
369 chk_al1: ; Active process info ?? ;AN000;
371 jne chk_al2
; no, try next ;AN000;
372 MOV BX,[CurrentPDB
] ; BX = active process ID ;AN000;
373 mov DX,[User_ID
] ; User ID ;AN000;
374 jmp get_info_exit
; exit ;AN000;
378 ; cmp al,2 ; get CPSW info ?? ;AN000;
379 ; jne chk_al3 ; jump if not ;AN000;
380 ; MOV SI,OFFSET DOSGROUP:COUNTRY_CDPG ;AN000;
381 ; MOV BX,[SI.ccDosCodePage] ; get dos code page id in BX ;AN000;
382 ; MOV DL,CPSWFLAG ; get CP Switch status ;AN000;
383 ; jmp get_info_exit ; exit ;AN000;
387 ; cmp al,3 ; get CTRL BRK status ?? ;AN000;
388 ; jne chk_al4 ;AN000;
389 ; mov dl,CNTCFLAG ; DL = break status flag ;AN000;
390 ; jmp get_info_exit ; exit ;AN000;
394 ; cmp al,4 ; get Verify status ?? ;AN000;
396 ; mov dl,VERFLG ; DL = verify status flag ;AN000;
397 ; jmp get_info_exit ; exit ;AN000;
401 cmp al,5 ; Config.sys info ?? ;AN000;
404 mov si,OFFSET DOSGROUP
:SYSINITVAR
; DS:SI-->SysInitVar ;AN000;
407 lds si,[si].Sysi_SFT
; get SFT address ;AN000;
408 mov ax,[si].SFCount
; get number of files ;AN000;
409 lds si,[si].SFlink
; get next SFT table ;AN000;
410 cmp si,-1 ; end of table ;AN000;
412 add ax,[si].SFCount
; ;AN000;
414 mov es:[di].files
,ax ; save files= value ;AN000;
417 mov ax,[si].Sysi_MaxSec
; get maximum sector size ;AN000;
418 mov es:[di].secsize
,ax ; save files= value ;AN000;
419 mov ax,[si].Sysi_Keep
; ;AN000;
420 mov es:[di].fcbs2
,ax ; ;AN000;
421 lds si,[si].Sysi_FCB
; get FCB address ;AN000;
422 mov ax,[si].SFCount
; get number of fcbs ;AN000;
423 mov es:[di].fcbs1
,ax ; save fcbs= value ;AN000;
424 jmp get_info_exit
;AN000;
429 cmp al,6 ; get machine name ?? ;AN000;
430 jne chk_al7
; no, check next function ;AN000;
432 mov si,offset DOSGroup
:MyName
; DS:SI-->name string ;AN000;
433 ; ES:DI-->return buffer ;AN000;
434 add di,2 ; skip max return size ;AN000;
435 mov cx,15 ; name size ;AN000;
437 rep movsb ; copy machine name to return buffer;AN000;
438 xor al,al ; set 16th byte is 0 ;AN000;
440 jmp get_info_exit
; return ;AN000;
444 ; cmp al,7 ; get country information ?? ;AN000;
445 ; jne chk_al8 ; no, try next function ;AN000;
446 ; mov al,dl ; AL = info ID ;AN000;
447 ; mov bx,-1 ; select active code page ;AN000;
448 ; mov dx,-1 ; select active country ;AN000;
449 ; mov cx,-1 ; get all ;AN000;
450 ; INVOKE $getExtCntry ; get country info ;AN000;
451 ; jmp SHORT Get_Info_Exit ; exit ;AN000;
455 cmp al,8 ; get share retry count ?? ;AN000;
456 jne bad_param
; no, Bad parameter ;AN000;
457 mov bx,RetryCount
; BX = Share retry count ;AN000;
458 jmp SHORT Get_Info_Exit
; exit ;AN000;
460 Bad_Param: ; Bad parameter ;AN000;
463 Get_Info_Exit: ; exit ;AN000;
468 ENDPROC GET_DOS_INFO
;AN000;
477 ; ************************************************************************* *
479 ; * MODULE: $IFS_IOCTL
481 ; * FUNCTION: Handle IFS Driver IOCTL calls
483 ; * INPUT: AH = 6B function code
484 ; * AL = XX 00 = Drive IOCTL, 01 = Psudo device IOCTL
486 ; * BL = XX Device Number
487 ; * DS:DX Pointer to Buffer
490 ; * IF CARRY = 0 No Error
491 ; * IF CARRY = 1 Error
494 ; * INTERNAL REFERENCES: None
497 ; * EXTERNAL REFERENCES: INT 2F
501 ; * REVISION HISTORY: New
502 ; *************************************************************************
504 PROCEDURE $IFS_IOCTL
,NEAR ;AN000;
507 MOV AX,(multnet
SHL 8) OR 47 ; pass control to IFS Func ;AN000;
511 TRANSFER SYS_RET_OK
; return ;AN000;
514 transfer SYS_RET_ERR
; error return ;AN000;
516 ENDPROC $IFS_IOCTL
;AN000;