package  smb2 
 
import  "github.com/hirochachacha/go-smb2/internal/utf16le"  
 
 
 
 
 
type  ErrorResponse  struct  { 
	PacketHeader  
 
	ErrorData Encoder   
} 
 
func  (c  *ErrorResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *ErrorResponse ) Size () int  { 
	if  c .ErrorData  == nil  { 
		return  64  + 8  + 1  
	} 
	return  64  + 8  + c .ErrorData .Size () 
} 
 
 
func  (c  *ErrorResponse ) Encode (pkt  []byte ) { 
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 9 )  
	if  c .ErrorData  != nil  { 
		le .PutUint16 (res [2 :4 ], uint16 (c .ErrorData .Size ())) 
		c .ErrorData .Encode (res [8 :]) 
 
		if  e , ok  := c .ErrorData .(ErrorContextListResponse ); ok  { 
			res [2 ] = uint8 (len (e )) 
		} 
	} 
} 
 
type  ErrorResponseDecoder  []byte  
 
func  (r  ErrorResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 8  { 
		return  true  
	} 
 
	if  r .StructureSize () != 9  { 
		return  true  
	} 
 
	if  uint32 (len (r )) < 8 +r .ByteCount () { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  ErrorResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  ErrorResponseDecoder ) ErrorContextCount () uint8  { 
	return  r [2 ] 
} 
 
func  (r  ErrorResponseDecoder ) ByteCount () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  ErrorResponseDecoder ) ErrorData () []byte  { 
	return  r [8  : 8 +r .ByteCount ()] 
} 
 
 
 
 
 
 
 
type  ErrorContextListResponse  []*ErrorContextResponse  
 
func  (c  ErrorContextListResponse ) Size () int  { 
	size  := 0  
	for  _ , ec  := range  c  { 
		size  = Roundup (size , 8 ) 
		size  += ec .Size () 
	} 
	return  size  
} 
 
func  (c  ErrorContextListResponse ) Encode (p  []byte ) { 
	off  := 0  
	for  _ , ec  := range  c  { 
		off  = Roundup (off , 8 ) 
 
		ec .Encode (p [off :]) 
 
		off  += ec .Size () 
	} 
} 
 
type  ErrorContextResponse  struct  { 
	ErrorId uint32  
 
	ErrorData Encoder  
} 
 
func  (c  *ErrorContextResponse ) Size () int  { 
	return  8  + c .ErrorData .Size () 
} 
 
func  (c  *ErrorContextResponse ) Encode (p  []byte ) { 
	le .PutUint32 (p [:4 ], uint32 (c .ErrorData .Size ())) 
	le .PutUint32 (p [4 :8 ], c .ErrorId ) 
	if  c .ErrorData  != nil  { 
		c .ErrorData .Encode (p [8 :]) 
	} 
} 
 
type  ErrorContextResponseDecoder  []byte  
 
func  (ctx  ErrorContextResponseDecoder ) IsInvalid () bool  { 
	if  len (ctx ) < 8  { 
		return  true  
	} 
 
	if  uint32 (len (ctx )) < 8 +ctx .ErrorDataLength () { 
		return  true  
	} 
 
	return  false  
} 
 
func  (ctx  ErrorContextResponseDecoder ) ErrorDataLength () uint32  { 
	return  le .Uint32 (ctx [:4 ]) 
} 
 
func  (ctx  ErrorContextResponseDecoder ) ErrorId () uint32  { 
	return  le .Uint32 (ctx [4 :8 ]) 
} 
 
func  (ctx  ErrorContextResponseDecoder ) ErrorContextData () []byte  { 
	return  ctx [8  : 8 +ctx .ErrorDataLength ()] 
} 
 
func  (ctx  ErrorContextResponseDecoder ) Next () int  { 
	return  8  + Roundup (int (ctx .ErrorDataLength ()), 8 ) 
} 
 
 
 
 
 
type  SmallBufferErrorResponse  struct  { 
	RequiredBufferLength uint32  
} 
 
func  (c  *SmallBufferErrorResponse ) Size () int  { 
	return  4  
} 
 
func  (c  *SmallBufferErrorResponse ) Encode (p  []byte ) { 
	le .PutUint32 (p [:4 ], c .RequiredBufferLength ) 
} 
 
type  SmallBufferErrorResponseDecoder  []byte  
 
func  (r  SmallBufferErrorResponseDecoder ) IsInvalid () bool  { 
	return  len (r ) != 4  
} 
 
