A2osX/LIB/LIBCIFS.S.txt

914 lines
16 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF lib/libcifs
*--------------------------------------
.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
*--------------------------------------
.DUMMY
.OR ZPLIB
ZS.START
ZPReqPtr .BS 2
ZPReqLen .BS 2
ZPCtxPtr .BS 2
ZPRespPtr .BS 2
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 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.MKNod
.DA CIFS.MKFIFO
.DA CIFS.Pipe
.DA CIFS.OpenDir
.DA CIFS.ReadDir
.DA CIFS.CloseDir
.DA CIFS.Open
.DA CIFS.Close
.DA CIFS.Read
.DA CIFS.Write
.DA CIFS.ChOwn
J.CIFS2 .DA CIFS2.ChTyp
.DA CIFS2.ChMod
.DA CIFS2.FStat
.DA CIFS2.Stat
.DA CIFS2.MKDir
.DA CIFS2.MKNod
.DA CIFS2.MKFIFO
.DA CIFS2.Pipe
.DA CIFS2.OpenDir
.DA CIFS2.ReadDir
.DA CIFS2.CloseDir
.DA CIFS2.Open
.DA CIFS2.Close
.DA CIFS2.Read
.DA CIFS2.Write
.DA CIFS2.ChOwn
L.LIBTCPIP .DA LIBTCPIP
L.SMB.TRANSPORT .DA SMB.TRANSPORT
.DA 0
*--------------------------------------
LIB.LOAD >LDYA L.LIBTCPIP
>SYSCALL2 LoadLib
bcs .9
sta hLIBTCPIP
>SYSCALL2 GetMemPtr
>STYA pLIBTCPIP
>LDYAI 256
>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)
>PUSHWI SMB.NegReq.end-SMB.TRANSPORT
>PUSHW L.SMB.TRANSPORT
ldy #1+4 hSocket
lda (pStack),y
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 #3
lda (ZPRespPtr),y
clc
adc #4 + NETBIOS header
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
>PUSHYA
>PUSHW ZPReqPtr
ldy #6+4 hSocket
lda (pStack),y
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
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
>PUSHYA
>PUSHW ZPReqPtr
ldy #4+4 hSocket
lda (pStack),y
ldx #LIBTCPIP.Send
jsr GO.LIBTCPIP
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
clc
pla
.9 >RET 4
*--------------------------------------
CIFS.UMount clc
rts
*--------------------------------------
CIFS.CallBack bit CIFS.Status
bmi .1
jmp (J.CIFS,x)
.1 ldy #S.PS.PID
lda (pPS),y
cmp CIFS.PID
bne .8
jmp (J.CIFS2,x)
.8 lda #0
sec
rts
*--------------------------------------
CIFS.ChTyp
CIFS2.ChTyp
*--------------------------------------
CIFS.ChMod
CIFS2.ChMod
*--------------------------------------
CIFS.FStat
*--------------------------------------
CIFS2.FStat lda #MLI.E.BADCALL
sec
rts
*--------------------------------------
CIFS.Stat >STYA ZPPtr1 resolved path
lda MountTable+2
>SYSCALL2 GetMemPtr
>STYA ZPCtxPtr
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
ldx #0
.2 lda SMB.QueryPathInfo,x
sta (ZPReqPtr),y
iny
inx
cpx #SMB.QueryPathInfo.Len
bne .2
.3 lda (ZPPtr1)
inc ZPPtr1
bne .4
inc ZPPtr1+1
.4 sta (ZPReqPtr),y
iny
tax
bne .3
jsr SetT2ReqLenYA
>PUSHYA
>PUSHW ZPReqPtr
lda MountTable+3 hSocket
ldx #LIBTCPIP.Send
jsr GO.LIBTCPIP
bcs .9
ldy #S.PS.PID
lda (pPS),y
sta CIFS.PID
dec CIFS.Status
lda #0
sec
rts
lda #MLI.E.INVPATH
sec
.9 >RET 4
*--------------------------------------
CIFS2.Stat lda MountTable+3 hSocket
ldx #LIBTCPIP.Recv
jsr GO.LIBTCPIP
bcs .9
jsr GetRespData
ldy #S.NETBIOS+S.SMB.H.STATUS
lda (ZPRespPtr),y
beq .1
lda #MLI.E.FNOTFND
bra .99
.1 >PULLW ZPPtr1
inc pStack
inc pStack
stz CIFS.Status
clc
rts
.9 cmp #E.NODATA
bne .99
dec CIFS.Retries
beq .90
lda #0
sec
rts
.90 lda #MLI.E.IO
.99 sec
stz CIFS.Status
>RET 4
*--------------------------------------
CIFS.MKDir
CIFS2.MKDir
*--------------------------------------
CIFS.MKNod
CIFS2.MKNod
*--------------------------------------
CIFS.MKFIFO
CIFS2.MKFIFO
*--------------------------------------
CIFS.Pipe
CIFS2.Pipe lda #MLI.E.BADCALL
sec
rts
*--------------------------------------
CIFS.OpenDir >STYA ZPPtr1 resolved path
>SYSCALL2 PutS
>LDYAI S.FD.DIR
>SYSCALL2 GetMem
bcs .9
>STYA ZPPtr2
lda #S.FD.T.DIR
sta (ZPPtr2)
>PUSHW ZPPtr1
>PUSHWI 0
txa
>PUSHA
>SYSCALL2 mknod
.9 rts
CIFS2.OpenDir lda #MLI.E.BADCALL
sec
rts
*--------------------------------------
CIFS.ReadDir
CIFS2.ReadDir lda #MLI.E.INVPATH
sec
rts
*--------------------------------------
CIFS.CloseDir
CIFS2.CloseDir
*--------------------------------------
CIFS.Open
CIFS2.Open
*--------------------------------------
CIFS.Close
CIFS2.Close
*--------------------------------------
CIFS.Read
CIFS2.Read
*--------------------------------------
CIFS.Write
CIFS2.Write
*--------------------------------------
CIFS.ChOwn
CIFS2.ChOwn
lda #MLI.E.BADCALL
sec
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
*--------------------------------------
* 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
>LDYA ZPReqLen
rts
*--------------------------------------
GetRespData sta hResp
>SYSCALL2 GetMemPtr
pha
tya
* clc
adc #S.TCP
sta ZPRespPtr
pla
adc /S.TCP
sta ZPRespPtr+1
rts
*--------------------------------------
GO.LIBTCPIP jmp (pLIBTCPIP)
*--------------------------------------
CS.END
*--------------------------------------
LIBTCPIP .AZ "libtcpip"
hLIBTCPIP .BS 1
pLIBTCPIP .BS 2
hSocket .BS 1
hReq .BS 1
hResp .BS 1
*--------------------------------------
CIFS.Status .BS 1
CIFS.PID .BS 1
CIFS.Retries .BS 1
*--------------------------------------
MountTable .BS 2 pMountPoint
.BS 1 hSMBContext
.BS 1 hSocket
*--------------------------------------
SMB.TRANSPORT .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.Trans2.H .DA #15 WORD COUNT
.BS 2 TotalParamCount
.DA 0 TotalDataCount
.DA 2 MaxParameterCount
.DA 40 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.QueryPathInfo
.DA 5 TRANS2_QUERY_PATH_INFORMATION
.BS 2 PrmCnt
.HS 000000 Padding
.DA SMB_INFO_STANDARD InformationLevel
.HS 00000000 SearchStorageType
* .AZ "file" FileName
SMB.QueryPathInfo.Len .EQ *-SMB.QueryPathInfo
*--------------------------------------
SMB.FindFirst .DA 1 TRANS2_FIND_FIRST2
.BS 2 PrmCnt
.HS 00 Padding
.DA $0016 SearchAttributes
.DA 1024 SearchCount
.DA 2 Flags
.DA SMB_INFO_STANDARD InformationLevel
* .AZ "*.*" FileName
SMB.FindFirst.end .EQ *-SMB.FindFirst
*--------------------------------------
SMB.FindNext .DA 2 TRANS2_FIND_NEXT2
.BS 2 PrmCnt
.HS 00 Padding
.BS 2 SID
.DA 1024 SearchCount
.DA SMB_INFO_STANDARD InformationLevel
.HS 00000000 ResumeKey
.DA 2 Flags
* .AZ "*.*" FileName
SMB.FindNext.end .EQ *-SMB.FindNext
*--------------------------------------
MAN
SAVE usr/src/lib/libcifs.s
ASM