| 1 | #ifndef HEADER_CURL_SMB_H | 
|---|
| 2 | #define | 
|---|
| 3 | /*************************************************************************** | 
|---|
| 4 | *                                  _   _ ____  _ | 
|---|
| 5 | *  Project                     ___| | | |  _ \| | | 
|---|
| 6 | *                             / __| | | | |_) | | | 
|---|
| 7 | *                            | (__| |_| |  _ <| |___ | 
|---|
| 8 | *                             \___|\___/|_| \_\_____| | 
|---|
| 9 | * | 
|---|
| 10 | * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies | 
|---|
| 11 | * Copyright (C) 2018, 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.haxx.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 |  | 
|---|
| 197 | } PACK; | 
|---|
| 198 |  | 
|---|
| 199 | struct smb_read { | 
|---|
| 200 | unsigned char word_count; | 
|---|
| 201 | struct andx andx; | 
|---|
| 202 | unsigned short fid; | 
|---|
| 203 | unsigned int offset; | 
|---|
| 204 | unsigned short max_bytes; | 
|---|
| 205 | unsigned short min_bytes; | 
|---|
| 206 | unsigned int timeout; | 
|---|
| 207 | unsigned short remaining; | 
|---|
| 208 | unsigned int offset_high; | 
|---|
| 209 | unsigned short byte_count; | 
|---|
| 210 | } PACK; | 
|---|
| 211 |  | 
|---|
| 212 | struct smb_write { | 
|---|
| 213 | struct smb_header h; | 
|---|
| 214 | unsigned char word_count; | 
|---|
| 215 | struct andx andx; | 
|---|
| 216 | unsigned short fid; | 
|---|
| 217 | unsigned int offset; | 
|---|
| 218 | unsigned int timeout; | 
|---|
| 219 | unsigned short write_mode; | 
|---|
| 220 | unsigned short remaining; | 
|---|
| 221 | unsigned short pad; | 
|---|
| 222 | unsigned short data_length; | 
|---|
| 223 | unsigned short data_offset; | 
|---|
| 224 | unsigned int offset_high; | 
|---|
| 225 | unsigned short byte_count; | 
|---|
| 226 | unsigned char pad2; | 
|---|
| 227 | } PACK; | 
|---|
| 228 |  | 
|---|
| 229 | struct smb_close { | 
|---|
| 230 | unsigned char word_count; | 
|---|
| 231 | unsigned short fid; | 
|---|
| 232 | unsigned int last_mtime; | 
|---|
| 233 | unsigned short byte_count; | 
|---|
| 234 | } PACK; | 
|---|
| 235 |  | 
|---|
| 236 | struct smb_tree_disconnect { | 
|---|
| 237 | unsigned char word_count; | 
|---|
| 238 | unsigned short byte_count; | 
|---|
| 239 | } PACK; | 
|---|
| 240 |  | 
|---|
| 241 | #if defined(_MSC_VER) || defined(__ILEC400__) | 
|---|
| 242 | #  pragma pack(pop) | 
|---|
| 243 | #endif | 
|---|
| 244 |  | 
|---|
| 245 | #endif /* BUILDING_CURL_SMB_C */ | 
|---|
| 246 |  | 
|---|
| 247 | #if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ | 
|---|
| 248 | (CURL_SIZEOF_CURL_OFF_T > 4) | 
|---|
| 249 |  | 
|---|
| 250 | #if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO) | 
|---|
| 251 |  | 
|---|
| 252 | extern const struct Curl_handler Curl_handler_smb; | 
|---|
| 253 | extern const struct Curl_handler Curl_handler_smbs; | 
|---|
| 254 |  | 
|---|
| 255 | #endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */ | 
|---|
| 256 |  | 
|---|
| 257 | #endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */ | 
|---|
| 258 |  | 
|---|
| 259 | #endif /* HEADER_CURL_SMB_H */ | 
|---|
| 260 |  | 
|---|