page 66,132 ; 11. 6. 91 vypocet poctu pruchodu smyckou pred vysilanim ; 23. 5. 91 úprava zavírání souborů s ohledem na duplicated handle ; 5. 5. 91 pri dotazu serveru na otevrene soubory se nealokuje DOS pista struc ; popis jednotky v Pištově tabulce p_typ db ? ; 7 shr p_fnum db ? ; číslo vzdálené jednotky p_saddr dw ? ; adresa serveru x dw ? ; specres p_dsize dw ? ; velikost disku p_access db ? ; 0 R/O, 1 R/W, 2 SYS p_share db ? ; byte; (* 0 1R/W, 1 R/O nebo 1R/W, 2 R/O a 1R/W *) xx dw ? ; fsizepočet sektorů fyz. jednotky xxx dw ? ; headn pocet hlav fyzicke jednotky xxxx dw ? ; počitadlo zpráv pro RDR pista ends tmsg struc ; struktura zpráv m_num db ? ; číslo (typ) zprávy m_typ db ? ; subtyp, pro RDR příkaz m_cnt dw ? ; číslování - virt. spoj m_fnum db ? ; číslo vzdálené jednotky m_psp dw ? ; PSP žádajícího procesu (programu) m_err db ? ; odpověď DOSu m_data db 540 dup (?) ; text zprávy tmsg ends tscb struc s_reply db ? s_sem db ? s_ack db 0 s_tmout db 10 s_to dw ? s_len dw ? s_buf dd ? tscb ends trcb struc r_reply db ? r_sem db ? r_min db 14 r_max db 14 r_rcvd db ? r_tmout db ? r_from dw ? r_len dw ? r_buf dd ? trcb ends linint equ 48H l_send equ 1 ; vyšli, nastav příznak l_getb equ 4 ; vypůjčení bufferu l_bckb equ 5 ; vrácení bufferu l_req equ 10H ; žádost o trvalý příjem l_recvb equ 9 ; přijmi do bufferu ovladače l_recv equ 11H ; přijmi l_rbck equ 0BH ; vrať buffer po příjmu le_busy equ 0FFH ; vyžádaný příkaz se provádí le_formal equ 1 ; formální chyba požadavku le_alr_rec equ 2 ; uvedený typ zpráv již někdo přijímá le_norr equ 3 ; příliš mnoho požadavků na příjem le_inv_rr equ 4 ; RCB nebyl uveden ve funkci 10H le_maxl equ 5 ; v SCB je uvedena chybná délka zprávy le_noc equ 6 ; příliš mnoho požadavků na vysilani le_noack equ 7 ; vyžádané potvrzení nepřišlo v časovém limitu le_trunc equ 8 ; přijatá zpráva je zkrácena, malý buffer le_tmout equ 9 ; time_out pro vysílání nebo příjem kerint equ 49H k_ini equ 13 ; přiděl a inicializuj objekt k_wait equ 4 ; čekej na příznak if tedos ; verze pro TE DOS DOS segment at 0 ; proměnné operačního systému org 1AH DOS_retries dw ? ; povolený počet opakování org 36h DOS_seclen dw ? ; délka sektoru org 3CH DOS_@drive_info dd ? ; seznam informací o logických jednotkách org 40H DOS_@FCB_table dd ? org 2B3H DOS_mach_name db 16 DUP(?) ; jméno uzlu org 2CFH DOS_indos db ? ; DOS activity flag org 2D1H DOS_err_locus db ? DOS_err_code dw ? ; kód chyby DOS_err_sugg dw ? ; možné reakce na chybu org 2DAH DOS_@DTA dd ? ; PSP aktivního procesu DOS_@PSP dw ? org 2F7H DOS_err_allow db ? ; povolené reakce na krit. chybu ; AH při vyvolání 24 org 4FAH DOS_filsea_attr db ? ; atributy pro hledání org 538H DOS_@def_drv db 1 dup (?) org 548H DOS_@tmp dw ? ; vzor pro hledání DOS_@tmp2 dw ? DOS ends else ; normalni MS DOS DOS segment at 0 ; proměnné operačního systému org 1AH DOS_retries dw ? ; povolený počet opakování org 36h DOS_seclen dw ? ; délka sektoru org 3CH DOS_@drive_info dd ? ; seznam informací o logických jednotkách org 40H DOS_@FCB_table dd ? org 2B3H DOS_mach_name db 16 DUP(?) ; jméno uzlu org 2CFH DOS_indos db ? ; DOS activity flag org 2D1H DOS_err_locus db ? DOS_err_code dw ? ; kód chyby DOS_err_sugg dw ? ; možné reakce na chybu org 2DAH DOS_@DTA dd ? ; PSP aktivního procesu DOS_@PSP dw ? org 2F7H DOS_err_allow db ? ; povolené reakce na krit. chybu ; AH při vyvolání 24 org 508H DOS_filsea_attr db ? ; atributy pro hledání org 53AH DOS_@def_drv db 1 dup (?) org 54AH DOS_@tmp dw ? ; vzor pro hledání DOS_@tmp2 dw ? DOS ends endif DOS52 segment at 52H org 4 DOS52_@filtab dd ? DOS52 ends de_nomore equ 12H ; no more files cr equ 0DH lf equ 0AH wrstr equ 9 setint equ 25H get_ver equ 30H stay equ 31H getint equ 35H close equ 3EH exit equ 4CH get_list equ 52H get_dos equ 1203H norm_path_sep equ 4 debbeg macro msg if debug push si mov si,offset &msg call debbegs pop si endif endm debchr macro chr if debug ifnb mov al,chr endif call debchrs endif endm debnxt macro str push si if debug ifnb mov si,str endif endif call debnxts pop si endm debhexb macro chr if debug ifnb mov al,chr endif call debhexbs endif endm cseg segment 'code' assume cs:cseg,ds:cseg if debug debpos dw ? debbegs proc far ; v DS:SI adresa řetězu push ax push cx push di push ds push es push si mov ax,video ; nejprve roluj obrazovku mov ds,ax mov es,ax mov si,160 mov di,0 mov cx,24 rol1: push cx mov cx,160 cld rep movsb pop cx loop rol1 mov al,20H ; spodní řádek vymezerovat mov cx,160 rep stosb pop si push cs pop ds mov di,160*24 pis1: lodsb ; probírej řetězec, dokud není NUL or al,al jz debhdr9 mov ah,7 stosw jmp short pis1 debhdr9:mov debpos,di pop es pop ds pop di pop cx pop ax ret debbegs endp debchrs proc far ; znak z AL vypiš na obrazovku push ax push di push es mov di,video mov es,di mov di,cs:debpos mov ah,7 stosw mov cs:debpos,di pop es pop di pop ax ret debchrs endp debnxts proc far push ax push si cld dstr1: lodsb or al,al jz dstr9 call debchrs jmp short dstr1 dstr9: pop si pop ax ret debnxts endp hextab db '0123456789ABCDEF' debhexbs proc far ; hodnotu AL zobraz na obrazovce push ax push bx push ax shr al,1 shr al,1 shr al,1 shr al,1 mov bl,al mov bh,0 mov al,cs:hextab[bx] call debchrs pop bx and bl,0FH mov bh,0 mov al,cs:hextab[bx] call debchrs pop bx pop ax ret debhexbs endp m1100 db '1100 kontrola instalace ',0 ; ok m1101 db '1101,02 zrušení adresáře ',0 ; ok m1103 db '1103,04 založení adresáře ',0 ; ok m1105 db '1105 existence adresáře ',0 ; ok m1106 db '1106 zavři soubor ',0 ; ok m1107 db '1107 commit ',0 ; !!! m1108 db '1108 čti ze souboru ',0 ; ok m1109 db '1109 zapiš do souboru ',0 ; ok m110A db '110A lock ',0 ; ok m110B db '110B unlock ',0 ; ok m110C db '110C informace o jednotce',0 ; ok m110D db '110D,0E nastav atributy souboru ',0 ; ok m110F db '110F,10 zjisti atributy souboru ',0 ; ok m1111 db '1111,12 přejmenuj soubor ',0 ; ok m1113 db '1113,14 vymaž soubor ',0 ; ok m1115 db '1115,16 otevři soubor ',0 ; ok m1117 db '1117,18 vytvoř/přepis soubor ',0 ; ok m1119 db '1119 stc - no more',0 ; ok m111A db '111A stc - no more?',0 ; ok m111B db '111B find first ',0 ; ok m111C db '111C hledej další adresářovou položku',0 ; ok m111D db '111D zavři všechny soubory',0 ; !!!!! m111E db '111E DOS 5E přesměrování',0 ; ---- m111F db '111F DOS 5Fnastavení tiskáren',0 ; ---- m1120 db '1120 DOS 0D ?, flush disk buffers ?',0 m1121 db '1121 seek ',0 ; ok m1122 db '1122 init kritické sekce',0 ; ---- m1123 db '1123 device ? ',0 ; ---- m1124 db '1124 stav obsluhy tiskáren ?',0 ; ---- m1125 db '1125 DOS 5D internal, AL=',0 ; ---- m1126 db '1126 zobraz znak',0 ; OK m1127 db '1127 dodej segment redirektoru',0 ; OK m1199 db 'dalsi',0 m2F05 db '2F05 dodej text kritické chyby',0 m21 db '21',0 endif drvhdr dd 0 ;0FFFFFFFFH ; další driver ; dw 0200H ; atributy - block device, IOCTL db 0,10H dw 0 ; strategy entry point dw 0 ; interrupt entry point db 'FELANRDR' ;data_0087 db ? max_sec_len dw ? save_es dw ? ; ES - ukazuje na driver ? def_drv db ? ; jednotka access db ? curop db ? ; právě prováděná operace 0 r, 1 w pistab dd ? ; adresa Pištovy tabulky msgcnt dw ? ; počítadlo zpráv prizn db ? ; příznak pro komunikaci scb tscb <> rcb trcb <> rpt_list db 4,5,6,7,10,15,20,20,20,20,25,25,25,25,30,30,30,30,30,30,30,30,30,0 delay dw ? msgs tmsg <> msgr tmsg <> mt_ff equ 20 ; find first mt_fn equ 21 ; find next mt_dev equ 22 ; drive info mt_dir equ 23 ; existence adresáře mm_dir equ 24 ; zruseni a zalozeni adresare mm_ga equ 25 ; zjisti atribut mm_sa equ 26 ; nastav atribut mm_rn equ 27 ; prejmenuj mm_de equ 28 ; zrus soubor mm_of equ 29 ; otevri soubor mm_cf equ 30 ; vytvoř/přepiš soubor mm_ch equ 31 ; close handle mm_lk equ 32 ; lock/unlock mm_sk equ 33 ; seek mm_rh equ 34 ; read handle mm_rw equ 35 ; write handle mm_cm equ 36 ; commit file mm_stat equ 37 ; muj stav inimsg: ; v AL je subtyp budoucí zprávy mov ss:DOS_err_code,0 push ds push cs pop ds ; při výstupu ES:DI ukazuje na data mov msgs.m_num,3 mov msgs.m_typ,al ; nastaví se typ, počitadlo,psp mov ax,msgcnt mov msgs.m_cnt,ax mov ax,ss:DOS_@psp mov msgs.m_psp,ax push cs pop es mov word ptr scb.s_buf,offset msgs mov word ptr rcb.r_buf,offset msgr mov ax,ds mov word ptr scb.s_buf+2,ax mov word ptr rcb.r_buf+2,ax lea di,msgs.m_data pop ds ret ;chybicka: ; or al,'0' ; mov ah,0EH ; mov bl,7 ; int 10H ; hlt vysli_prijmi: push ds push cs pop ds vys: mov cx,delay loop $ cli ; odeber případné zprávy mov al,rcb.r_rcvd cmp al,0 jz vys1 mov ah,l_recv lea bx,rcb push es push cs pop es int linint sti pop es jmp short vys vys1: lea si,rpt_list znovu: cmp byte ptr [si],0 ; mohu ještě opakovat ? jz tout sti lea bx,scb push es push cs pop es mov al,prizn mov scb.s_sem,al mov ah,l_send int linint pop es ; jc chybicka ; asi chybné parametry mov al,prizn mov ah,k_wait int kerint lea bx,rcb ; nějak se odvysílalo, je mi to jedno push es push ds pop es mov al,byte ptr [si]; time out pro příjem mov [bx].r_tmout,al mov [bx].r_len,size msgr inc si mov ah,l_recv int linint pop es jnc prislo jmp znovu prislo: ; shoda subtypu a čísla ? mov al,msgr.m_typ mov cx,msgr.m_cnt; při neshodě začni od počátku cmp cx,msgcnt jne vys cmp al,msgr.m_typ jne vys inc msgcnt clc pop ds mov ss:DOS_err_code,0 ret tout: pop ds ; mov ax,cs:save_es ; mov word ptr ss:51cH,ax ; mov word ptr ss:51aH,bp mov ss:DOS_err_code,15H ; drive not ready mov ss:DOS_err_sugg,0505H ; třída a doporučení mov ss:DOS_err_locus,03 ; network mov ss:DOS_err_allow,18H; 00111110B ;18H ; retry,fail mov di,2; ; 2 je posunuty err code - not ready push cs pop bp lea si,drvhdr mov ah,18H; 00111110B ;ign ne, retr, fail, data area or ah,cs:curop ; r/o, r/w mov al,cs:def_drv push ax mov ax,1206H ; vyvolej krit. chybu int 2FH ; v AL odpoved if debug push ax or al,30H debchr al pop ax endif ; 0 abo, 1 retry, 2 ign, 3 fail pop si ; srovnat zasobnik cmp al,1 je retr jb abo cmp al,3 jne ign jmp abo retr: mov ax,cs:msgs.m_cnt mov cs:msgcnt,ax jmp vysli_prijmi ign: mov cs:msgr.m_err,0 inc cs:msgcnt clc ret abo: mov ss:DOS_err_code,15H ; drive not ready mov ss:DOS_err_sugg,0505H ; třída a doporučení mov ss:DOS_err_locus,03 ; network inc cs:msgcnt stc ret get_info2: push ds push cs pop ds push bx jmp short gi1 get_info: ; na základě DOS_@def_drv dodá informace o jednotce push ds ; pro kontroly i vysílání push cs pop ds push bx mov ax,word ptr ss:DOS_@def_drv gi1: sub ax,word ptr ss:DOS_@drive_info ; 32C9 mov bl,51H div bl mov cs:def_drv,al ; ser_addr: ; AL jednotka, dodej adresu serveru do SCB xor ah,ah shl ax,1 shl ax,1 shl ax,1 shl ax,1 lds bx,pistab add bx,ax mov ax,[bx].p_saddr xchg ah,al mov cs:scb.s_to,ax mov al,[bx].p_fnum mov cs:msgs.m_fnum,al mov al,[bx].p_access mov cs:access,al pop bx pop ds ret get_finfo: ; vybrat z sysFCB mov ax,es:[di+19H] mov cs:scb.s_to,ax mov al,es:[di+1BH] mov cs:msgs.m_fnum,al ret INT_24H_entry: mov al,3 INT_23H_entry: iret old_2F dd ? INT_2FH_entry: cmp ah,11H jne I2F_1 jmp INT_2F_11 I2F_1: cmp ah,05H jne I2F_2 jmp INT_2F_05 I2F_2: jmp cs:old_2F INT_2F_05: ; Dodá text chyby debbeg m2F05 iret I2F11_param dw ? I2F11_retaddr dd ? I2F11_retf dw offset ret_retf INT_2F_11: push es pop cs:save_es pop word ptr cs:I2F11_retaddr pop word ptr cs:I2F11_retaddr+2 pop cs:I2F11_param ; flags ; mov cs:data_0087,6 xchg ax,bx ; číslo služby cmp bl,27H ; příliš vysoké číslo služby ? jle I2F_shl mov bl,0 I2F_shl:shl bl,1 xor bh,bh pop cs:I2F11_param ; parametr push cs:I2F11_param push word ptr cs:I2F11_retaddr+2 push word ptr cs:I2F11_retaddr push word ptr cs:I2F11_retf push word ptr cs:I2F11_table[bx] xchg ax,bx mov ax,cs:I2F11_param sti retn ret_retf: ; pro závěrečný návrat retf I2F11_table: dw offset I2F_1100 ; OK instalace dw offset I2F_1101 ; OK zruseni adresare dw offset I2F_1102 ; OK zruseni adresare dw offset I2F_1103 ; OK zalozeni adresare dw offset I2F_1104 ; OK zalozeni adresare dw offset I2F_1105 ; OK existence adresare dw offset I2F_1106 dw offset I2F_1107 dw offset I2F_1108 dw offset I2F_1109 dw offset I2F_110A dw offset I2F_110B dw offset I2F_110C ; OK informace o jednotce dw offset I2F_110D ; OK nastav atributy dw offset I2F_110E ; OK nastav atributy dw offset I2F_110F ; OK zjisti atributy dw offset I2F_1110 ; OK zjisti atributy dw offset I2F_1111 ; OK rename dw offset I2F_1112 ; OK rename dw offset I2F_1113 ; OK delete dw offset I2F_1114 ; OK delete dw offset I2F_1115 dw offset I2F_1116 dw offset I2F_1117 dw offset I2F_1118 dw offset I2F_1119 dw offset I2F_111A dw offset I2F_111B ; OK find first dw offset I2F_111C ; OK find next dw offset I2F_111D dw offset I2F_111E dw offset I2F_111F dw offset I2F_1120 dw offset I2F_1121 dw offset I2F_1122 dw offset I2F_1123 ; STC dw offset I2F_1124 dw offset I2F_1125 dw offset I2F_1126 ; dispchar dw offset I2F_1127 ; dodej segment copy: mov al,ss:[bx] ; kopíruje ASCIZ do zprávy inc bx debchr stosb or al,al jnz copy ret ; *************** kontrola oprávněnosti přístupu **************** rop: mov cs:curop,0 ret test_sys: mov cs:curop,1 cmp cs:access,2 jne test_no clc ret test_no:stc ret test_rw: mov cs:curop,1 cmp cs:access,0 je test_no clc ret acc_err: ; nemám právo provést operaci, vstup skokem mov ss:DOS_err_code,5H ; acc den. mov ss:DOS_err_sugg,0307H ; třída a doporučení mov ss:DOS_err_locus,03 ; network mov ax,5 stc ret ;****************************************************************************** ; Interrupt 2F/1100 ; Kontrola instalace obsluhy INT 2F/11 ;****************************************************************************** I2F_1100: debbeg m1100 mov al,0FFH ; už je instalováno retn ;****************************************************************************** ; Interrupt 2F/1101, 1102 ; DOS 3A - Remove Directory ; ;****************************************************************************** I2F_1101: I2F_1102: debbeg m1101 mov byte ptr cs:msgs.m_data,3AH ; DOS remove DIR rd1: call get_info call test_sys ; mám právo ? jnc rd11 jmp acc_err rd11: mov al,mm_dir call inimsg inc di mov bx,ss:DOS_@tmp add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,5 ; denied jc rd21 mov al,cs:msgr.m_err rd21: or al,al jnz rd3 clc ret rd3: stc ret ;****************************************************************************** ; Interrupt 2F/1103, 1104 ; DOS 39 - Make Directory ;****************************************************************************** I2F_1103: I2F_1104: debbeg m1103 mov byte ptr cs:msgs.m_data,39H ; DOS make DIR jmp rd1 ;****************************************************************************** ; Interrupt 2F/1105 ; Chnage Directory, def_dev_netw,, ... ? ; volá se pro nastaveni i zjisteni ; ES:DI ukazuje na adresář v Drive info ;****************************************************************************** I2F_1105: debbeg m1105 call rop ; čtecí operace call get_info mov al,mt_dir call inimsg mov bx,ss:DOS_@tmp ; je to zde dobře ? add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,3 jc td2 ; not found mov al,cs:msgr.m_err td2: or al,al jnz l_dirs1 clc ret l_dirs1:stc ret ;****************************************************************************** ; Interrupt 2F/1106 ; Zavírání souboru ES:DI na sysFCB ;****************************************************************************** I2F_1106: debbeg m1106 push es push di call rop call get_finfo ; decrement mov ax,1208H int 2FH pop di pop es mov ax,word ptr es:[di] ; násobnost otevření předat na server inc ax jnz ch2 inc ax ch2: push ax if debug debhexb ah pop ax push ax debhexb al endif mov al,mm_ch call inimsg pop ax stosw sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,6 jc ch3 mov al,cs:msgr.m_err ch3: or al,al jz ch4 stc ret ch4: clc ret ;****************************************************************************** ; Interrupt 2F/1107 ; Commit remote file ;****************************************************************************** I2F_1107: debbeg m1107 call rop call get_finfo mov al,mm_cm call inimsg sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,6 jc cm3 mov al,cs:msgr.m_err cm3: or al,al jz cm4 stc ret cm4: clc ret ;****************************************************************************** ; Interrupt 2F/1108 ; DOS Read Handle: ES:DI adresa souboru, CX kolik přečíst ; DTA buffer ; return CX kolik se precetlo ;****************************************************************************** rw_pos dd ? ; aktuální pozice v souboru rw_jeste dw ? ; kolik ještě přenést rw_kam dd ? ; aktuální pozice v DTA rw_fcb dd ? ; adresa sys FCB rw_bylo dw ? ; kolik se již přeneslo I2F_1108: debbeg m1108 call rop push ds push cs pop ds mov rw_jeste,cx mov ax,word ptr es:[di+15H] mov word ptr rw_pos,ax mov ax,word ptr es:[di+17H] mov word ptr rw_pos+2,ax mov ax,word ptr ss:DOS_@DTA mov word ptr rw_kam,ax mov ax,word ptr ss:DOS_@DTA+2 mov word ptr rw_kam+2,ax mov word ptr rw_fcb,di mov ax,es mov word ptr rw_fcb+2,ax mov rw_bylo,0 ; dosud se zpracovalo call get_finfo mov al,mm_rh call inimsg rh_1: inc msgcnt mov ax,msgcnt mov msgs.m_cnt,ax mov ax,rw_jeste ; vlastní smyčka or ax,ax jz rh_10 cmp ax,512 ; vejde se do jedné zprávy ? jc rh_2 mov ax,512 rh_2: mov word ptr msgs.m_data+4,ax mov ax,word ptr rw_pos mov word ptr msgs.m_data,ax mov ax,word ptr rw_pos+2 mov word ptr msgs.m_data+2,ax mov scb.s_len,offset msgs.m_data+7-offset msgs call vysli_prijmi jc rh_c mov al,msgr.m_err or al,al jnz rh_c mov cx,word ptr msgr.m_data add rw_bylo,cx cmp cx,word ptr msgs.m_data+4 je rh24 mov rw_jeste,0 jmp rh25 rh24: sub rw_jeste,cx rh25: add word ptr rw_pos,cx adc word ptr rw_pos+2,0 les di,rw_kam lea si,msgr.m_data+2 cld rep movsb push cs pop ds mov word ptr rw_kam,di mov ax,es mov word ptr rw_kam+2,ax jmp rh_1 rh_10: les di,rw_fcb mov ax,word ptr rw_pos mov es:[di+15H],ax mov ax,word ptr rw_pos+2 mov es:[di+17H],ax mov ax,0 mov cx,rw_bylo clc pop ds ret rh_c: mov ah,0 mov ss:DOS_err_code,ax mov cx,0 stc pop ds ret ;****************************************************************************** ; Interrupt 2F/1109 ; DOS Write Handle: ES:DI adresa souboru, CX kolik zapsat ; DTA buffer ; return CX kolik se zapsalo ;****************************************************************************** no_rw: mov ax,13H mov ss:DOS_err_code,ax stc pop ds ret I2F_1109: debbeg m1109 push ds push cs pop ds mov cs:curop,1 mov rw_jeste,cx mov ax,word ptr es:[di+15H] mov word ptr rw_pos,ax mov ax,word ptr es:[di+17H] mov word ptr rw_pos+2,ax mov ax,word ptr ss:DOS_@DTA mov word ptr rw_kam,ax mov ax,word ptr ss:DOS_@DTA+2 mov word ptr rw_kam+2,ax mov word ptr rw_fcb,di mov ax,es mov word ptr rw_fcb+2,ax mov rw_bylo,0 ; dosud se zpracovalo call get_finfo call test_rw jc no_rw mov al,mm_rw call inimsg wh_1: inc msgcnt mov ax,msgcnt mov msgs.m_cnt,ax mov cx,rw_jeste ; vlastní smyčka or cx,cx jz wh_10 cmp cx,512 ; vejde se do jedné zprávy ? jc wh_2 mov cx,512 wh_2: mov word ptr msgs.m_data+4,cx mov ax,word ptr rw_pos mov word ptr msgs.m_data,ax mov ax,word ptr rw_pos+2 mov word ptr msgs.m_data+2,ax mov scb.s_len,offset msgs.m_data+520-offset msgs push cs pop es lea di,msgs.m_data+6 lds si,rw_kam cld rep movsb push cs pop ds wh_21: call vysli_prijmi jc wh_c mov al,msgr.m_err or al,al jnz wh_c mov cx,word ptr msgr.m_data add rw_bylo,cx cmp cx,word ptr msgs.m_data+4 je wh24 mov rw_jeste,0 jmp wh25 wh24: sub rw_jeste,cx wh25: add word ptr rw_pos,cx adc word ptr rw_pos+2,0 add word ptr rw_kam,cx adc word ptr rw_kam+2,0 jmp wh_1 wh_10: les di,rw_fcb mov ax,word ptr rw_pos mov es:[di+15H],ax mov ax,word ptr rw_pos+2 mov es:[di+17H],ax call setsize mov ax,0 mov cx,rw_bylo clc pop ds ret ; chyba serveru wh_c: mov ah,0 mov ss:DOS_err_code,ax mov cx,rw_bylo stc pop ds ret setsize: ; je li offset vetsi nez soubor pushf ; zmen velikost souboru mov ax,word ptr es:[di+13H] cmp ax,word ptr es:[di+17H] jc sset mov ax,word ptr es:[di+11H] cmp ax,word ptr es:[di+15H] jc sset eset: popf ret sset: mov ax,word ptr es:[di+15H] mov word ptr es:[di+11H],ax mov ax,word ptr es:[di+17H] mov word ptr es:[di+13H],ax jmp short eset ;****************************************************************************** ; Interrupt 2F/110A ; DOS Lock ; ES:DI adresa souboru, CX:DX offset ; SI:AX(stack) velikost oblasti ;****************************************************************************** I2F_110A: push es push di push ax call rop debbeg m110A mov ax,5C00H lk1: mov word ptr cs:msgs.m_data,ax pop ax mov word ptr cs:msgs.m_data+2,ax mov word ptr cs:msgs.m_data+4,si mov word ptr cs:msgs.m_data+6,dx mov word ptr cs:msgs.m_data+8,cx call get_finfo mov al,mm_lk call inimsg add di,0AH sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,1 jc lk3 mov al,cs:msgr.m_err lk3: or al,al jz lk4 pop di pop es stc ret lk4: pop di pop es clc ret ;****************************************************************************** ; Interrupt 2F/110B ; DOS Unlock ; ES:DI adresa souboru, CX:DX offset ; SI:AX(stack) velikost oblasti ;****************************************************************************** I2F_110B: push es push di push ax call rop debbeg m110B mov ax,5C01H jmp lk1 ;****************************************************************************** ; Interrupt 2F/110C 99F ; Dodej informace o jednotce: ; AH FAT ID byte (typ jednotky) ; AL počet sektorů na cluster ; BX celkový počet clusterů ; CX velikost sektoru ; DX počet volných clusterů ; ;Vstup ES:DI - drive info ;****************************************************************************** I2F_110C: debbeg m110C mov ax,di call rop call get_info2 mov al,mt_dev call inimsg mov al,cs:def_drv stosb sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,1 jc dev2 mov ax,word ptr cs:msgr.m_data mov bx,word ptr cs:msgr.m_data+2 mov cx,word ptr cs:msgr.m_data+4 mov dx,word ptr cs:msgr.m_data+6 clc ret dev2: stc ret ;****************************************************************************** ; Interrupt 2F/110D, 110E ; set file attributes dle AX ;****************************************************************************** I2F_110D: I2F_110E: debbeg m110D push ax call get_info call test_rw jnc sa0 pop ax jmp acc_err sa0: mov al,mm_sa call inimsg pop ax stosw mov bx,ss:DOS_@tmp add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,5 ; denied jc sa2 mov al,cs:msgr.m_err sa2: or al,al jnz sa3 mov ax,word ptr cs:msgr.m_data clc ret sa3: stc ret ;****************************************************************************** ; Interrupt 2F/110F, 1110 ; Get file attributes ? ; Vystup AX - atributy ;****************************************************************************** I2F_110F: I2F_1110: debbeg m110F call rop call get_info mov al,mm_ga call inimsg mov bx,ss:DOS_@tmp add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,2 jc ga1 mov al,cs:msgr.m_err ga1: or al,al jnz qa3 mov ax,word ptr cs:msgr.m_data clc ret qa3: stc ret ;****************************************************************************** ; Interrupt 2F/1111, 1112 ; Rename file ; ;****************************************************************************** I2F_1111: I2F_1112: debbeg m1111 call get_info call test_rw jnc re0 jmp acc_err re0: mov al,mm_rn call inimsg mov bx,ss:DOS_@tmp add bx,2 call copy mov bx,ss:DOS_@tmp2 add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,2 jc re2 mov al,cs:msgr.m_err re2: or al,al jnz rn3 clc ret rn3: stc ret ;****************************************************************************** ; Interrupt 2F/1113, 1114 ; Delete file ; ;****************************************************************************** I2F_1113: I2F_1114: debbeg m1113 call get_info call test_rw jnc de0 jmp acc_err de0: mov al,mm_de call inimsg mov bx,ss:DOS_@tmp add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,2 jc de2 mov al,cs:msgr.m_err de2: or al,al jnz de3 clc ret de3: stc ret ;****************************************************************************** ; Interrupt 2F/1115, 1116 ; Open handle ; ES:DI na sysFCB, al rezim, jmeno a drive jako obvykle ;****************************************************************************** I2F_1115: I2F_1116: debbeg m1115 push es push di mov byte ptr cs:msgs.m_data,al call rop call get_info oh1: mov al,mm_of call inimsg mov bx,ss:DOS_@tmp add bx,2 inc di call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,2 jc oh3 mov al,cs:msgr.m_err oh3: or al,al jz oh4 stc pop di pop es ret oh4: pop di pop es push ds push cs pop ds mov si,offset msgr.m_data+1 ; ES:DI na sysFCB, DS:SI FCB ze zprávy ; driver ? mov ax,cs:scb.s_to mov word ptr es:[di+19H],ax mov al,byte ptr cs:msgr.m_data mov byte ptr es:[di+1BH],al ; to je pro moji adresaci mov ax,word ptr [si+2] mov word ptr es:[di+2],ax ; rezim otevření mov al,byte ptr [si+4] mov byte ptr es:[di+4],al ; atributy mov ax,8040H or al,cs:def_drv mov word ptr es:[di+5],ax ; network mov ax,word ptr [si+0DH] ; datum a čas mov word ptr es:[di+0DH],ax mov ax,word ptr [si+0FH] mov word ptr es:[di+0FH],ax mov ax,word ptr [si+11H] ; velikost mov word ptr es:[di+11H],ax mov ax,word ptr [si+13H] mov word ptr es:[di+13H],ax xor ax,ax mov word ptr es:[di+15H],ax ; offset mov word ptr es:[di+17H],ax mov ax,ss:DOS_@PSP ; PSP mov es:[di+31H],ax push si push di oh5: add si,20H add di,20H mov cx,11 rep movsb pop di pop si pop ds mov ax,120CH int 2FH clc mov ax,0 ret ;****************************************************************************** ; Interrupt 2F/1117, 1118 ; Create/Rewrite file ; ; ES:DI sysFCB, AL atribut ; AH=0 3C rewrite ; AH=1 5B create, jinak jako obvykle ;****************************************************************************** I2F_1117: I2F_1118: debbeg m1117 push es push di mov word ptr cs:msgs.m_data,ax call get_info call test_rw jnc cf1 pop di pop es jmp acc_err cf1: mov al,mm_cf call inimsg mov bx,ss:DOS_@tmp add bx,2 inc di inc di call copy sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov al,5 jc cf3 mov al,cs:msgr.m_err cf3: or al,al jz cf4 stc pop di pop es ret cf4: jmp oh4 ;****************************************************************************** ; Interrupt 2F/1119 ;****************************************************************************** I2F_1119: debbeg m1119 mov ax,3 stc ret ;****************************************************************************** ; Interrupt 2F/111A ;****************************************************************************** I2F_111A: debbeg m111A mov ax,3 stc ret ;****************************************************************************** ; Interrupt 2F/111B ; Find first: atributy z DOS_filsea_attr, @tmp je adresa vzoru ; V odpovědi roztáhnout jméno souboru, celé uložit do DTA ;****************************************************************************** I2F_111B: debbeg m111b ; les di,dword ptr ss:DOS_@dta ; push di ; push es call rop call get_info mov al,mt_ff call inimsg mov al,ss:DOS_filsea_attr stosb mov bx,ss:DOS_@tmp add bx,2 call copy sub di,offset msgs mov cs:scb.s_len,di ff2: call vysli_prijmi push ds jc ff9 ff3: mov ax,cs:rcb.r_from mov word ptr cs:msgr.m_data+11H,ax mov si,offset msgr.m_data ; push ds push cs pop ds ; pop es ; pop di ; DTA les di,ss:DOS_@DTA movsb or byte ptr es:[di-1],80H ; ? mov cx,14H rep movsb push si add si,9 cmp byte ptr [si],'.' je l_184 mov cx,8 l_181: lodsb ; debchr al cmp al,'.' jne l_186 l_182: dec si mov al,' ' rep stosb jmp short l_187 l_184: mov cx,9 lodsw or ah,ah jnz l_185 mov ah,' ' l_185: stosw jmp short l_189 l_186: or al,al jz l_182 stosb loop l_181 l_187: mov cx,3 l_188: lodsb or al,al jnz l_190 l_189: mov al,' ' rep stosb jmp short l_191 l_190: cmp al,'.' je l_188 stosb loop l_188 l_191: pop si movsb xor ax,ax mov cl,5 rep stosw movsw movsw stosw movsw movsw mov al,cs:msgr.m_err or al,al jnz ff9 les di,ss:DOS_@DTA or byte ptr es:[di],80H clc pop ds ret ff9: debchr 'E' les di,ss:DOS_@DTA ; and byte ptr es:[di],7FH mov ax,de_nomore mov ss:DOS_err_code,ax stc pop ds ret ;****************************************************************************** ; Interrupt 2F/111C ; Find next Directory Entry (FCB, handle) ; vzor vezmi z DTA ;****************************************************************************** I2F_111C: ; debbeg m111C call rop lds si,dword ptr ss:DOS_@dta and byte ptr [si],7FH mov bx,word ptr [si+11H] ; adresa serveru mov ax,bx xchg ah,al mov cs:scb.s_to,bx mov al,mt_fn call inimsg cld mov cx,2BH push ds push ss pop ds rep movsb pop ds sub di,offset msgs mov cs:scb.s_len,di jmp ff2 ; v AL A... místní značení ;****************************************************************************** ; Interrupt 2F/111D ; Close all remote files for process ;****************************************************************************** I2F_111D: debbeg m111D call rop ret ;****************************************************************************** ; Interrupt 2F/111E ; DOS 5F - Network redirection ;****************************************************************************** I2F_111E: debbeg m111E ret ;****************************************************************************** ; Interrupt 2F/111F ; DOS 5E/02..05 - Printer setup ; ;****************************************************************************** I2F_111F: debbeg m111F ret ;****************************************************************************** ; Interrupt 2F/1120 ; flush all disk buffers ; ;****************************************************************************** I2F_1120: debbeg m1120 call rop ret ;****************************************************************************** ; Interrupt 2F/1121 ; Move file pointer DOS 42 ; volá se jen pro seek vůči konci souboru, ; vstup - ES:DI sysFCB offset CX:DX ; vystup- DX:AX ;****************************************************************************** I2F_1121: debbeg m1121 call rop push es push di call get_finfo mov al,mm_sk call inimsg mov word ptr cs:msgs.m_data,dx mov word ptr cs:msgs.m_data+2,cx add di,4 sub di,offset msgs mov cs:scb.s_len,di call vysli_prijmi mov bl,1 jc sk3 mov bl,cs:msgr.m_err sk3: pop di pop es mov ax,word ptr cs:msgr.m_data mov dx,word ptr cs:msgr.m_data+2 or bl,bl jz sk4 mov al,bl stc ret sk4: clc ret ;****************************************************************************** ; Interrupt 2F/1122 ; Vstup do krit. sekce 5, inicializace ?semaforu, výstup z kritické sekce ; ; DOS 0 ukončení procesu ; též se volá NetBios 2A, 82 ;****************************************************************************** I2F_1122: debbeg m1122 ret ;****************************************************************************** ; Interrupt 2F/1123 ; V DS:SI identifikace souboru ; Do ES:DI vyseparuj jméno zařízení ; Set Carry flag ;****************************************************************************** I2F_1123: ; debbeg m1123 ; call debnxts ; mov byte ptr cs:2D1H,1 stc ret if 0 push bp ; celé opsáno mov bp,sp sub sp,0AH mov [bp-4],si mov [bp-2],ds mov [bp-8],di mov [bp-6],es mov word ptr [bp-0AH],0FFFFH ; pozice tečky mov ax,[si] push ax mov ax,norm_path_sep int 2FH ; začíná jméno dvěma separátory ? pop ax jnz l_2391 xchg ah,al push ax mov ax,norm_path_sep int 2FH pop ax jz l_23b8 ; ano, je to server, nikoliv zařízení l_2391: mov di,si l_2393: lodsb or al,al jz l_23b2 push ax mov ax,norm_path_sep int 2FH pop ax jz l_23a5 cmp al,':' jne l_23a9 l_23a5: mov di,si jmp short l_2393 l_23a9: cmp al,'.' jne l_2393 mov [bp-0AH],si ; pozice tečky je zajímavá jmp short l_2393 l_23b2: cmp byte ptr [si-2],':' ; identifikace disku jne l_23b8 ; zde by se kontrolovalo jméno zařízení l_23b8: lds si,dword ptr [bp-4] stc l_23bc: les di,dword ptr [bp-8] mov sp,bp pop bp ret endif ;****************************************************************************** ; Interrupt 2F/1124 ; stack 7 dodej stav obsluhy do DL registru uzivatele volajiciho DOS ; 8 nastav obsluhu (0,1) dle DL ; jine: obsluz tiskarny ? ; ; volá se při: keyboard status ; printer output ; auxiliary input ; output character 2F12 ; DOS 08 vstup bez echa ;****************************************************************************** I2F_1124: debbeg m1124 ret ;****************************************************************************** ; ; Interrupt 2F/1125 ; ; ;****************************************************************************** I2F_1125: debbeg m1125 ; debhexb ret ;****************************************************************************** ; Interrupt 2F/1126 ; Přes BIOS INT 10H zobraz znak z AL, pak STC ;****************************************************************************** I2F_1126: debbeg m1126 ret ;****************************************************************************** ; ; Interrupt 2F/1127 ; Do registru ES dodej segment redirektoru ; ;****************************************************************************** I2F_1127: debbeg m1127 push cs pop es ret ;***************************************************************************** ; ; Proces pro prijem vyzev z casovaciho procesu serveru. Na vyzvu doda seznam ; otevrenych souboru prislusneho serveru. ; ;***************************************************************************** tprizn db ? dossg dw ? psp dw ? timrcb trcb <> timscb tscb <> timbuf tmsg <> db 300 dup (?) tim_st dw ? ; BP dw ? ; DI dw ? ; SI dw ? ; DX dw ? ; CX dw ? ; ES dw ? ; DS dw ? ; BX dw ? ; AX dw offset timer1 ; IP dw seg timer1 ; CS dw 200H ; flags timer1: mov ah,18 mov al,40 int kerint timer: sti push cs pop ds push cs pop es mov ax,4 mov timrcb.r_len,ax mov timrcb.r_tmout,250 lea bx,timrcb lea ax,timbuf mov word ptr timscb.s_buf,ax mov ax,cs mov word ptr timscb.s_buf+2,ax mov ah,11H int linint jc timer mov ax,dossg mov es,ax lea di,timbuf.m_data+1 ; kam dávat čísla souborů mov dl,0 ; jejich počet les bx,dword ptr es:2AH ; adresa tabulky souboru ztab: mov cx,word ptr es:[bx+4] ; velikost teto tabulky push bx add bx,6 tznovu: cmp word ptr es:[bx],0 ; je vyuzit ? je tdalsi cmp word ptr es:[bx],0FFFFH je tdalsi mov ax,word ptr es:[bx+5] and ax,8040H ; vzdaleny ? jz tdalsi mov ax,word ptr es:[bx+19H] ; adresa serveru cmp ax,timrcb.r_from jne tdalsi mov al,byte ptr es:[bx+1BH] ; cislo souboru na serveru mov byte ptr [di],al inc di inc dl tdalsi: add bx,35H loop tznovu pop bx les bx,dword ptr es:[bx] cmp bx,0FFFFH ; dalsi tabulka ? jne ztab cmp dl,0 je etimer mov byte ptr timbuf.m_data,dl mov timbuf.m_num,3 mov timbuf.m_typ,mm_stat mov ax,timrcb.r_from mov timscb.s_to,ax sub di,offset timbuf-2 mov timscb.s_len,di lea bx,timscb push cs pop es mov al,tprizn mov timscb.s_sem,al mov ah,l_send mov cx,200H loop $ int linint jc etimer mov al,tprizn mov ah,k_wait int kerint etimer: jmp timer free_mem: if czech hdr db 'FELAN - redirektor souborových operací BIM 150791' db cr,lf if tedos db ' verze pro TE DOS' else db ' verze pro MS DOS' endif db cr,lf,'$' nolin db 'Není instalován komunikační ovladač LINx.EXE !',cr,lf,'$' nodriv db 'Není instalován driver FELAN.SYS',cr,lf,'$' erver_msg db 'Chybná verze operačního systému',cr,lf,'$' uzje db 'Redirektor již byl instalován.',cr,lf,'$' endif if eng hdr db 'FELAN - redirector of file services BIM 150791' db cr,lf if tedos db ' version for TE DOS' else db ' version for MS DOS' endif db cr,lf,'$' nolin db 'Network driver LINx.EXE is not installed !',cr,lf,'$' nodriv db 'Disc driver FELAN.SYS is not installed',cr,lf,'$' erver_msg db 'Incorrect DOS version',cr,lf,'$' uzje db 'Redirector already installed.',cr,lf,'$' endif start: mov ax,40H mov ds,ax mov ax,word ptr [6CH] ; počet tiků od zapnutí push cs pop ds mov msgcnt,ax lea dx,hdr mov ah,wrstr int 21H mov ah,get_ver ; kontrola verze operačního systému int 21H xchg ah,al cmp ax,030AH ; 3.10 jb erver cmp ax,0363H ; 3.99 jbe verze_OK lea dx,erver_msg erver: mov al,0FFH erver2: mov ah,wrstr int 21H mov ah,exit int 21H verze_OK: ; jsou data DOSu platná ? mov ah,get_list int 21H cmp word ptr es:DOS52_@filtab,0 jne erver mov ax,es mov dossg,ax mov ax,1100H int 2FH cmp al,0FFH jnz neni lea dx,uzje jmp short erver neni: push ds mov ax,get_dos int 2FH mov bx,DS:DOS_seclen pop ds mov max_sec_len,bx mov ax,getint shl 8 + linint int 21H ; přítomnost komunikačního ovladače mov ax,es or bx,ax jz liner mov ax,4321H int linint cmp ax,4300H jz driv liner: lea dx,nolin jmp erver driv: mov ax,0A5C0H ; přítomnost driveru int 13H cmp al,5AH je lini lea dx,nodriv jmp erver lini: inc bx mov word ptr pistab,bx ; adresa Pištovy tabulky mov bx,es mov word ptr pistab+2,bx push cs pop es lea bx,rcb ; trvalý příjem mov ah,10H int linint jnc lini2 lini1: lea dx,uzje jmp erver lini2: mov ah,13 ; alokace a inicializace příznaku mov bl,0 int kerint jc lini1 mov prizn,al mov ah,13 ; alokace a inicializace příznaku mov bl,0 int kerint jc lini1 mov tprizn,al mov ah,62H ; get PSP int 21H mov psp,bx mov timrcb.r_min,15 mov timrcb.r_max,15 mov timrcb.r_tmout,100 mov word ptr timrcb.r_buf,offset timbuf mov ax,cs mov word ptr timrcb.r_buf+2,ax lea bx,timrcb ; trvalý příjem push cs pop es mov ah,10H int linint jc lini1 push cs pop es lea bx,tim_st mov ax,19 ; vytvor proces, priorita 19 int kerint lea dx,INT_23H_entry mov ax,setint shl 8 + 23H int 21H lea dx,INT_24H_entry mov ax,setint shl 8 + 24H int 21H mov ax,getint shl 8 + 2FH int 21H ; starý vektor INT 2FH mov word ptr old_2F,bx mov bx,es mov word ptr old_2F+2,bx lea dx,INT_2FH_entry mov ax,setint shl 8 + 2FH int 21H mov ax,351CH ; systémový časovač int 21H mov word ptr save_1C,bx mov ax,es mov word ptr save_1C+2,ax lea dx,timer_int ; nastav můj časovač mov ax,setint shl 8 + 1CH int 21H sti mov si,0 mov cx,1000 tim_loop: cmp ttimer,10 jnb ttimer_ex loop tim_loop mov cx,269 inc si jmp tim_loop ttimer_ex: mov delay,si push ds ; obnov časovač lds dx,save_1C mov ax,setint shl 8 + 1CH int 21H pop ds ;--------------------------- lea dx,free_mem add dx,10FH rcr dx,1 mov cl,3 shr dx,cl mov ax,stay shl 8 int 21H timer_int: inc cs:ttimer iret ttimer db 0 save_1C dd ? cseg ends stack segment stack 'stack' db 1000 dup (?) stack ends end start