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
ZPRespPtr		.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
pFD				.BS 2

bFlag			.BS 1
ByteCountOfs	.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.H		.DA NETBIOS.H
				.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.H
				>PUSHWI SMB.NegReq.end-NETBIOS.H

				ldx #LIBTCPIP.Send
			jsr GO.LIBTCPIP
				bcs .99

				lda #0
				sec
				rts
*--------------------------------------
.1				dec
				sta (pStack)
				beq .98

				ldy #1					hSocket
				lda (pStack),y

				jsr ReadSocketA
				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

				txa						hSMBContext

				jsr FreeRespData

				clc
				bra .99

.97				jsr FreeRespData

.98				lda #MLI.E.INVPARAM

.99				>RET 2
*--------------------------------------
* >PUSHB hSocket
* >PUSHB hSMBContext
* >PUSHW domain
* >PUSHW username
* >PUSHW password
* >PUSHBI 0
* >LIBCALL SessionSetup
* (SMBContext updated with UID)
*--------------------------------------
CIFS.SessionSetup
				lda (pStack)
				bne .5

				dec
				sta (pStack)

				ldy #7					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

				jsr ReqSetupPtr2

				ldx #0

.3				lda SMB.SessionSetup.Guest,x
				jsr PutBytePtr2
				inx
				cpx #SMB.SessionSetup.Guest.Len
				bne .3

				ldx #0

.4				lda SMB.SessionSetup.T,x
				jsr PutBytePtr2
				inx
				cpx #SMB.SessionSetup.T.Len
				bne .4

				jsr Add2ByteCount

				jsr SetReqLen

				ldy #8					hSocket
				lda (pStack),y
				jsr WriteSocketA
				bcs .99

				lda #0
				sec
				rts
*--------------------------------------
.5				dec
				sta (pStack)
				beq .98

				ldy #8					hSocket
				lda (pStack),y
				jsr ReadSocketA
				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 #7					hSMBContext
				jsr GetSMBContext

				ldy #S.NETBIOS+S.SMB.H.UID
				lda (ZPRespPtr),y
				sta (ZPCtxPtr),y
				iny
				lda (ZPRespPtr),y
				sta (ZPCtxPtr),y

.8				jsr FreeRespData

				clc
				bra .99

.97				jsr FreeRespData

.98				lda #MLI.E.LOCKED
				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 pPath
				iny
				lda (pStack),y
				sta pPath+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

				jsr ReqSetupPtr2

				lda #0
				jsr PutBytePtr2			PASSWORD = "\0"

				jsr AppendPathPtr2
				jsr AddYReqLenPtr2
				
				ldx #0

.4				lda SMB.TreeConnect.T,x
				jsr PutBytePtr2
				inx
				cpx #SMB.TreeConnect.T.Len
				bne .4

				jsr SetReqLen

				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
				jsr ReadSocketA
				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				jsr FreeRespData

				clc
				bra .99

.97				jsr FreeRespData

.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)
*--------------------------------------
GetCTX			lda MountTable+2
				>SYSCALL2 GetMemPtr
				>STYA ZPCtxPtr
				rts
*--------------------------------------
GetSMBContext	lda (pStack),y
				>SYSCALL2 GetMemPtr
				>STYA ZPCtxPtr
				rts
*--------------------------------------
RequestT2SetupX	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
*--------------------------------------
RequestSetupX	phx

				lda hReq
				>SYSCALL2 GetMemPtr
				>STYA ZPReqPtr

				ldy #0

.1				lda (ZPCtxPtr),y
				cpy #S.NETBIOS+S.SMB.H.CMD
				bne .2

				pla

.2				sta (ZPReqPtr),y
				iny
				cpy #S.NETBIOS+S.SMB.H
				bne .1

				rts
*--------------------------------------
ReqSetupPtr2	sty ByteCountOfs

				lda #0
				sta (ZPReqPtr),y		Reset ByteCount
				iny
				sta (ZPReqPtr),y
				iny						+2 for ByteCount