func  (r  SmallBufferErrorResponseDecoder ) RequiredBufferLength () uint32  { 
	return  le .Uint32 (r ) 
} 
 
type  SymbolicLinkErrorResponse  struct  { 
	UnparsedPathLength uint16  
	Flags              uint32  
	SubstituteName     string  
	PrintName          string  
} 
 
func  (c  *SymbolicLinkErrorResponse ) Size () int  { 
	return  28  + utf16le .EncodedStringLen (c .SubstituteName ) + utf16le .EncodedStringLen (c .PrintName ) 
} 
 
func  (c  *SymbolicLinkErrorResponse ) Encode (p  []byte ) { 
	slen  := utf16le .EncodeString (p [24 :], c .SubstituteName ) 
	plen  := utf16le .EncodeString (p [24 +slen :], c .PrintName ) 
 
	le .PutUint32 (p [:4 ], uint32 (len (p )-4 ))  
	le .PutUint32 (p [4 :8 ], 0x4c4d5953 ) 
	le .PutUint32 (p [8 :12 ], IO_REPARSE_TAG_SYMLINK ) 
	le .PutUint16 (p [14 :16 ], c .UnparsedPathLength ) 
	le .PutUint32 (p [24 :28 ], c .Flags ) 
	le .PutUint16 (p [12 :14 ], uint16 (len (p )-12 ))  
	le .PutUint16 (p [16 :18 ], 0 )                  
	le .PutUint16 (p [18 :20 ], uint16 (slen ))       
	le .PutUint16 (p [20 :22 ], uint16 (slen ))       
	le .PutUint16 (p [22 :24 ], uint16 (plen ))       
} 
 
type  SymbolicLinkErrorResponseDecoder  []byte  
 
