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