1 #ifndef HEADER_CURL_SMB_H 2 #define HEADER_CURL_SMB_H 3 /*************************************************************************** 4 * _ _ ____ _ 5 * Project ___| | | | _ \| | 6 * / __| | | | |_) | | 7 * | (__| |_| | _ <| |___ 8 * \___|\___/|_| \_\_____| 9 * 10 * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies 11 * Copyright (C) 2018 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al. 12 * 13 * This software is licensed as described in the file COPYING, which 14 * you should have received as part of this distribution. The terms 15 * are also available at https://curl.se/docs/copyright.html. 16 * 17 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 18 * copies of the Software, and permit persons to whom the Software is 19 * furnished to do so, under the terms of the COPYING file. 20 * 21 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 22 * KIND, either express or implied. 23 * 24 ***************************************************************************/ 25 26 enum smb_conn_state { 27 SMB_NOT_CONNECTED = 0, 28 SMB_CONNECTING, 29 SMB_NEGOTIATE, 30 SMB_SETUP, 31 SMB_CONNECTED 32 }; 33 34 struct smb_conn { 35 enum smb_conn_state state; 36 char *user; 37 char *domain; 38 char *share; 39 unsigned char challenge[8]; 40 unsigned int session_key; 41 unsigned short uid; 42 char *recv_buf; 43 size_t upload_size; 44 size_t send_size; 45 size_t sent; 46 size_t got; 47 }; 48 49 /* 50 * Definitions for SMB protocol data structures 51 */ 52 #ifdef BUILDING_CURL_SMB_C 53 54 #if defined(_MSC_VER) || defined(__ILEC400__) 55 # define PACK 56 # pragma pack(push) 57 # pragma pack(1) 58 #elif defined(__GNUC__) 59 # define PACK __attribute__((packed)) 60 #else 61 # define PACK 62 #endif 63 64 #define SMB_COM_CLOSE 0x04 65 #define SMB_COM_READ_ANDX 0x2e 66 #define SMB_COM_WRITE_ANDX 0x2f 67 #define SMB_COM_TREE_DISCONNECT 0x71 68 #define SMB_COM_NEGOTIATE 0x72 69 #define SMB_COM_SETUP_ANDX 0x73 70 #define SMB_COM_TREE_CONNECT_ANDX 0x75 71 #define SMB_COM_NT_CREATE_ANDX 0xa2 72 #define SMB_COM_NO_ANDX_COMMAND 0xff 73 74 #define SMB_WC_CLOSE 0x03 75 #define SMB_WC_READ_ANDX 0x0c 76 #define SMB_WC_WRITE_ANDX 0x0e 77 #define SMB_WC_SETUP_ANDX 0x0d 78 #define SMB_WC_TREE_CONNECT_ANDX 0x04 79 #define SMB_WC_NT_CREATE_ANDX 0x18 80 81 #define SMB_FLAGS_CANONICAL_PATHNAMES 0x10 82 #define SMB_FLAGS_CASELESS_PATHNAMES 0x08 83 #define SMB_FLAGS2_UNICODE_STRINGS 0x8000 84 #define SMB_FLAGS2_IS_LONG_NAME 0x0040 85 #define SMB_FLAGS2_KNOWS_LONG_NAME 0x0001 86 87 #define SMB_CAP_LARGE_FILES 0x08 88 #define SMB_GENERIC_WRITE 0x40000000 89 #define SMB_GENERIC_READ 0x80000000 90 #define SMB_FILE_SHARE_ALL 0x07 91 #define SMB_FILE_OPEN 0x01 92 #define SMB_FILE_OVERWRITE_IF 0x05 93 94 #define SMB_ERR_NOACCESS 0x00050001 95 96 struct smb_header { 97 unsigned char nbt_type; 98 unsigned char nbt_flags; 99 unsigned short nbt_length; 100 unsigned char magic[4]; 101 unsigned char command; 102 unsigned int status; 103 unsigned char flags; 104 unsigned short flags2; 105 unsigned short pid_high; 106 unsigned char signature[8]; 107 unsigned short pad; 108 unsigned short tid; 109 unsigned short pid; 110 unsigned short uid; 111 unsigned short mid; 112 } PACK; 113 114 struct smb_negotiate_response { 115 struct smb_header h; 116 unsigned char word_count; 117 unsigned short dialect_index; 118 unsigned char security_mode; 119 unsigned short max_mpx_count; 120 unsigned short max_number_vcs; 121 unsigned int max_buffer_size; 122 unsigned int max_raw_size; 123 unsigned int session_key; 124 unsigned int capabilities; 125 unsigned int system_time_low; 126 unsigned int system_time_high; 127 unsigned short server_time_zone; 128 unsigned char encryption_key_length; 129 unsigned short byte_count; 130 char bytes[1]; 131 } PACK; 132 133 struct andx { 134 unsigned char command; 135 unsigned char pad; 136 unsigned short offset; 137 } PACK; 138 139 struct smb_setup { 140 unsigned char word_count; 141 struct andx andx; 142 unsigned short max_buffer_size; 143 unsigned short max_mpx_count; 144 unsigned short vc_number; 145 unsigned int session_key; 146 unsigned short lengths[2]; 147 unsigned int pad; 148 unsigned int capabilities; 149 unsigned short byte_count; 150 char bytes[1024]; 151 } PACK; 152 153 struct smb_tree_connect { 154 unsigned char word_count; 155 struct andx andx; 156 unsigned short flags; 157 unsigned short pw_len; 158 unsigned short byte_count; 159 char bytes[1024]; 160 } PACK; 161 162 struct smb_nt_create { 163 unsigned char word_count; 164 struct andx andx; 165 unsigned char pad; 166 unsigned short name_length; 167 unsigned int flags; 168 unsigned int root_fid; 169 unsigned int access; 170 curl_off_t allocation_size; 171 unsigned int ext_file_attributes; 172 unsigned int share_access; 173 unsigned int create_disposition; 174 unsigned int create_options; 175 unsigned int impersonation_level; 176 unsigned char security_flags; 177 unsigned short byte_count; 178 char bytes[1024]; 179 } PACK; 180 181 struct smb_nt_create_response { 182 struct smb_header h; 183 unsigned char word_count; 184 struct andx andx; 185 unsigned char op_lock_level; 186 unsigned short fid; 187 unsigned int create_disposition; 188 189 curl_off_t create_time; 190 curl_off_t last_access_time; 191 curl_off_t last_write_time; 192 curl_off_t last_change_time; 193 unsigned int ext_file_attributes; 194 curl_off_t allocation_size; 195 curl_off_t end_of_file; 196 } PACK; 197 198 struct smb_read { 199 unsigned char word_count; 200 struct andx andx; 201 unsigned short fid; 202 unsigned int offset; 203 unsigned short max_bytes; 204 unsigned short min_bytes; 205 unsigned int timeout; 206 unsigned short remaining; 207 unsigned int offset_high; 208 unsigned short byte_count; 209 } PACK; 210 211 struct smb_write { 212 struct smb_header h; 213 unsigned char word_count; 214 struct andx andx; 215 unsigned short fid; 216 unsigned int offset; 217 unsigned int timeout; 218 unsigned short write_mode; 219 unsigned short remaining; 220 unsigned short pad; 221 unsigned short data_length; 222 unsigned short data_offset; 223 unsigned int offset_high; 224 unsigned short byte_count; 225 unsigned char pad2; 226 } PACK; 227 228 struct smb_close { 229 unsigned char word_count; 230 unsigned short fid; 231 unsigned int last_mtime; 232 unsigned short byte_count; 233 } PACK; 234 235 struct smb_tree_disconnect { 236 unsigned char word_count; 237 unsigned short byte_count; 238 } PACK; 239 240 #if defined(_MSC_VER) || defined(__ILEC400__) 241 # pragma pack(pop) 242 #endif 243 244 #endif /* BUILDING_CURL_SMB_C */ 245 246 #if !defined(CURL_DISABLE_SMB) && defined(USE_CURL_NTLM_CORE) && \ 247 (SIZEOF_CURL_OFF_T > 4) 248 249 extern const struct Curl_handler Curl_handler_smb; 250 extern const struct Curl_handler Curl_handler_smbs; 251 252 #endif /* CURL_DISABLE_SMB && USE_CURL_NTLM_CORE && 253 SIZEOF_CURL_OFF_T > 4 */ 254 255 #endif /* HEADER_CURL_SMB_H */ 256