/* Define the SMB message command code. */ #define SMB_COM_NEGOTIATE 0x72 int nbt_SessionHeader( uchar *bufr, ulong size ) /* ---------------------------------------------------- ** * This function writes the NBT Session Service header. * Note that we use NBT byte order, not SMB. * ---------------------------------------------------- ** */ { if( size > 0x0001FFFF ) /* That's the NBT maximum. */ return( -1 ); bufr[0] = 0; bufr[1] = (size >> 16) & 0xFF; bufr[2] = (size >> 8) & 0xFF; bufr[3] = size & 0xFF; return( (int)size ); } /* nbt_SessionHeader */ int smb_NegProtRequest( uchar *bufr, int bsize, int namec, uchar **namev ) /* ---------------------------------------------------- ** * Build a Negotiate Protocol Request message. * ---------------------------------------------------- ** */ { uchar *smb_bufr; int i; int length; int offset; ushort bytecount; uchar flags; ushort flags2; /* Set aside four bytes for the session header. */ bsize = bsize - 4; smb_bufr = bufr + 4; /* Make sure we have enough room for the header, * the WORDCOUNT field, and the BYTECOUNT field. * That's the absolute minimum (with no dialects). */ if( bsize < (SMB_HDR_SIZE + 3) ) return( -1 ); /* Initialize the SMB header. * This zero-fills all header fields except for * the Protocol field ("\ffSMB"). * We have already tested the buffer size so * we can void the return value. */ (void)smb_hdrInit( smb_bufr, bsize ); /* Hard-coded flags values... */ flags = SMB_FLAGS_CANONICAL_PATHNAMES; flags |= SMB_FLAGS_CASELESS_PATHNAMES; flags2 = SMB_FLAGS2_KNOWS_LONG_NAMES; /* Fill in the header. */ smb_hdrSetCmd( smb_bufr, SMB_COM_NEGOTIATE ); smb_hdrSetFlags( smb_bufr, flags ); smb_hdrSetFlags2( smb_bufr, flags2 ); /* Fill in the (empty) parameter block. */ smb_bufr[SMB_HDR_SIZE] = 0; /* Copy the dialect names into the message. * Set offset to indicate the start of the * BYTES field, skipping BYTECOUNT. We will * fill in BYTECOUNT later. */ offset = SMB_HDR_SIZE + 3; for( bytecount = i = 0; i < namec; i++ ) { length = strlen(namev[i]) + 1; /* includes nul */ if( bsize < (offset + 1 + length) ) /* includes 0x02 */ return( -1 ); smb_bufr[offset++] = '\x02'; (void)memcpy( &smb_bufr[offset], namev[i], length ); offset += length; bytecount += length + 1; } /* The offset is now the total size of the SMB message. */ if( nbt_SessionHeader( bufr, (ulong)offset ) < offset ) return( -1 ); /* The BYTECOUNT field starts one byte beyond the end * of the header (one byte for the WORDCOUNT field). */ smb_SetShort( smb_bufr, (SMB_HDR_SIZE + 1), bytecount ); /* Return the total size of the packet. */ return( offset + 4 ); } /* smb_NegProtRequest */
$Revision: 1.5 $ $Date: 2003/01/04 18:55:20 $ |
Copyright © 2002-2003 Christopher R. Hertel Released under the terms of the LGPL |