func  (r  SymbolicLinkErrorResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 28  { 
		return  true  
	} 
 
	if  r .SymLinkErrorTag () != 0x4c4d5953  { 
		return  true  
	} 
 
	if  r .ReparseTag () != IO_REPARSE_TAG_SYMLINK  { 
		return  true  
	} 
 
	tlen  := int (r .SymLinkLength ()) 
	rlen  := int (r .ReparseDataLength ()) 
	soff  := int (r .SubstituteNameOffset ()) 
	slen  := int (r .SubstituteNameLength ()) 
	poff  := int (r .PrintNameOffset ()) 
	plen  := int (r .PrintNameLength ()) 
 
	if  (soff &1  | poff &1 ) != 0  { 
		return  true  
	} 
 
	if  len (r ) < 4 +tlen  { 
		return  true  
	} 
 
	if  tlen  < 12 +rlen  { 
		return  true  
	} 
 
	if  rlen  < 12 +soff +slen  || rlen  < 12 +poff +plen  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) SymLinkLength () uint32  { 
	return  le .Uint32 (r [:4 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) SymLinkErrorTag () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) ReparseTag () uint32  { 
	return  le .Uint32 (r [8 :12 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) ReparseDataLength () uint16  { 
	return  le .Uint16 (r [12 :14 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) UnparsedPathLength () uint16  { 
	return  le .Uint16 (r [14 :16 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) SubstituteNameOffset () uint16  { 
	return  le .Uint16 (r [16 :18 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) SubstituteNameLength () uint16  { 
	return  le .Uint16 (r [18 :20 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) PrintNameOffset () uint16  { 
	return  le .Uint16 (r [20 :22 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) PrintNameLength () uint16  { 
	return  le .Uint16 (r [22 :24 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) Flags () uint32  { 
	return  le .Uint32 (r [24 :28 ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) PathBuffer () []byte  { 
	return  r [28 :] 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) SubstituteName () string  { 
	off  := r .SubstituteNameOffset () 
	len  := r .SubstituteNameLength () 
	return  utf16le .DecodeToString (r .PathBuffer ()[off  : off +len ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) PrintName () string  { 
	off  := r .PrintNameOffset () 
	len  := r .PrintNameLength () 
	return  utf16le .DecodeToString (r .PathBuffer ()[off  : off +len ]) 
} 
 
func  (r  SymbolicLinkErrorResponseDecoder ) SplitUnparsedPath (name  string ) (string , string ) { 
	ws  := UTF16FromString (name ) 
	ulen  := int (r .UnparsedPathLength ()) 
	if  ulen /2  > len (ws ) { 
		return  "" , ""  
	} 
 
	return  UTF16ToString (ws [:len (ws )-ulen /2 ]), UTF16ToString (ws [len (ws )-ulen /2 :]) 
} 
 
 
 
 
 
type  NegotiateResponse  struct  { 
	PacketHeader  
 
	SecurityMode    uint16  
	DialectRevision uint16  
	ServerGuid      [16 ]byte  
	Capabilities    uint32  
	MaxTransactSize uint32  
	MaxReadSize     uint32  
	MaxWriteSize    uint32  
	SystemTime      *Filetime  
	ServerStartTime *Filetime  
	SecurityBuffer  []byte  
 
	Contexts []Encoder  
} 
 
func  (c  *NegotiateResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *NegotiateResponse ) Size () int  { 
	size  := 64  + len (c .SecurityBuffer ) 
 
	for  _ , cc  := range  c .Contexts  { 
		size  = Roundup (size , 8 ) 
 
		size  += cc .Size () 
	} 
 
	if  size  == 64  { 
		return  64  + 64  + 1  
	} 
 
	return  64  + size  
} 
 
func  (c  *NegotiateResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_NEGOTIATE  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 65 )  
	le .PutUint16 (res [2 :4 ], c .SecurityMode ) 
	le .PutUint16 (res [4 :6 ], c .DialectRevision ) 
	copy (res [8 :24 ], c .ServerGuid [:]) 
	le .PutUint32 (res [24 :28 ], c .Capabilities ) 
	le .PutUint32 (res [28 :32 ], c .MaxTransactSize ) 
	le .PutUint32 (res [32 :36 ], c .MaxReadSize ) 
	le .PutUint32 (res [36 :40 ], c .MaxWriteSize ) 
	c .SystemTime .Encode (res [40 :48 ]) 
	c .ServerStartTime .Encode (res [48 :56 ]) 
 
	 
	{ 
		copy (res [64 :], c .SecurityBuffer ) 
		le .PutUint16 (res [56 :58 ], 64 +64 )                          
		le .PutUint16 (res [58 :60 ], uint16 (len (c .SecurityBuffer )))  
	} 
 
	off  := 64  + len (c .SecurityBuffer ) 
 
	for  i , cc  := range  c .Contexts  { 
		off  = Roundup (off , 8 ) 
 
		if  i  == 0  { 
			le .PutUint32 (res [60 :64 ], uint32 (off +64 ))  
		} 
 
		cc .Encode (res [off :]) 
 
		off  += cc .Size () 
	} 
 
	le .PutUint16 (res [6 :8 ], uint16 (len (c .Contexts )))  
} 
 
type  NegotiateResponseDecoder  []byte  
 
func  (r  NegotiateResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 64  { 
		return  true  
	} 
 
	if  r .StructureSize () != 65  { 
		return  true  
	} 
 
	if  len (r ) < int (r .SecurityBufferOffset ()+r .SecurityBufferLength ())-64  { 
		return  true  
	} 
 
	if  r .DialectRevision () == SMB311  { 
		noff  := r .NegotiateContextOffset () 
 
		if  noff &7  != 0  { 
			return  true  
		} 
 
		if  len (r ) < int (noff )-64  { 
			return  true  
		} 
	} 
 
	return  false  
} 
 
func  (r  NegotiateResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) SecurityMode () uint16  { 
	return  le .Uint16 (r [2 :4 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) DialectRevision () uint16  { 
	return  le .Uint16 (r [4 :6 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) ServerGuid () []byte  { 
	return  r [8 :24 ] 
} 
 
func  (r  NegotiateResponseDecoder ) Capabilities () uint32  { 
	return  le .Uint32 (r [24 :28 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) MaxTransactSize () uint32  { 
	return  le .Uint32 (r [28 :32 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) MaxReadSize () uint32  { 
	return  le .Uint32 (r [32 :36 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) MaxWriteSize () uint32  { 
	return  le .Uint32 (r [36 :40 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) SystemTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [40 :48 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) ServerStartTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [48 :56 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) SecurityBufferOffset () uint16  { 
	return  le .Uint16 (r [56 :58 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) SecurityBufferLength () uint16  { 
	return  le .Uint16 (r [58 :60 ]) 
} 
 
 
 
 
 
func  (r  NegotiateResponseDecoder ) SecurityBuffer () []byte  { 
	off  := r .SecurityBufferOffset () 
	if  off  < 64 +64  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .SecurityBufferLength () 
	return  r [off  : off +len ] 
} 
 
 
 
func  (r  NegotiateResponseDecoder ) NegotiateContextCount () uint16  { 
	return  le .Uint16 (r [6 :8 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) NegotiateContextOffset () uint32  { 
	return  le .Uint32 (r [60 :64 ]) 
} 
 
func  (r  NegotiateResponseDecoder ) NegotiateContextList () []byte  { 
	off  := r .NegotiateContextOffset () 
	if  off  < 64  { 
		return  nil  
	} 
	return  r [off -64 :] 
} 
 
 
 
 
 
type  SessionSetupResponse  struct  { 
	PacketHeader  
 
	SessionFlags   uint16  
	SecurityBuffer []byte  
} 
 
func  (c  *SessionSetupResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *SessionSetupResponse ) Size () int  { 
	if  len (c .SecurityBuffer ) == 0  { 
		return  64  + 8  + 1  
	} 
 
	return  64  + 8  + len (c .SecurityBuffer ) 
} 
 
func  (c  *SessionSetupResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_SESSION_SETUP  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 9 )  
	le .PutUint16 (res [2 :4 ], c .SessionFlags ) 
 
	if  len (c .SecurityBuffer ) != 0  { 
		le .PutUint16 (res [4 :6 ], 8 +64 )  
 
		copy (res [8 :], c .SecurityBuffer ) 
 
		le .PutUint16 (res [6 :8 ], uint16 (len (c .SecurityBuffer ))) 
	} 
} 
 
type  SessionSetupResponseDecoder  []byte  
 
func  (r  SessionSetupResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 8  { 
		return  true  
	} 
 
	if  r .StructureSize () != 9  { 
		return  true  
	} 
 
	if  len (r ) < int (r .SecurityBufferOffset ()+r .SecurityBufferLength ())-64  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  SessionSetupResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  SessionSetupResponseDecoder ) SessionFlags () uint16  { 
	return  le .Uint16 (r [2 :4 ]) 
} 
 
func  (r  SessionSetupResponseDecoder ) SecurityBufferOffset () uint16  { 
	return  le .Uint16 (r [4 :6 ]) 
} 
 
func  (r  SessionSetupResponseDecoder ) SecurityBufferLength () uint16  { 
	return  le .Uint16 (r [6 :8 ]) 
} 
 
 
 
 
 
func  (r  SessionSetupResponseDecoder ) SecurityBuffer () []byte  { 
	off  := r .SecurityBufferOffset () 
	if  off  < 8 +64  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .SecurityBufferLength () 
	return  r [off  : off +len ] 
} 
 
 
 
 
 
type  LogoffResponse  struct  { 
	PacketHeader  
} 
 
func  (c  *LogoffResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *LogoffResponse ) Size () int  { 
	return  64  + 4  
} 
 
func  (c  *LogoffResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_LOGOFF  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 4 )  
} 
 
type  LogoffResponseDecoder  []byte  
 
func  (r  LogoffResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 4  { 
		return  true  
	} 
 
	if  r .StructureSize () != 4  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  LogoffResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
 
 
 
 
type  TreeConnectResponse  struct  { 
	PacketHeader  
 
	ShareType     uint8  
	ShareFlags    uint32  
	Capabilities  uint32  
	MaximalAccess uint32  
} 
 
func  (c  *TreeConnectResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *TreeConnectResponse ) Size () int  { 
	return  64  + 16  
} 
 
func  (c  *TreeConnectResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_TREE_CONNECT  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 16 )  
	res [2 ] = c .ShareType  
	le .PutUint32 (res [4 :8 ], c .ShareFlags ) 
	le .PutUint32 (res [8 :12 ], c .Capabilities ) 
	le .PutUint32 (res [12 :16 ], c .MaximalAccess ) 
} 
 
type  TreeConnectResponseDecoder  []byte  
 
func  (r  TreeConnectResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 16  { 
		return  true  
	} 
 
	if  r .StructureSize () != 16  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  TreeConnectResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  TreeConnectResponseDecoder ) ShareType () uint8  { 
	return  r [2 ] 
} 
 
func  (r  TreeConnectResponseDecoder ) ShareFlags () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  TreeConnectResponseDecoder ) Capabilities () uint32  { 
	return  le .Uint32 (r [8 :12 ]) 
} 
 
func  (r  TreeConnectResponseDecoder ) MaximalAccess () uint32  { 
	return  le .Uint32 (r [12 :16 ]) 
} 
 
 
 
 
 
type  TreeDisconnectResponse  struct  { 
	PacketHeader  
} 
 
func  (c  *TreeDisconnectResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *TreeDisconnectResponse ) Size () int  { 
	return  4  
} 
 
func  (c  *TreeDisconnectResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_TREE_DISCONNECT  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 4 )  
} 
 
type  TreeDisconnectResponseDecoder  []byte  
 
func  (r  TreeDisconnectResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 4  { 
		return  true  
	} 
 
	if  r .StructureSize () != 4  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  TreeDisconnectResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
 
 
 
 
type  CreateResponse  struct  { 
	PacketHeader  
 
	OplockLevel    uint8  
	Flags          uint8  
	CreateAction   uint32  
	CreationTime   *Filetime  
	LastAccessTime *Filetime  
	LastWriteTime  *Filetime  
	ChangeTime     *Filetime  
	AllocationSize int64  
	EndofFile      int64  
	FileAttributes uint32  
	FileId         *FileId  
 
	Contexts []Encoder  
} 
 
func  (c  *CreateResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *CreateResponse ) Size () int  { 
	if  len (c .Contexts ) == 0  { 
		return  64  + 88  + 1  
	} 
 
	size  := 64  + 88  
 
	for  _ , ctx  := range  c .Contexts  { 
		size  = Roundup (size , 8 ) 
		size  += ctx .Size () 
	} 
 
	return  size  
} 
 
func  (c  *CreateResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_CREATE  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 89 )  
	res [2 ] = c .OplockLevel  
	res [3 ] = c .Flags  
	le .PutUint32 (res [4 :8 ], c .CreateAction ) 
	c .CreationTime .Encode (res [8 :16 ]) 
	c .LastAccessTime .Encode (res [16 :24 ]) 
	c .LastWriteTime .Encode (res [24 :32 ]) 
	c .ChangeTime .Encode (res [32 :40 ]) 
	le .PutUint64 (res [40 :48 ], uint64 (c .AllocationSize )) 
	le .PutUint64 (res [48 :56 ], uint64 (c .EndofFile )) 
	le .PutUint32 (res [56 :60 ], c .FileAttributes ) 
	c .FileId .Encode (res [64 :80 ]) 
 
	off  := 88  
 
	var  ctx  []byte  
	var  next  int  
 
	for  i , c  := range  c .Contexts  { 
		off  = Roundup (off , 8 ) 
 
		if  i  == 0  { 
			le .PutUint32 (res [80 :84 ], uint32 (64 +off ))  
		} else  { 
			le .PutUint32 (ctx [:4 ], uint32 (next ))  
		} 
 
		ctx  = res [off :] 
 
		c .Encode (ctx ) 
 
		next  = c .Size () 
 
		off  += next  
	} 
 
	le .PutUint32 (res [84 :88 ], uint32 (off -88 ))  
} 
 
type  CreateResponseDecoder  []byte  
 
func  (r  CreateResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 88  { 
		return  true  
	} 
 
	if  r .StructureSize () != 89  { 
		return  true  
	} 
 
	coff  := r .CreateContextsOffset () 
 
	if  coff &7  != 0  { 
		return  true  
	} 
 
	if  len (r ) < int (coff +r .CreateContextsLength ())-64  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  CreateResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  CreateResponseDecoder ) OplockLevel () uint8  { 
	return  r [2 ] 
} 
 
func  (r  CreateResponseDecoder ) Flags () uint8  { 
	return  r [3 ] 
} 
 
func  (r  CreateResponseDecoder ) CreateAction () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  CreateResponseDecoder ) CreationTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [8 :16 ]) 
} 
 
func  (r  CreateResponseDecoder ) LastAccessTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [16 :24 ]) 
} 
 
func  (r  CreateResponseDecoder ) LastWriteTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [24 :32 ]) 
} 
 
func  (r  CreateResponseDecoder ) ChangeTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [32 :40 ]) 
} 
 
func  (r  CreateResponseDecoder ) AllocationSize () int64  { 
	return  int64 (le .Uint64 (r [40 :48 ])) 
} 
 
func  (r  CreateResponseDecoder ) EndofFile () int64  { 
	return  int64 (le .Uint64 (r [48 :56 ])) 
} 
 
func  (r  CreateResponseDecoder ) FileAttributes () uint32  { 
	return  le .Uint32 (r [56 :60 ]) 
} 
 
func  (r  CreateResponseDecoder ) FileId () FileIdDecoder  { 
	return  FileIdDecoder (r [64 :80 ]) 
} 
 
func  (r  CreateResponseDecoder ) CreateContextsOffset () uint32  { 
	return  le .Uint32 (r [80 :84 ]) 
} 
 
func  (r  CreateResponseDecoder ) CreateContextsLength () uint32  { 
	return  le .Uint32 (r [84 :88 ]) 
} 
 
 
 
 
 
func  (r  CreateResponseDecoder ) CreateContexts () []byte  { 
	off  := r .CreateContextsOffset () 
	if  off  < 88 +64  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .CreateContextsLength () 
	return  r [off  : off +len ] 
} 
 
 
 
 
 
type  CloseResponse  struct  { 
	PacketHeader  
 
	Flags          uint16  
	CreationTime   *Filetime  
	LastAccessTime *Filetime  
	LastWriteTime  *Filetime  
	ChangeTime     *Filetime  
	AllocationSize int64  
	EndofFile      int64  
	FileAttributes uint32  
} 
 
func  (c  *CloseResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *CloseResponse ) Size () int  { 
	return  64  + 60  
} 
 
func  (c  *CloseResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_CLOSE  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 60 )  
	le .PutUint16 (res [2 :4 ], c .Flags ) 
	c .CreationTime .Encode (res [8 :16 ]) 
	c .LastAccessTime .Encode (res [16 :24 ]) 
	c .LastWriteTime .Encode (res [24 :32 ]) 
	c .ChangeTime .Encode (res [32 :40 ]) 
	le .PutUint64 (res [40 :48 ], uint64 (c .AllocationSize )) 
	le .PutUint64 (res [48 :56 ], uint64 (c .EndofFile )) 
	le .PutUint32 (res [56 :60 ], c .FileAttributes ) 
} 
 
type  CloseResponseDecoder  []byte  
 
func  (r  CloseResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 60  { 
		return  true  
	} 
 
	if  r .StructureSize () != 60  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  CloseResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  CloseResponseDecoder ) Flags () uint16  { 
	return  le .Uint16 (r [2 :4 ]) 
} 
 
func  (r  CloseResponseDecoder ) CreationTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [8 :16 ]) 
} 
 
func  (r  CloseResponseDecoder ) LastAccessTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [16 :24 ]) 
} 
 
func  (r  CloseResponseDecoder ) LastWriteTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [24 :32 ]) 
} 
 
func  (r  CloseResponseDecoder ) ChangeTime () FiletimeDecoder  { 
	return  FiletimeDecoder (r [32 :40 ]) 
} 
 
func  (r  CloseResponseDecoder ) AllocationSize () int64  { 
	return  int64 (le .Uint64 (r [40 :48 ])) 
} 
 
func  (r  CloseResponseDecoder ) EndofFile () int64  { 
	return  int64 (le .Uint64 (r [48 :56 ])) 
} 
 
func  (r  CloseResponseDecoder ) FileAttributes () uint32  { 
	return  le .Uint32 (r [56 :60 ]) 
} 
 
 
 
 
 
type  FlushResponse  struct  { 
	PacketHeader  
} 
 
func  (c  *FlushResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *FlushResponse ) Size () int  { 
	return  64  + 4  
} 
 
func  (c  *FlushResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_FLUSH  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 4 )  
} 
 
type  FlushResponseDecoder  []byte  
 
func  (r  FlushResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 4  { 
		return  true  
	} 
 
	if  r .StructureSize () != 4  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  FlushResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
 
 
 
 
type  ReadResponse  struct  { 
	PacketHeader  
 
	Data          []byte  
	DataRemaining uint32  
} 
 
func  (c  *ReadResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *ReadResponse ) Size () int  { 
	if  len (c .Data ) == 0  { 
		return  64  + 16  + 1  
	} 
	return  64  + 16  + len (c .Data ) 
} 
 
func  (c  *ReadResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_READ  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 17 )  
	res [2 ] = 16                 
	copy (res [16 :], c .Data ) 
	le .PutUint32 (res [4 :8 ], uint32 (len (c .Data )))  
	le .PutUint32 (res [8 :12 ], c .DataRemaining ) 
} 
 
type  ReadResponseDecoder  []byte  
 
func  (r  ReadResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 16  { 
		return  true  
	} 
 
	if  r .StructureSize () != 17  { 
		return  true  
	} 
 
	if  len (r ) < int (uint32 (r .DataOffset ())+r .DataLength ())-64  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  ReadResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  ReadResponseDecoder ) DataOffset () uint8  { 
	return  r [2 ] 
} 
 
func  (r  ReadResponseDecoder ) DataLength () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  ReadResponseDecoder ) DataRemaining () uint32  { 
	return  le .Uint32 (r [8 :12 ]) 
} 
 
 
 
 
 
func  (r  ReadResponseDecoder ) Data () []byte  { 
	off  := r .DataOffset () 
	if  off  < 16 +64  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .DataLength () 
	return  r [off  : uint32 (off )+len ] 
} 
 
 
 
 
 
type  WriteResponse  struct  { 
	PacketHeader  
 
	Count     uint32  
	Remaining uint32  
} 
 
func  (c  *WriteResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *WriteResponse ) Size () int  { 
	return  64  + 16  + 1  
} 
 
func  (c  *WriteResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_WRITE  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 17 )  
	le .PutUint32 (res [4 :8 ], c .Count ) 
	le .PutUint32 (res [8 :12 ], c .Remaining ) 
} 
 
type  WriteResponseDecoder  []byte  
 
func  (r  WriteResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 16  { 
		return  true  
	} 
 
	if  r .StructureSize () != 17  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  WriteResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  WriteResponseDecoder ) Count () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  WriteResponseDecoder ) Remaining () uint32  { 
	return  le .Uint32 (r [8 :12 ]) 
} 
 
func  (r  WriteResponseDecoder ) WriteChannelInfoOffset () uint16  { 
	return  le .Uint16 (r [12 :14 ]) 
} 
 
func  (r  WriteResponseDecoder ) WriteChannelInfoLength () uint16  { 
	return  le .Uint16 (r [14 :16 ]) 
} 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
type  IoctlResponse  struct  { 
	PacketHeader  
 
	CtlCode uint32  
	FileId  *FileId  
	Flags   uint32  
	Input   Encoder  
	Output  Encoder  
} 
 
func  (c  *IoctlResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *IoctlResponse ) Size () int  { 
	if  c .Input  == nil  && c .Output  == nil  { 
		return  64  + 48  + 1  
	} 
	return  64  + 48  + c .Input .Size () + c .Output .Size () 
} 
 
func  (c  *IoctlResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_IOCTL  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 49 )  
	le .PutUint32 (res [4 :8 ], c .CtlCode ) 
	c .FileId .Encode (res [8 :24 ]) 
	le .PutUint32 (res [40 :44 ], c .Flags ) 
 
	off  := 48  
 
	if  c .Input  != nil  { 
		le .PutUint32 (res [24 :28 ], uint32 (off +64 ))  
 
		c .Input .Encode (res [off :]) 
 
		le .PutUint32 (res [28 :32 ], uint32 (c .Input .Size ()))  
	} 
 
	if  c .Output  != nil  { 
		le .PutUint32 (res [32 :36 ], uint32 (off +64 ))  
 
		c .Output .Encode (res [off :]) 
 
		le .PutUint32 (res [36 :40 ], uint32 (c .Output .Size ()))  
	} 
} 
 
type  IoctlResponseDecoder  []byte  
 
func  (r  IoctlResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 48  { 
		return  true  
	} 
 
	if  r .StructureSize () != 49  { 
		return  true  
	} 
 
	if  len (r ) < int (r .InputOffset ()+r .InputCount ())-64  { 
		return  true  
	} 
 
	if  len (r ) < int (r .OutputOffset ()+r .OutputCount ())-64  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  IoctlResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  IoctlResponseDecoder ) CtlCode () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
func  (r  IoctlResponseDecoder ) FileId () FileIdDecoder  { 
	return  FileIdDecoder (r [8 :24 ]) 
} 
 
func  (r  IoctlResponseDecoder ) InputOffset () uint32  { 
	return  le .Uint32 (r [24 :28 ]) 
} 
 
func  (r  IoctlResponseDecoder ) InputCount () uint32  { 
	return  le .Uint32 (r [28 :32 ]) 
} 
 
func  (r  IoctlResponseDecoder ) OutputOffset () uint32  { 
	return  le .Uint32 (r [32 :36 ]) 
} 
 
func  (r  IoctlResponseDecoder ) OutputCount () uint32  { 
	return  le .Uint32 (r [36 :40 ]) 
} 
 
func  (r  IoctlResponseDecoder ) Flags () uint32  { 
	return  le .Uint32 (r [40 :44 ]) 
} 
 
 
 
 
 
func  (r  IoctlResponseDecoder ) Input () []byte  { 
	off  := r .InputOffset () 
	if  off  < 64 +48  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .InputCount () 
	return  r [off  : off +len ] 
} 
 
func  (r  IoctlResponseDecoder ) Output () []byte  { 
	off  := r .OutputOffset () 
	if  off  < 64 +48  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .OutputCount () 
	return  r [off  : off +len ] 
} 
 
 
 
 
 
type  QueryDirectoryResponse  struct  { 
	PacketHeader  
 
	Output Encoder  
} 
 
func  (c  *QueryDirectoryResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *QueryDirectoryResponse ) Size () int  { 
	if  c .Output  == nil  { 
		return  64  + 8  + 1  
	} 
	return  64  + 8  + c .Output .Size () 
} 
 
func  (c  *QueryDirectoryResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_QUERY_DIRECTORY  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 9 )  
 
	off  := 8  
 
	if  c .Output  != nil  { 
		le .PutUint16 (res [2 :4 ], uint16 (off +64 )) 
		c .Output .Encode (res [8 :]) 
		le .PutUint32 (res [4 :8 ], uint32 (c .Output .Size ())) 
	} 
} 
 
type  QueryDirectoryResponseDecoder  []byte  
 
func  (r  QueryDirectoryResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 8  { 
		return  true  
	} 
 
	if  r .StructureSize () != 9  { 
		return  true  
	} 
 
	if  len (r ) < int (uint32 (r .OutputBufferOffset ())+r .OutputBufferLength ())-64  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  QueryDirectoryResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  QueryDirectoryResponseDecoder ) OutputBufferOffset () uint16  { 
	return  le .Uint16 (r [2 :4 ]) 
} 
 
func  (r  QueryDirectoryResponseDecoder ) OutputBufferLength () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
 
 
 
 
func  (r  QueryDirectoryResponseDecoder ) OutputBuffer () []byte  { 
	off  := r .OutputBufferOffset () 
	if  off  < 64 +8  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .OutputBufferLength () 
	return  r [off  : uint32 (off )+len ] 
} 
 
 
 
 
 
 
 
 
 
type  QueryInfoResponse  struct  { 
	PacketHeader  
 
	Output Encoder  
} 
 
func  (c  *QueryInfoResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *QueryInfoResponse ) Size () int  { 
	if  c .Output  == nil  { 
		return  64  + 8  + 1  
	} 
	return  64  + 8  + c .Output .Size () 
} 
 
func  (c  *QueryInfoResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_QUERY_INFO  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 9 )  
 
	off  := 8  
 
	if  c .Output  != nil  { 
		le .PutUint16 (res [2 :4 ], uint16 (off +64 )) 
		c .Output .Encode (res [8 :]) 
		le .PutUint32 (res [4 :8 ], uint32 (c .Output .Size ())) 
	} 
} 
 
type  QueryInfoResponseDecoder  []byte  
 
func  (r  QueryInfoResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 8  { 
		return  true  
	} 
 
	if  r .StructureSize () != 9  { 
		return  true  
	} 
 
	if  len (r ) < int (uint32 (r .OutputBufferOffset ())+r .OutputBufferLength ())-64  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  QueryInfoResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
 
func  (r  QueryInfoResponseDecoder ) OutputBufferOffset () uint16  { 
	return  le .Uint16 (r [2 :4 ]) 
} 
 
func  (r  QueryInfoResponseDecoder ) OutputBufferLength () uint32  { 
	return  le .Uint32 (r [4 :8 ]) 
} 
 
 
 
 
 
func  (r  QueryInfoResponseDecoder ) OutputBuffer () []byte  { 
	off  := r .OutputBufferOffset () 
	if  off  < 64 +8  { 
		return  nil  
	} 
	off  -= 64  
	len  := r .OutputBufferLength () 
	return  r [off  : uint32 (off )+len ] 
} 
 
 
 
 
 
type  SetInfoResponse  struct  { 
	PacketHeader  
} 
 
func  (c  *SetInfoResponse ) Header () *PacketHeader  { 
	return  &c .PacketHeader  
} 
 
func  (c  *SetInfoResponse ) Size () int  { 
	return  64  + 2  
} 
 
func  (c  *SetInfoResponse ) Encode (pkt  []byte ) { 
	c .Command  = SMB2_SET_INFO  
	c .encodeHeader (pkt ) 
 
	res  := pkt [64 :] 
	le .PutUint16 (res [:2 ], 2 )  
} 
 
type  SetInfoResponseDecoder  []byte  
 
func  (r  SetInfoResponseDecoder ) IsInvalid () bool  { 
	if  len (r ) < 2  { 
		return  true  
	} 
 
	if  r .StructureSize () != 2  { 
		return  true  
	} 
 
	return  false  
} 
 
func  (r  SetInfoResponseDecoder ) StructureSize () uint16  { 
	return  le .Uint16 (r [:2 ]) 
} 
  
The pages are generated with Golds   v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds  is a Go 101  project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1  (reachable from the left QR code) to get the latest news of Golds .