ReqT2SetupPtr2	sty ZPReqLen
				stz ZPReqLen+1

				tya

				clc
				adc ZPReqPtr
				sta ZPPtr2

				lda ZPReqPtr+1
				adc #0
				sta ZPPtr2+1

				rts
*--------------------------------------
PutBytePtr2		sta (ZPPtr2)
				inc ZPPtr2
				bne .1
				
				inc ZPPtr2+1
				
.1				inc ZPReqLen
				bne .8
				
				inc ZPReqLen+1
				
.8				rts				
*--------------------------------------
AppendPathPtr2	ldx #0

				ldy #$ff

.1				iny
				lda (pPath),y
				beq .4

.2				cmp #'/'
				bne .3

				lda #'\'

.3				sta (ZPPtr2),y
				tax
				bra .1

.4				cpx #'\'
				bne .5

				dey

.5				sta (ZPPtr2),y			A = 0

				rts
*--------------------------------------
AppendTypePtr2	ldx #0

.1				cmp PRODOS.FT.HEX,x
				beq .4
				
				inx
				cpx #PRODOS.FT.TXT-PRODOS.FT.HEX
				bne .1

				pha
				lsr
				lsr
				lsr
				lsr

				ora #$30
				cmp #'9'+1
				bcc .2

				adc #6

.2				sta PRODOS.FT.DFLT+1
				pla
				and #$0F

				ora #$30
				cmp #'9'+1
				bcc .3

				adc #6

.3				sta PRODOS.FT.DFLT+2

.4				txa
				asl
				asl
				tax
			
				lda #'.'
				sta (ZPPtr2),y
				iny
				
.6				lda PRODOS.FT.TXT,x
				sta (ZPPtr2),y
				beq .8
				
				inx
				iny
				bra .6

.8				rts
*--------------------------------------
Add2ByteCount	ldy ByteCountOfs
				clc
				adc (ZPReqPtr),y
				sta (ZPReqPtr),y

				iny						ByteCountOfs+1
				
				lda #0
				adc (ZPReqPtr),y
				sta (ZPReqPtr),y
				rts
*--------------------------------------
AddYReqLenPtr2	tya

				sec						+1 for \0

				adc ZPPtr2
				sta ZPPtr2
				bcc AddYReqLen
				
				inc ZPPtr2+1
*--------------------------------------
AddYReqLen		tya

				sec						+1 for \0

				adc ZPReqLen
				sta ZPReqLen
				bcc .8
				
				inc ZPReqLen+1

.8				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
*--------------------------------------
SetT2ReqLenYA	sty ZPReqLen
				stz ZPReqLen+1

SetT2ReqLen		lda ZPReqLen
				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
*--------------------------------------
SetReqLen		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

Sleep2			stz CIFS.Retries

				lda #0
				sec
				rts
*--------------------------------------
Exit.OK			jsr FreeRespData

				stz CIFS.Status
*				clc
				rts
*--------------------------------------
Exit.NODATA		cmp #E.NODATA
				bne .99

				dec CIFS.Retries
				beq .98

				lda #0
				sec
				rts

.98				lda #MLI.E.OFFLINE

.99				stz CIFS.Status
				sec
				rts
*--------------------------------------
GetRespData		sta hResp
				>SYSCALL2 GetMemPtr

				pha
				tya
*				clc
				adc #S.TCP
				sta	ZPRespPtr
				pla
				adc /S.TCP
				sta	ZPRespPtr+1
				rts
*--------------------------------------
GetRespDataPtr1	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
*--------------------------------------
CheckSMBStatus	ldy #S.NETBIOS+S.SMB.H.STATUS
				lda (ZPRespPtr),y
				clc
				beq FreeRespData.RTS

				stz CIFS.Status

				cmp #2					SRV
				bcs .9
				
				iny
				iny
				
				lda (ZPRespPtr),y		ERR CODE
				ldx #MLIERR01-SMBERR01

.1				cmp SMBERR01-1,x
				beq .2					CS
				
				dex
				bne .1
				
.9				lda #MLI.E.IO
				sec
				bra FreeRespData
				
