NEW AUTO 3,1 Enable MASM3 auto line num .LIST OFF .OP 65C02 Target CPU, must match CPU level in header .OR $2000 usualy $2000, but any value > $100 allowed .TF sbin/cifsd *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/mli.e.i .INB inc/eth.i .INB inc/libtcpip.i .INB inc/net.smb.i .INB inc/libcifs.i *-------------------------------------- TIMEOUT.MAX .EQ 250 25 sec. *-------------------------------------- * Zero Page Segment, up to 32 bytes *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPIPCfgPtr .BS 2 hSocket .BS 1 hResp .BS 1 ZPRespPtr .BS 2 TimeOut .BS 1 hSMBContext .BS 1 hMount .BS 1 ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #S.PS.F.EVENT .DA #0 .DA CS.END-CS.START Code Size (without Constants) .DA DS.END-DS.START Data SegmentSize .DA #64 Stack Size .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.LIBCIFS .DA LIBCIFS L.MSG.TCPIPERR .DA MSG.TCPIPERR L.MSG.USAGE .DA MSG.USAGE L.MSG.UNKNOWN .DA MSG.UNKNOWN L.MSG.SESSION .DA MSG.SESSION L.SMB.NegReq .DA SMB.NegReq L.SMB.SessSetup .DA SMB.SessSetup L.SMB.TreeConnReq .DA SMB.TreeConnReq L.SMB.QueryPathInfo .DA SMB.QueryPathInfo L.SMB.FindFirstReq .DA SMB.FindFirstReq .DA 0 *-------------------------------------- * Called once at process creation * Put code for loading LIB here *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib bcs .9 sta hLIBTCPIP >LDYA L.LIBCIFS >SYSCALL LoadLib bcs .9 sta hLIBCIFS * clc .9 CS.INIT.RTS rts *-------------------------------------- * Called until exit with CS * if RUN exits with CC, RUN entered again *-------------------------------------- CS.RUN lda hSocket beq .1 lda #0 clc rts .1 jsr CS.RUN.CheckTCPIP bcs CS.INIT.RTS jsr CS.RUN.CheckArgs bcs CS.INIT.RTS jsr CS.RUN.Connect bcs CS.INIT.RTS >PUSHB hSocket >PUSHBI 0 >LIBCALL hLIBCIFS,LIBCIFS.Negotiate bcs .9 sta hSMBContext >DEBUG >PUSHB hSocket >PUSHB hSMBContext >PUSHWI 0 >PUSHWI 0 >PUSHBI 0 >LIBCALL hLIBCIFS,LIBCIFS.SessionSetup bcs .9 >PUSHB hSocket >PUSHB hSMBContext lda #2 >SYSCALL ArgV >PUSHYA >PUSHBI 0 >LIBCALL hLIBCIFS,LIBCIFS.TreeConnect bcs .9 * lda #3 * >SYSCALL ArgV * >PUSHYA * >PUSHW L.CS.CALLBACK * >SYSCALL Mount * bcs .9 * sta hMount .8 lda #0 clc .9 rts *-------------------------------------- CS.RUN.CheckTCPIP >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ? bcs .9 >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi .1 >LDYA L.MSG.TCPIPERR >SYSCALL PutS lda #E.SYN sec .9 rts .1 lda #AF.INET >STA.G SA.LOCAL >STA.G SA.REMOTE ldy #S.IPCFG.IP+3 .3 lda (ZPIPCfgPtr),y pha dey cpy #S.IPCFG.IP-1 bne .3 ldy #SA.LOCAL+S.SOCKADDR.ADDR .4 pla sta (pData),y iny cpy #SA.LOCAL+S.SOCKADDR.ADDR+4 bne .4 lda #TCP.PORT.CIFS >STA.G SA.REMOTE+S.SOCKADDR.PORT iny lda /TCP.PORT.CIFS sta (pData),y clc rts *-------------------------------------- CS.RUN.CheckArgs ldy #S.PS.ARGC lda (pPS),y cmp #3 bcs .1 >LDYA L.MSG.USAGE >SYSCALL PutS lda #E.SYN sec rts .1 lda #TIMEOUT.MAX sta TimeOut .2 >PUSHEA.G SA.REMOTE+S.SOCKADDR.ADDR lda #1 >SYSCALL ArgV >PUSHYA >LIBCALL hLIBTCPIP,LIBTCPIP.HST.GetByName bcc .3 >SLEEP lda TimeOut bne .2 >PUSHW L.MSG.UNKNOWN lda #1 >SYSCALL ArgV >PUSHYA >PUSHBI 2 >SYSCALL PrintF sec rts .3 lda #2 >SYSCALL ArgV clc rts *-------------------------------------- CS.RUN.Connect >PUSHBI 0 no protocol lda #S.SOCKET.T.SEQPKT >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 sta hSocket >PUSHEA.G SA.LOCAL lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 >SLEEP >PUSHEA.G SA.REMOTE lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Connect bcs .9 lda #TIMEOUT.MAX sta TimeOut .1 >SLEEP lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .7 cmp #E.NODATA beq .8 ldx TimeOut bne .1 sec rts .7 >SYSCALL Freemem .8 clc .9 rts *-------------------------------------- CS.RUN.Negotiate lda #TIMEOUT.MAX sta TimeOut .1 >PUSHWI SMB.NegReq.end-SMB.NegReq >PUSHW L.SMB.NegReq lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Send bcc .2 >SLEEP ldx TimeOut bne .1 bra .99 .2 >SLEEP lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .3 cmp #E.NODATA beq .2 bra .99 .3 sta hResp >SYSCALL GetMemPtr >STYA ZPRespPtr ldy #$3f lda (ZPRespPtr),y bne .9 ldy #$5B lda (ZPRespPtr),y cmp #5 bne .9 lda hResp >SYSCALL FreeMem * clc rts .9 lda hResp >SYSCALL FreeMem .99 lda #MLI.E.INVPATH sec rts *-------------------------------------- CS.RUN.SessSetup lda #TIMEOUT.MAX sta TimeOut .1 >PUSHWI SMB.SessSetup.end-SMB.SessSetup >PUSHW L.SMB.SessSetup lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Send bcc .2 >SLEEP ldx TimeOut bne .1 bra .99 .2 >SLEEP lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .3 cmp #E.NODATA beq .2 bra .99 .3 sta hResp >SYSCALL GetMemPtr >STYA ZPRespPtr ldy #$3f lda (ZPRespPtr),y bne .9 ldy #$56 lda (ZPRespPtr),y sta SMB.TreeConnReq.UID iny lda (ZPRespPtr),y sta SMB.TreeConnReq.UID+1 >PUSHW L.MSG.SESSION lda #$63 clc adc ZPRespPtr tay lda #0 adc ZPRespPtr+1 >PUSHYA >PUSHBI 2 >SYSCALL PrintF lda hResp >SYSCALL FreeMem * clc rts .9 lda hResp >SYSCALL FreeMem .99 lda #MLI.E.INVPATH sec rts *-------------------------------------- CS.RUN.TreeConn lda #TIMEOUT.MAX sta TimeOut .1 >PUSHWI SMB.TreeConnReq.end-SMB.TreeConnReq >PUSHW L.SMB.TreeConnReq lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Send bcc .2 >SLEEP ldx TimeOut bne .1 bra .99 .2 >SLEEP lda hSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Recv bcc .3 cmp #E.NODATA beq .2 bra .99 .3 sta hResp >SYSCALL GetMemPtr >STYA ZPRespPtr ldy #$3f lda (ZPRespPtr),y bne .9 ldy #$52 lda (ZPRespPtr),y sta SMB.FindFirstReq.TID iny lda (ZPRespPtr),y sta SMB.FindFirstReq.TID+1 ldy #$56 lda (ZPRespPtr),y sta SMB.FindFirstReq.UID iny lda (ZPRespPtr),y sta SMB.FindFirstReq.UID+1 lda hResp >SYSCALL FreeMem * clc rts .9 lda hResp >SYSCALL FreeMem .99 lda #MLI.E.INVPATH sec rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? lda TimeOut beq .9 dec TimeOut .9 sec do not discard TIMER event rts *-------------------------------------- * Called once, when RUN exited with CS * Put code for unloading LIB here *-------------------------------------- CS.QUIT lda hMount beq .1 >SYSCALL UMount .1 lda hSocket beq .2 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown .2 lda hLIBCIFS beq .3 >SYSCALL UnloadLib .3 lda hLIBTCPIP beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- CS.END *-------------------------------------- * Initialized DATA *-------------------------------------- LIBTCPIP .AZ "libtcpip" hLIBTCPIP .BS 1 LIBCIFS .AZ "libcifs" hLIBCIFS .BS 1 MSG.TCPIPERR .AZ "CIFSD:TCP/IP Not initialized properly." MSG.USAGE .AZ "Usage : CIFSD sharename mountpoint" MSG.UNKNOWN .AZ "CIFSD:%s: Unknown host\r\n" MSG.SESSION .AZ "CIFSD:Connected to: %s\r\n" *-------------------------------------- SMB.NegReq .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.NegReq.end-1-* .DA #SMB.NegReq.end-1-* .DA #$FF .AS "SMB" .DA #S.SMB.H.CMD.NEGOTIATE .HS 00000000 .DA #0 S.SMB.H.FLAGS .DA S.SMB.H.FLAGS2.LONGNAMES .DA 0 PIDHI .HS 0000000000000000 SECFEAT .DA 0 RSVD .DA $FFFF TID .DA $FEFF PIDLO .DA 0 UID .DA 0 MID .DA #0 WORD COUNT .DA #SMB.NegReq.end-2-* .DA /SMB.NegReq.end-2-* .DA #2 .AZ "PC NETWORK PROGRAM 1.0" .DA #2 .AZ "LANMAN1.0" .DA #2 .AZ "Windows for Workgroups 3.1a" .DA #2 .AZ "LM1.2X002" .DA #2 .AZ "LANMAN2.1" .DA #2 .AZ "NT LM 0.12" .DA #2 .AZ "SMB 2.002" .DA #2 .AZ "SMB 2.???" SMB.NegReq.end .EQ * *-------------------------------------- SMB.SessSetup .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.SessSetup.end-1-* .DA #SMB.SessSetup.end-1-* .DA #$FF .AS "SMB" .DA #S.SMB.H.CMD.SESSION.SETUP.ANDX .HS 00000000 .DA #0 S.SMB.H.FLAGS .DA S.SMB.H.FLAGS2.LONGNAMES .DA 0 PIDHI .HS 0000000000000000 SECFEAT .DA 0 RSVD .DA $FFFF TID .DA $FEFF PIDLO .DA 0 UID .DA 0 MID .DA #13 WORD COUNT .HS FF000000 NO MORE CMD .DA 1280 MAX BUFFER .DA 2 MAX MPX COUNT .HS 0000 VC NUMBER .HS 00000000 SESSION KEY .DA 0 CI PASS LEN .DA 0 CS PASS LEN .HS 00000000 .HS 00000000 CAPABILITIES .DA #SMB.SessSetup.end-2-* .DA /SMB.SessSetup.end-2-* * .AZ "" Password .AZ "Guest" Account Name .AZ "?" Primary Domain .AZ "A2osX" Native OS .AZ "A2osX-CIFSD" Native LANMAN SMB.SessSetup.end .EQ * *-------------------------------------- SMB.TreeConnReq .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.TreeConnReq.end-1-* .DA #SMB.TreeConnReq.end-1-* .DA #$FF .AS "SMB" .DA #S.SMB.H.CMD.TREE.CONNECT.ANDX .HS 00000000 .DA #0 S.SMB.H.FLAGS .DA S.SMB.H.FLAGS2.LONGNAMES .DA 0 PIDHI .HS 0000000000000000 SECFEAT .DA 0 RSVD SMB.TreeConnReq.TID .DA $FFFF TID .DA $FEFF PIDLO SMB.TreeConnReq.UID .DA 0 UID .DA 0 MID .DA #4 WORD COUNT .HS FF000000 NO MORE CMD .DA 0 .DA 1 PASSWORD LEN .DA #SMB.TreeConnReq.end-2-* .DA /SMB.TreeConnReq.end-2-* .AZ "" PASSWORD .AZ "_temp" PATH .AZ "?????" SMB.TreeConnReq.end .EQ * *-------------------------------------- * https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/9b171bbf-c6d8-4c88-ac85-23c795cbb5d3 *-------------------------------------- SMB.QueryPathInfo .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.QueryPathInfo.end-1-* .DA #SMB.QueryPathInfo.end-1-* .DA #$FF .AS "SMB" .DA #S.SMB.H.CMD.TRANSACTION2 .HS 00000000 .DA #0 S.SMB.H.FLAGS .DA S.SMB.H.FLAGS2.LONGNAMES .DA 0 PIDHI .HS 0000000000000000 SECFEAT .DA 0 RSVD SMB.QueryPathInfo.TID .DA $FFFF TID .DA $FEFF PIDLO SMB.QueryPathInfo.UID .DA 0 UID .DA 0 MID * Trans2 .DA #15 WORD COUNT .DA SMB.QueryPathInfo.PrmCnt TotalParamCount .DA 0 TotalDataCount .DA 10 MaxParameterCount .DA 460 MaxDataCount .DA #1 MaxSetupCount .HS 00 Reserved1 .DA 0 Flags .HS 00000000 Timeout .HS 0000 Reserved2 .DA SMB.QueryPathInfo.PrmCnt ParameterCount .DA 66 ParameterOffset .HS 0000 DataCount .HS 0000 DataOffset .DA #1 SetupCount .HS 00 Reserved3 * TRANS2_QUERY_PATH_INFORMATION .DA 5 TRANS2_QUERY_PATH_INFORMATION .DA SMB.QueryPathInfo.PrmCnt+1 INCLUDING Padding byte below .HS 00 Padding SMB.QueryPathInfo.Prm .DA $0001 InformationLevel .HS 00000000 SearchStorageType .AZ "server.met" FileName SMB.QueryPathInfo.PrmCnt .EQ *-SMB.QueryPathInfo.Prm SMB.QueryPathInfo.end *-------------------------------------- SMB.FindFirstReq .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.FindFirstReq.end-1-* .DA #SMB.FindFirstReq.end-1-* .DA #$FF .AS "SMB" .DA #S.SMB.H.CMD.TRANSACTION2 .HS 00000000 .DA #0 S.SMB.H.FLAGS .DA S.SMB.H.FLAGS2.LONGNAMES .DA 0 PIDHI .HS 0000000000000000 SECFEAT .DA 0 RSVD SMB.FindFirstReq.TID .DA $FFFF TID .DA $FEFF PIDLO SMB.FindFirstReq.UID .DA 0 UID .DA 0 MID * Trans2 .DA #15 WORD COUNT .DA SMB.FindFirstReq.PrmCnt TotalParamCount .DA 0 TotalDataCount .DA 10 MaxParameterCount .DA 460 MaxDataCount .DA #1 MaxSetupCount .HS 00 Reserved1 .DA 0 Flags .HS 00000000 Timeout .HS 0000 Reserved2 .DA SMB.FindFirstReq.PrmCnt ParameterCount .DA 66 ParameterOffset .HS 0000 DataCount .HS 0000 DataOffset .DA #1 SetupCount .HS 00 Reserved3 * FIND_FIRST2 .DA 1 TRANS2_FIND_FIRST2 .DA SMB.FindFirstReq.PrmCnt+1 INCLUDING Padding byte below .HS 00 Padding SMB.FindFirstReq.Prm .DA $0016 SearchAttributes .DA 1024 SearchCount .DA 3 Flags .DA $0001 InformationLevel .HS 00000000 SearchStorageType .AZ "\*.*" FileName SMB.FindFirstReq.PrmCnt .EQ *-SMB.FindFirstReq.Prm SMB.FindFirstReq.end *-------------------------------------- .DUMMY .OR 0 DS.START SA.LOCAL .BS 1 S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .BS 2 S.SOCKADDR.PORT SA.REMOTE .BS 1 S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .BS 2 S.SOCKADDR.PORT DS.END .ED *-------------------------------------- MAN SAVE usr/src/sbin/cifsd.s ASM