NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF lib/libcifs *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/kernel.i .INB inc/mli.e.i .INB inc/eth.i .INB inc/libtcpip.i .INB inc/net.smb.i *-------------------------------------- .DUMMY .OR ZPLIB ZS.START ZPReqPtr .BS 2 ZPReqLen .BS 2 ZPCtxPtr .BS 2 pFD .BS 2 ZPPtr1 .BS 2 ZPPtr2 .BS 2 BufPtr .BS 2 hBuf .BS 1 hResp .BS 1 pPath .BS 2 flags .BS 1 ftype .BS 1 auxtype .BS 2 ZPRespPtr .BS 2 bFlag .BS 1 LenOfs .BS 1 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 0 .DA CS.END-CS.START .DA 0 .DA 0 .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA LIB.LOAD .DA LIB.UNLOAD .DA CIFS.Negotiate .DA CIFS.SessionSetup .DA CIFS.TreeConnect .DA CIFS.Mount .DA CIFS.UMount *-------------------------------------- L.CALLBACK .DA CIFS.CallBack *-------------------------------------- J.CIFS .DA CIFS.ChTyp .DA CIFS.ChMod .DA CIFS.FStat .DA CIFS.Stat .DA CIFS.MKDir .DA CIFS.BADCALL MKNod .DA CIFS.BADCALL MKFIFO .DA CIFS.BADCALL Pipe .DA CIFS.OpenDir .DA CIFS.ReadDir .DA CIFS.CloseDir .DA CIFS.BADCALL Open .DA CIFS.BADCALL Close .DA CIFS.BADCALL Read .DA CIFS.BADCALL Write .DA CIFS.ChOwn .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.FOpen .DA CIFS.FClose .DA CIFS.FRead .DA CIFS.FWrite .DA CIFS.FFlush .DA CIFS.FSeek .DA CIFS.FTell .DA CIFS.FEOF .DA CIFS.Remove .DA CIFS.Rename *-------------------------------------- J.CIFS2 .DA CIFS2.ChTyp .DA CIFS2.ChMod .DA CIFS2.FStat .DA CIFS2.Stat .DA CIFS2.MKDir .DA CIFS.BADCALL MKNod .DA CIFS.BADCALL MKFIFO .DA CIFS.BADCALL Pipe .DA CIFS2.OpenDir .DA CIFS2.ReadDir .DA CIFS2.CloseDir .DA CIFS.BADCALL Open .DA CIFS.BADCALL Close .DA CIFS.BADCALL Read .DA CIFS.BADCALL Write .DA CIFS2.ChOwn .DA CIFS.BADCALL FPutC... .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL .DA CIFS.BADCALL ...UngetC .DA CIFS2.FOpen .DA CIFS2.FClose .DA CIFS2.FRead .DA CIFS2.FWrite .DA CIFS2.FFlush .DA CIFS2.FSeek .DA CIFS2.FTell .DA CIFS2.FEOF .DA CIFS2.Remove .DA CIFS2.Rename *-------------------------------------- L.LIBTCPIP .DA LIBTCPIP L.NETBIOS .DA NETBIOS .DA 0 *-------------------------------------- LIB.LOAD >LDYA L.LIBTCPIP >SYSCALL2 LoadLib bcs .9 sta hLIBTCPIP >SYSCALL2 GetMemPtr >STYA pLIBTCPIP >LDYAI 512 >SYSCALL2 GetMem bcs .9 stx hReq * clc .9 rts *-------------------------------------- LIB.UNLOAD lda hReq beq .1 >SYSCALL2 FreeMem .1 lda hLIBTCPIP beq .8 >SYSCALL2 UnloadLib .8 clc rts *-------------------------------------- * >PUSHB hSocket * >PUSHBI 0 * >LIBCALL Negotiate * A = hSMBContext *-------------------------------------- CIFS.Negotiate lda (pStack) bne .1 dec sta (pStack) ldy #1 hSocket lda (pStack),y >PUSHA >PUSHW L.NETBIOS >PUSHWI SMB.NegReq.end-NETBIOS ldx #LIBTCPIP.Send jsr GO.LIBTCPIP bcs .99 lda #0 sec rts .1 dec sta (pStack) beq .98 ldy #1 hSocket lda (pStack),y ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcc .3 cmp #E.NODATA bne .99 inc rts .3 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y bne .97 ldy #S.NETBIOS.LEN+2 lda (ZPRespPtr),y clc adc #S.NETBIOS sta ZPPtr1 tay lda #0 >SYSCALL2 GetMem bcs .99 >STYA ZPCtxPtr ldy ZPPtr1 .4 dey lda (ZPRespPtr),y sta (ZPCtxPtr),y tya bne .4 ldy #S.NETBIOS+S.SMB.H.FLAGS sta (ZPCtxPtr),y phx lda hResp >SYSCALL2 FreeMem pla clc >RET 2 .97 lda hResp >SYSCALL2 FreeMem .98 lda #MLI.E.IO .99 >RET 2 *-------------------------------------- * >PUSHB hSocket * >PUSHB hSMBContext * >PUSHW username * >PUSHW password * >PUSHBI 0 * >LIBCALL SessionSetup * (SMBContext updated with UID) *-------------------------------------- CIFS.SessionSetup lda (pStack) bne .5 dec sta (pStack) ldy #5 hSMBContext jsr GetSMBContext ldx #S.SMB.H.CMD.SESSION.SETUP.ANDX jsr RequestSetupX ldx #0 .2 lda SMB.SessionSetup.H,x sta (ZPReqPtr),y iny inx cpx #SMB.SessionSetup.H.Len bne .2 phy save Y = LEN iny iny ldx #0 .3 lda SMB.SessionSetup.Guest,x sta (ZPReqPtr),y iny inx cpx #SMB.SessionSetup.Guest.Len bne .3 ldx #0 .4 lda SMB.SessionSetup.T,x sta (ZPReqPtr),y iny inx cpx #SMB.SessionSetup.T.Len bne .4 pla jsr SetReqLenYAtA ldy #6 hSocket lda (pStack),y >PUSHA >PUSHW ZPReqPtr >PUSHW ZPReqLen ldx #LIBTCPIP.Send jsr GO.LIBTCPIP bcs .99 lda #0 sec rts .5 dec sta (pStack) beq .98 ldy #6 hSocket lda (pStack),y ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcc .6 cmp #E.NODATA bne .99 inc rts .6 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y bne .97 ldy #5 hSMBContext jsr GetSMBContext ldy #S.NETBIOS+S.SMB.H.UID lda (ZPRespPtr),y sta (ZPCtxPtr),y iny lda (ZPRespPtr),y sta (ZPCtxPtr),y .8 lda hResp >SYSCALL2 FreeMem clc >RET 7 .97 lda hResp >SYSCALL2 FreeMem .98 lda #MLI.E.IO sec .99 >RET 7 *-------------------------------------- * >PUSHB hSocket * >PUSHB hSMBContext * >PUSHW pathname * >PUSHBI 0 * >LIBCALL TreeConnect * (SMBContext updated with TID) *-------------------------------------- CIFS.TreeConnect lda (pStack) bne .5 dec sta (pStack) ldy #1 pathname lda (pStack),y sta ZPPtr1 iny lda (pStack),y sta ZPPtr1+1 iny hSMBContext jsr GetSMBContext ldx #S.SMB.H.CMD.TREE.CONNECT.ANDX jsr RequestSetupX ldx #0 .1 lda SMB.TreeConnect.H,x sta (ZPReqPtr),y iny inx cpx #SMB.TreeConnect.H.Len bne .1 phy save Y = LEN iny Skip ByteCount iny lda #0 sta (ZPReqPtr),y PASSWORD = "\0" iny .2 lda (ZPPtr1) inc ZPPtr1 bne .3 inc ZPPtr1+1 .3 sta (ZPReqPtr),y iny tax bne .2 ldx #0 .4 lda SMB.TreeConnect.T,x sta (ZPReqPtr),y iny inx cpx #SMB.TreeConnect.T.Len bne .4 pla jsr SetReqLenYAtA ldy #4 hSocket lda (pStack),y jsr WriteSocketA bcs .99 lda #0 sec rts .5 dec sta (pStack) beq .98 ldy #4 hSocket lda (pStack),y ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcc .6 cmp #E.NODATA bne .99 inc rts .6 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y bne .97 ldy #3 hSMBContext jsr GetSMBContext ldy #S.NETBIOS+S.SMB.H.TID lda (ZPRespPtr),y sta (ZPCtxPtr),y iny lda (ZPRespPtr),y sta (ZPCtxPtr),y .8 lda hResp >SYSCALL2 FreeMem clc >RET 5 .97 lda hResp >SYSCALL2 FreeMem .98 lda #MLI.E.IO sec .99 >RET 5 *-------------------------------------- * >PUSHB hSocket * >PUSHB hSMBContext * >PUSHW MountPoint * >LIBCALL Mount *-------------------------------------- CIFS.Mount ldy #1 lda (pStack),y MP HI >PUSHA lda (pStack),y MP LO >PUSHA >PUSHW L.CALLBACK >SYSCALL2 Mount bcs .9 pha hMount ldx #0 .1 >PULLB MountTable,x inx cpx #4 bne .1 pla clc rts .9 >RET 4 *-------------------------------------- CIFS.UMount clc rts *-------------------------------------- CIFS.CallBack bit CIFS.Status bpl .1 phy pha ldy #S.PS.PID lda (pPS),y cmp CIFS.PID beq .2 pla ply lda #0 sec rts .1 jmp (J.CIFS,x) .2 pla ply jmp (J.CIFS2,x) *-------------------------------------- .INB usr/src/lib/libcifs.io.s *-------------------------------------- GetPFD tax phx lda Nod.Table.hName-2,x >SYSCALL2 GetMemPtr >STYA pPath plx lda Nod.Table.hFD-2,x >SYSCALL2 GetMemPtr >STYA pFD rts *-------------------------------------- GetGTX lda MountTable+2 >SYSCALL2 GetMemPtr >STYA ZPCtxPtr rts *-------------------------------------- MakeTrans2Req jsr GetGTX ldx #S.SMB.H.CMD.TRANS2 jsr RequestSetupX ldx #0 .1 lda SMB.Trans2.H,x sta (ZPReqPtr),y iny inx cpx #SMB.Trans2.H.Len bne .1 rts *-------------------------------------- GetSMBContext lda (pStack),y >SYSCALL2 GetMemPtr >STYA ZPCtxPtr rts *-------------------------------------- RequestSetupX phx lda hReq >SYSCALL2 GetMemPtr >STYA ZPReqPtr plx ldy #0 .1 lda (ZPCtxPtr),y cpy #S.NETBIOS+S.SMB.H.CMD bne .2 txa .2 sta (ZPReqPtr),y iny cpy #S.NETBIOS+S.SMB.H bne .1 rts *-------------------------------------- GetPathLen ldy #$ff .1 iny lda (pPath),y bne .1 tya rts *-------------------------------------- AppendPath ldx #0 .1 lda (pPath) beq .4 inc pPath bne .2 inc pPath+1 .2 cmp #'/' bne .3 lda #'\' .3 sta (ZPReqPtr),y tax iny bra .1 .4 cpx #'\' bne .5 dey .5 rts *-------------------------------------- SetReqLen lda ZPReqLen sec sbc LenOfs ldy LenOfs sta (ZPReqPtr),y iny lda ZPReqLen+1 sbc #0 sta (ZPReqPtr),y bra SetReqLenNETBIOS *-------------------------------------- * Y = LEN from S.NETBIOS.TYPE * A = Ptr to LEN Word *-------------------------------------- SetReqLenYAtA sty ZPReqLen stz ZPReqLen+1 sta ZPPtr1 pha tya dec dec sec sbc ZPPtr1 ply sta (ZPReqPtr),y iny lda #0 sta (ZPReqPtr),y bra SetReqLenNETBIOS *-------------------------------------- SetT2ReqLenYA sty ZPReqLen stz ZPReqLen+1 tya sec sbc #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+7 ldy #S.NETBIOS+S.SMB.H+1 sta (ZPReqPtr),y ldy #S.NETBIOS+S.SMB.H+19 sta (ZPReqPtr),y inc inc inc ldy #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+2 sta (ZPReqPtr),y SetReqLenNETBIOS lda ZPReqLen sec sbc #S.NETBIOS ldy #S.NETBIOS.LEN+2 sta (ZPReqPtr),y lda ZPReqLen+1 sec sbc /S.NETBIOS dey sta (ZPReqPtr),y rts *-------------------------------------- Sleep ldy #S.PS.PID lda (pPS),y sta CIFS.PID dec CIFS.Status stz CIFS.Retries lda #0 sec rts *-------------------------------------- GetRespData sta hResp >SYSCALL2 GetMemPtr pha tya * clc adc #S.TCP sta ZPRespPtr pla adc /S.TCP sta ZPRespPtr+1 rts *-------------------------------------- GetRespDataOffset ldy #S.NETBIOS+S.SMB.H+15 Data Offset lda (ZPRespPtr),y clc adc ZPRespPtr tax iny lda (ZPRespPtr),y adc ZPRespPtr+1 pha txa clc adc #S.NETBIOS sta ZPPtr1 pla adc /S.NETBIOS sta ZPPtr1+1 rts *-------------------------------------- FreeRespData php pha lda hResp >SYSCALL2 FreeMem pla plp rts *-------------------------------------- FileInfo2StatBuf phx ldx #S.STAT-1 .1 stz StatBuf,x dex bpl .1 ldy #0 Creation Date/Time ldx #S.STAT.CTIME jsr FileInfo2StatBufDT ldy #4 Last Access Date/Time ldx #S.STAT.ATIME jsr FileInfo2StatBufDT ldy #8 Last Write Date/Time ldx #S.STAT.MTIME jsr FileInfo2StatBufDT ldy #12+3 Data Size ldx #3 .7 lda (ZPPtr1),y sta StatBuf+S.STAT.SIZE,x dey dex bpl .7 ldy #20 File Attribute lda (ZPPtr1),y and #$10 beq .8 lda /S.STAT.MODE.DIR sta StatBuf+S.STAT.MODE+1 .8 plx rts *-------------------------------------- * YYYYYYYM MMM DDDDD * HHHHHmmm mmm SSSSS *-------------------------------------- FileInfo2StatBufDT iny lda (ZPPtr1),y lsr php clc adc #80 sta StatBuf+S.TIME.YEAR,x lda #19 adc #0 sta StatBuf+S.TIME.CENTURY,x dey plp lda (ZPPtr1),y ror lsr lsr lsr lsr sta StatBuf+S.TIME.MONTH,x lda (ZPPtr1),y and #$1F sta StatBuf+S.TIME.DAY,x iny iny lda (ZPPtr1),y and #$1F asl sta StatBuf+S.TIME.SECOND,x lda (ZPPtr1),y and #$E0 sta StatBuf+S.TIME.MINUTE,x lda (ZPPtr1),y lsr ror StatBuf+S.TIME.MINUTE,x lsr ror StatBuf+S.TIME.MINUTE,x lsr ror StatBuf+S.TIME.MINUTE,x lsr StatBuf+S.TIME.MINUTE,x lsr StatBuf+S.TIME.MINUTE,x sta StatBuf+S.TIME.HOUR,x rts * TODO : S.TIME.WDAY *-------------------------------------- StatBuf2Ptr2 ldy #S.STAT-1 .1 lda StatBuf,y sta (ZPPtr2),y dey bpl .1 rts *-------------------------------------- ClearSocket jsr ReadSocket bcs .8 >SYSCALL2 FreeMem bra ClearSocket .8 clc rts *-------------------------------------- WriteSocket lda MountTable+3 hSocket WriteSocketA >PUSHA >PUSHW ZPReqPtr >PUSHW ZPReqLen ldx #LIBTCPIP.Send jmp (pLIBTCPIP) *-------------------------------------- ReadSocket lda MountTable+3 hSocket ldx #LIBTCPIP.Recv GO.LIBTCPIP jmp (pLIBTCPIP) *-------------------------------------- CIFS.BADCALL lda #MLI.E.BADCALL sec rts *-------------------------------------- CS.END *-------------------------------------- NETBIOS .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.NegReq.end-SMB.H .DA #SMB.NegReq.end-SMB.H *-------------------------------------- SMB.H .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 $FFFE PIDLO .BS 2 UID .DA 0 MID *-------------------------------------- SMB.NegReq .DA #0 WORD COUNT .DA #SMB.NegReq.end-2-* ByteCount .DA #0 * .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.SessionSetup.H .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 (ANSI) .DA 0 CS PASS LEN (UNICODE) .HS 00000000 .HS 00000000 CAPABILITIES SMB.SessionSetup.H.Len .EQ *-SMB.SessionSetup.H * .BS 2 ByteCount SMB.SessionSetup.Guest * .AZ "" Password .AZ "Guest" Account Name .AZ "?" Primary Domain SMB.SessionSetup.Guest.Len .EQ *-SMB.SessionSetup.Guest SMB.SessionSetup.T .AZ "A2osX" Native OS .AZ "A2osX-CIFSD" Native LANMAN SMB.SessionSetup.T.Len .EQ *-SMB.SessionSetup.T *-------------------------------------- SMB.TreeConnect.H .DA #4 WORD COUNT .HS FF000000 NO MORE CMD .DA 0 .DA 1 PASSWORD LEN (1 for "\0") SMB.TreeConnect.H.Len .EQ *-SMB.TreeConnect.H * .BS 2 ByteCount * .AZ "" PASSWORD * .AZ "_temp" PATH SMB.TreeConnect.T .AZ "A:" Disk Share SMB.TreeConnect.T.Len .EQ *-SMB.TreeConnect.T *-------------------------------------- SMB.ComCreate.H .DA #24 WORD COUNT .HS FF000000 NO MORE CMD .HS 00 Reserved .BS 2 NameLength .HS 00000000 Flags .HS 00000000 RootDirectoryFID .BS 4 DesiredAccess .HS 0000000000000000 AllocationSize .HS 00000000 ExtFileAttributes .HS 00000000 ShareAccess .BS 4 CreateDisposition .HS 00000000 CreateOptions .HS 00000000 ImpersonationLevel .HS 00 SecurityFlags SMB.ComCreate.H.Len .EQ *-SMB.ComCreate.H * .BS 2 ByteCount * .AZ "path\file" *-------------------------------------- SMB.ComClose.H .DA #3 WORD COUNT .BS 2 FID .HS 00000000 LastTimeModified .HS 0000 ByteCount SMB.ComClose.H.Len .EQ *-SMB.ComClose.H *-------------------------------------- SMB.ComRead.H .DA #10 WORD COUNT .HS FF000000 NO MORE CMD .BS 2 FID .BS 4 Offset .BS 2 MaxCountOfBytesToReturn .HS 0000 MinCountOfBytesToReturn .HS 00000000 Timeout .HS 0000 Remaining .HS 0000 ByteCount SMB.ComRead.H.Len .EQ *-SMB.ComRead.H *-------------------------------------- SMB.ComWrite.H .DA #12 WORD COUNT .HS FF000000 NO MORE CMD .BS 2 FID .BS 4 Offset .HS 00000000 Timeout .HS 0001 WriteMode=WritethroughMode .HS 0000 Remaining .HS 0000 Reserved .BS 2 DataLength .BS 2 DataOffset SMB.ComWrite.H.Len .EQ *-SMB.ComWrite.H * .BS 2 ByteCount * DATA..... *-------------------------------------- SMB.Trans2.H .DA #15 WORD COUNT .BS 2 TotalParamCount .DA 0 TotalDataCount .DA 10 MaxParameterCount .DA 450 MaxDataCount .DA #0 MaxSetupCount .HS 00 Reserved1 .DA 0 Flags .HS 00000000 Timeout .HS 0000 Reserved2 .BS 2 ParameterCount .DA 68 ParameterOffset .HS 0000 DataCount .HS 0000 DataOffset .DA #1 SetupCount .HS 00 Reserved3 SMB.Trans2.H.Len .EQ *-SMB.Trans2.H *-------------------------------------- SMB.FindFirst2 .DA 1 TRANS2_FIND_FIRST2 .BS 2 PrmCnt .HS 000000 Padding .DA $0037 SearchAttributes .DA 1024 SearchCount .DA 2 Flags .DA SMB_INFO_STANDARD InformationLevel .HS 00000000 SearchStorageType * .AZ "path\*" SMB.FindFirst2.Len .EQ *-SMB.FindFirst2 *-------------------------------------- SMB.FindNext2 .DA 2 TRANS2_FIND_NEXT2 .BS 2 PrmCnt .HS 000000 Padding .BS 2 SID .DA 1024 SearchCount .DA SMB_INFO_STANDARD InformationLevel .HS 00000000 ResumeKey .DA 2+8 Flags * .AZ "path\*" SMB.FindNext2.Len .EQ *-SMB.FindNext2 *-------------------------------------- SMB.QueryPathInfo .DA 5 TRANS2_QUERY_PATH_INFORMATION .BS 2 PrmCnt .HS 000000 Padding .DA SMB_INFO_STANDARD InformationLevel .HS 00000000 SearchStorageType * .AZ "filename" SMB.QueryPathInfo.Len .EQ *-SMB.QueryPathInfo *-------------------------------------- SMB.CreateDirectory .DA 13 TRANS2_CREATE_DIRECTORY .BS 2 PrmCnt .HS 000000 Padding .HS 00000000 Reserved * .AZ "DirName" SMB.CreateDirectory.Len .EQ *-SMB.CreateDirectory *-------------------------------------- LIBTCPIP .AZ "libtcpip" hLIBTCPIP .BS 1 pLIBTCPIP .BS 2 hSocket .BS 1 hReq .BS 1 *-------------------------------------- CIFS.Status .BS 1 CIFS.PID .BS 1 CIFS.Retries .BS 1 *-------------------------------------- MountTable .BS 2 pMountPoint .BS 1 hSMBContext .BS 1 hSocket *-------------------------------------- hFILE .BS 1 StatBuf .BS S.STAT *-------------------------------------- MAN SAVE usr/src/lib/libcifs.s ASM