.2				lda MLIERR01-1,x
*--------------------------------------
FreeRespData	php
				pha
				lda hResp
				>SYSCALL2 FreeMem
				pla
				plp

FreeRespData.RTS
				rts
*--------------------------------------
FileInfo2StatBuf
				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				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
*--------------------------------------
AddA2Ptr1		adc ZPPtr1
				sta ZPPtr1
				bcc .8

				inc ZPPtr1+1

.8				rts
*--------------------------------------
StatBuf2Ptr2	ldy #S.STAT-1

.1				lda StatBuf,y
				sta (ZPPtr2),y
				dey
				bpl .1

				rts
*--------------------------------------
AddSTAT2Ptr2	lda #S.STAT
				clc
*--------------------------------------
AddA2Ptr2		adc ZPPtr2
				sta ZPPtr2
				bcc .8

				inc ZPPtr2+1

.8				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

ReadSocketA		ldx #LIBTCPIP.Recv
GO.LIBTCPIP		jmp (pLIBTCPIP)
*--------------------------------------
CIFS.BADCALL	lda #MLI.E.BADCALL
				sec
				rts
*--------------------------------------
				.INB usr/src/lib/libcifs.io.s
*--------------------------------------
CS.END
PRODOS.FT.HEX	.HS 0406FAFCFDCBCCCFFF
PRODOS.FT.TXT	.AZ "txt"
				.AZ "bin"
				.AZ "asm"
				.AZ "bas"
				.AZ "var"
				.AZ "pix"
				.AZ "fon"
				.AZ "pak"
				.AZ "sys"
PRODOS.FT.END	.EQ *-PRODOS.FT.TXT
PRODOS.FT.DFLT	.AZ "$  "
*--------------------------------------
SMBERR01		.DA #2,#3,#32
MLIERR01		.DA #MLI.E.FNOTFND,#MLI.E.PNOTFND,#MLI.E.OPEN
*--------------------------------------
NETBIOS.H		.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
			.BS 2						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
				.HS 00000010			DesiredAccess = GENERIC_ALL
				.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.ComFlush.H	.DA #1					WORD COUNT
			.BS 2						FID
				.HS 0000				ByteCount
SMB.ComFlush.H.Len	.EQ *-SMB.ComFlush.H
*--------------------------------------
SMB.ComDelete.H	.DA #1					WORD COUNT
				.HS 0000				SearchAttributes
SMB.ComDelete.H.Len	.EQ *-SMB.ComDelete.H
*			.BS 2						ByteCount
*			.HS 04						BufferFormat
*			.AZ "path\file"
*--------------------------------------
SMB.ComRename.H	.DA #1					WORD COUNT
				.HS 0000				SearchAttributes
SMB.ComRename.H.Len	.EQ *-SMB.ComRename.H
*			.BS 2						ByteCount
*			.HS 04						BufferFormat
*			.AZ "oldpath"
*			.HS 04						BufferFormat
*			.AZ "newpath"
*--------------------------------------
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
SMB.ComRead.H.Len	.EQ *-SMB.ComRead.H
*			.BS 2						ByteCount
*--------------------------------------
SMB.ComWrite.H	.DA #12					WORD COUNT
				.HS FF000000			NO MORE CMD
			.BS 2						FID
			.BS 4						Offset
				.HS 00000000			Timeout
				.HS 0000
*				.HS 0100				WriteMode=WritethroughMode
				.HS 0000				Remaining
				.HS 0000				Reserved
			.BS 2						DataLength
				.DA S.SMB.H+SMB.ComWrite.H.Len+2	DataOffset (+2 skip ByteCount)
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
CIFS.Cnt		.BS 2
*--------------------------------------
MountTable		.BS 2					pMountPoint
				.BS 1					hSMBContext
				.BS 1					hSocket
*--------------------------------------
hFD				.BS 1
hFILE			.BS 1
StatBuf			.BS S.STAT
*--------------------------------------
MAN
SAVE usr/src/lib/libcifs.s
ASM
