/* UNIX SMBlib NetBIOS implementation Version 1.0 SMBlib private Defines Copyright (C) Richard Sharpe 1996 */ /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "smblib-common.h" #include #include typedef unsigned short uint16; typedef unsigned int uint32; #include "byteorder.h" /* Hmmm ... hot good */ #define SMB_DEF_IDF 0x424D53FF /* "\377SMB" */ /* The protocol commands and constants we need */ #define SMBnegprot 0x72 /* negotiate protocol */ #define SMBsesssetupX 0x73 /* Session Set Up & X (including User Logon) */ #define SMBdialectID 0x02 /* a dialect id */ typedef unsigned short WORD; typedef unsigned short UWORD; typedef unsigned int ULONG; typedef unsigned char BYTE; typedef unsigned char UCHAR; /* Some macros to allow access to actual packet data so that we */ /* can change the underlying representation of packets. */ /* */ /* The current formats vying for attention are a fragment */ /* approach where the SMB header is a fragment linked to the */ /* data portion with the transport protocol (rfcnb or whatever) */ /* being linked on the front. */ /* */ /* The other approach is where the whole packet is one array */ /* of bytes with space allowed on the front for the packet */ /* headers. */ #define SMB_Hdr(p) (char *)(p -> data) /* SMB Hdr def for File Sharing Protocol? From MS and Intel, */ /* Intel PN 138446 Doc Version 2.0, Nov 7, 1988. This def also */ /* applies to LANMAN1.0 as well as the Core Protocol */ /* The spec states that wct and bcc must be present, even if 0 */ /* We define these as offsets into a char SMB[] array for the */ /* sake of portability */ /* NOTE!. Some of the lenght defines, SMB__len do not include */ /* the data that follows in the SMB packet, so the code will have to */ /* take that into account. */ #define SMB_hdr_idf_offset 0 /* 0xFF,'SMB' 0-3 */ #define SMB_hdr_com_offset 4 /* BYTE 4 */ #define SMB_hdr_rcls_offset 5 /* BYTE 5 */ #define SMB_hdr_reh_offset 6 /* BYTE 6 */ #define SMB_hdr_err_offset 7 /* WORD 7 */ #define SMB_hdr_reb_offset 9 /* BYTE 9 */ #define SMB_hdr_flg_offset 9 /* same as reb ...*/ #define SMB_hdr_res_offset 10 /* 7 WORDs 10 */ #define SMB_hdr_res0_offset 10 /* WORD 10 */ #define SMB_hdr_flg2_offset 10 /* WORD */ #define SMB_hdr_res1_offset 12 /* WORD 12 */ #define SMB_hdr_res2_offset 14 #define SMB_hdr_res3_offset 16 #define SMB_hdr_res4_offset 18 #define SMB_hdr_res5_offset 20 #define SMB_hdr_res6_offset 22 #define SMB_hdr_tid_offset 24 #define SMB_hdr_pid_offset 26 #define SMB_hdr_uid_offset 28 #define SMB_hdr_mid_offset 30 #define SMB_hdr_wct_offset 32 #define SMB_hdr_len 33 /* 33 byte header? */ #define SMB_hdr_axc_offset 33 /* AndX Command */ #define SMB_hdr_axr_offset 34 /* AndX Reserved */ #define SMB_hdr_axo_offset 35 /* Offset from start to WCT of AndX cmd */ /* Format of the Negotiate Protocol SMB */ #define SMB_negp_bcc_offset 33 #define SMB_negp_buf_offset 35 /* Where the buffer starts */ #define SMB_negp_len 35 /* plus the data */ /* Format of the Negotiate Response SMB, for CoreProtocol, LM1.2 and */ /* NT LM 0.12. wct will be 1 for CoreProtocol, 13 for LM 1.2, and 17 */ /* for NT LM 0.12 */ #define SMB_negrCP_idx_offset 33 /* Response to the neg req */ #define SMB_negrCP_bcc_offset 35 #define SMB_negrLM_idx_offset 33 /* dialect index */ #define SMB_negrLM_sec_offset 35 /* Security mode */ #define SMB_sec_user_mask 0x01 /* 0 = share, 1 = user */ #define SMB_sec_encrypt_mask 0x02 /* pick out encrypt */ #define SMB_negrLM_mbs_offset 37 /* max buffer size */ #define SMB_negrLM_mmc_offset 39 /* max mpx count */ #define SMB_negrLM_mnv_offset 41 /* max number of VCs */ #define SMB_negrLM_rm_offset 43 /* raw mode support bit vec*/ #define SMB_negrLM_sk_offset 45 /* session key, 32 bits */ #define SMB_negrLM_st_offset 49 /* Current server time */ #define SMB_negrLM_sd_offset 51 /* Current server date */ #define SMB_negrLM_stz_offset 53 /* Server Time Zone */ #define SMB_negrLM_ekl_offset 55 /* encryption key length */ #define SMB_negrLM_res_offset 57 /* reserved */ #define SMB_negrLM_bcc_offset 59 /* bcc */ #define SMB_negrLM_len 61 /* 61 bytes ? */ #define SMB_negrLM_buf_offset 61 /* Where the fun begins */ #define SMB_negrNTLM_idx_offset 33 /* Selected protocol */ #define SMB_negrNTLM_sec_offset 35 /* Security more */ #define SMB_negrNTLM_mmc_offset 36 /* Different format above */ #define SMB_negrNTLM_mnv_offset 38 /* Max VCs */ #define SMB_negrNTLM_mbs_offset 40 /* MBS now a long */ #define SMB_negrNTLM_mrs_offset 44 /* Max raw size */ #define SMB_negrNTLM_sk_offset 48 /* Session Key */ #define SMB_negrNTLM_cap_offset 52 /* Capabilities */ #define SMB_negrNTLM_stl_offset 56 /* Server time low */ #define SMB_negrNTLM_sth_offset 60 /* Server time high */ #define SMB_negrNTLM_stz_offset 64 /* Server time zone */ #define SMB_negrNTLM_ekl_offset 66 /* Encrypt key len */ #define SMB_negrNTLM_bcc_offset 67 /* Bcc */ #define SMB_negrNTLM_len 69 #define SMB_negrNTLM_buf_offset 69 /* Offsets for Delete file */ #define SMB_delet_sat_offset 33 /* search attribites */ #define SMB_delet_bcc_offset 35 /* bcc */ #define SMB_delet_buf_offset 37 #define SMB_delet_len 37 /* Offsets for SESSION_SETUP_ANDX for both LM and NT LM protocols */ #define SMB_ssetpLM_mbs_offset 37 /* Max buffer Size, allow for AndX */ #define SMB_ssetpLM_mmc_offset 39 /* max multiplex count */ #define SMB_ssetpLM_vcn_offset 41 /* VC number if new VC */ #define SMB_ssetpLM_snk_offset 43 /* Session Key */ #define SMB_ssetpLM_pwl_offset 47 /* password length */ #define SMB_ssetpLM_res_offset 49 /* reserved */ #define SMB_ssetpLM_bcc_offset 53 /* bcc */ #define SMB_ssetpLM_len 55 /* before data ... */ #define SMB_ssetpLM_buf_offset 55 #define SMB_ssetpNTLM_mbs_offset 37 /* Max Buffer Size for NT LM 0.12 */ /* and above */ #define SMB_ssetpNTLM_mmc_offset 39 /* Max Multiplex count */ #define SMB_ssetpNTLM_vcn_offset 41 /* VC Number */ #define SMB_ssetpNTLM_snk_offset 43 /* Session key */ #define SMB_ssetpNTLM_cipl_offset 47 /* Case Insensitive PW Len */ #define SMB_ssetpNTLM_cspl_offset 49 /* Unicode pw len */ #define SMB_ssetpNTLM_res_offset 51 /* reserved */ #define SMB_ssetpNTLM_cap_offset 55 /* server capabilities */ #define SMB_ssetpNTLM_bcc_offset 59 /* bcc */ #define SMB_ssetpNTLM_len 61 /* before data */ #define SMB_ssetpNTLM_buf_offset 61 #define SMB_ssetpr_axo_offset 35 /* Offset of next response ... */ #define SMB_ssetpr_act_offset 37 /* action, bit 0 = 1 => guest */ #define SMB_ssetpr_bcc_offset 39 /* bcc */ #define SMB_ssetpr_buf_offset 41 /* Native OS etc */ /* The following two arrays need to be in step! */ /* We must make it possible for callers to specify these ... */ extern const char *SMB_Prots[]; extern int SMB_Types[]; typedef struct SMB_Connect_Def * SMB_Handle_Type; struct SMB_Connect_Def { SMB_Handle_Type Next_Con, Prev_Con; /* Next and previous conn */ int protocol; /* What is the protocol */ int prot_IDX; /* And what is the index */ void *Trans_Connect; /* The connection */ /* All these strings should be malloc'd */ char service[80], username[80], password[80], desthost[80], sock_options[80]; char address[80], myname[80]; int gid; /* Group ID, do we need it? */ int mid; /* Multiplex ID? We might need one per con */ int pid; /* Process ID */ int uid; /* Authenticated user id. */ /* It is pretty clear that we need to bust some of */ /* these out into a per TCon record, as there may */ /* be multiple TCon's per server, etc ... later */ int port; /* port to use in case not default, this is a TCPism! */ int max_xmit; /* Max xmit permitted by server */ int Security; /* 0 = share, 1 = user */ int Raw_Support; /* bit 0 = 1 = Read Raw supported, 1 = 1 Write raw */ bool encrypt_passwords; /* false = don't */ int MaxMPX, MaxVC, MaxRaw; unsigned int SessionKey, Capabilities; int SvrTZ; /* Server Time Zone */ int Encrypt_Key_Len; char Encrypt_Key[80], Domain[80], PDomain[80], OSName[80], LMType[40]; char Svr_OS[80], Svr_LMType[80], Svr_PDom[80]; }; #define SMBLIB_DEFAULT_OSNAME "UNIX of some type" #define SMBLIB_DEFAULT_LMTYPE "SMBlib LM2.1 minus a bit" #define SMBLIB_MAX_XMIT 65535 /* global Variables for the library */ #ifndef SMBLIB_ERRNO extern int SMBlib_errno; extern int SMBlib_SMB_Error; /* last Error */ #endif /* From smbdes.c. */ void E_P16(unsigned char *, unsigned char *); void E_P24(unsigned char *, unsigned char *, unsigned char *); /* From smblib-util.c. */ void SMB_Get_My_Name(char *name, int len); /* From smbencrypt.c. */ void SMBencrypt(unsigned char *passwd, unsigned char *, unsigned char *);