Home | History | Annotate | Download | only in lib
      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  * Copyright (C) 2018, Daniel Stenberg, <daniel (at) 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   unsigned char challenge[8];
     39   unsigned int session_key;
     40   unsigned short uid;
     41   char *recv_buf;
     42   size_t upload_size;
     43   size_t send_size;
     44   size_t sent;
     45   size_t got;
     46 };
     47 
     48 /*
     49  * Definitions for SMB protocol data structures
     50  */
     51 #ifdef BUILDING_CURL_SMB_C
     52 
     53 #if defined(_MSC_VER) || defined(__ILEC400__)
     54 #  define PACK
     55 #  pragma pack(push)
     56 #  pragma pack(1)
     57 #elif defined(__GNUC__)
     58 #  define PACK __attribute__((packed))
     59 #else
     60 #  define PACK
     61 #endif
     62 
     63 #define SMB_COM_CLOSE                 0x04
     64 #define SMB_COM_READ_ANDX             0x2e
     65 #define SMB_COM_WRITE_ANDX            0x2f
     66 #define SMB_COM_TREE_DISCONNECT       0x71
     67 #define SMB_COM_NEGOTIATE             0x72
     68 #define SMB_COM_SETUP_ANDX            0x73
     69 #define SMB_COM_TREE_CONNECT_ANDX     0x75
     70 #define SMB_COM_NT_CREATE_ANDX        0xa2
     71 #define SMB_COM_NO_ANDX_COMMAND       0xff
     72 
     73 #define SMB_WC_CLOSE                  0x03
     74 #define SMB_WC_READ_ANDX              0x0c
     75 #define SMB_WC_WRITE_ANDX             0x0e
     76 #define SMB_WC_SETUP_ANDX             0x0d
     77 #define SMB_WC_TREE_CONNECT_ANDX      0x04
     78 #define SMB_WC_NT_CREATE_ANDX         0x18
     79 
     80 #define SMB_FLAGS_CANONICAL_PATHNAMES 0x10
     81 #define SMB_FLAGS_CASELESS_PATHNAMES  0x08
     82 #define SMB_FLAGS2_UNICODE_STRINGS    0x8000
     83 #define SMB_FLAGS2_IS_LONG_NAME       0x0040
     84 #define SMB_FLAGS2_KNOWS_LONG_NAME    0x0001
     85 
     86 #define SMB_CAP_LARGE_FILES           0x08
     87 #define SMB_GENERIC_WRITE             0x40000000
     88 #define SMB_GENERIC_READ              0x80000000
     89 #define SMB_FILE_SHARE_ALL            0x07
     90 #define SMB_FILE_OPEN                 0x01
     91 #define SMB_FILE_OVERWRITE_IF         0x05
     92 
     93 #define SMB_ERR_NOACCESS              0x00050001
     94 
     95 struct smb_header {
     96   unsigned char nbt_type;
     97   unsigned char nbt_flags;
     98   unsigned short nbt_length;
     99   unsigned char magic[4];
    100   unsigned char command;
    101   unsigned int status;
    102   unsigned char flags;
    103   unsigned short flags2;
    104   unsigned short pid_high;
    105   unsigned char signature[8];
    106   unsigned short pad;
    107   unsigned short tid;
    108   unsigned short pid;
    109   unsigned short uid;
    110   unsigned short mid;
    111 } PACK;
    112 
    113 struct smb_negotiate_response {
    114   struct smb_header h;
    115   unsigned char word_count;
    116   unsigned short dialect_index;
    117   unsigned char security_mode;
    118   unsigned short max_mpx_count;
    119   unsigned short max_number_vcs;
    120   unsigned int max_buffer_size;
    121   unsigned int max_raw_size;
    122   unsigned int session_key;
    123   unsigned int capabilities;
    124   unsigned int system_time_low;
    125   unsigned int system_time_high;
    126   unsigned short server_time_zone;
    127   unsigned char encryption_key_length;
    128   unsigned short byte_count;
    129   char bytes[1];
    130 } PACK;
    131 
    132 struct andx {
    133   unsigned char command;
    134   unsigned char pad;
    135   unsigned short offset;
    136 } PACK;
    137 
    138 struct smb_setup {
    139   unsigned char word_count;
    140   struct andx andx;
    141   unsigned short max_buffer_size;
    142   unsigned short max_mpx_count;
    143   unsigned short vc_number;
    144   unsigned int session_key;
    145   unsigned short lengths[2];
    146   unsigned int pad;
    147   unsigned int capabilities;
    148   unsigned short byte_count;
    149   char bytes[1024];
    150 } PACK;
    151 
    152 struct smb_tree_connect {
    153   unsigned char word_count;
    154   struct andx andx;
    155   unsigned short flags;
    156   unsigned short pw_len;
    157   unsigned short byte_count;
    158   char bytes[1024];
    159 } PACK;
    160 
    161 struct smb_nt_create {
    162   unsigned char word_count;
    163   struct andx andx;
    164   unsigned char pad;
    165   unsigned short name_length;
    166   unsigned int flags;
    167   unsigned int root_fid;
    168   unsigned int access;
    169   curl_off_t allocation_size;
    170   unsigned int ext_file_attributes;
    171   unsigned int share_access;
    172   unsigned int create_disposition;
    173   unsigned int create_options;
    174   unsigned int impersonation_level;
    175   unsigned char security_flags;
    176   unsigned short byte_count;
    177   char bytes[1024];
    178 } PACK;
    179 
    180 struct smb_nt_create_response {
    181   struct smb_header h;
    182   unsigned char word_count;
    183   struct andx andx;
    184   unsigned char op_lock_level;
    185   unsigned short fid;
    186   unsigned int create_disposition;
    187 
    188   curl_off_t create_time;
    189   curl_off_t last_access_time;
    190   curl_off_t last_write_time;
    191   curl_off_t last_change_time;
    192   unsigned int ext_file_attributes;
    193   curl_off_t allocation_size;
    194   curl_off_t end_of_file;
    195 
    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_NTLM) && \
    247     (CURL_SIZEOF_CURL_OFF_T > 4)
    248 
    249 #if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)
    250 
    251 extern const struct Curl_handler Curl_handler_smb;
    252 extern const struct Curl_handler Curl_handler_smbs;
    253 
    254 #endif /* !USE_WINDOWS_SSPI || USE_WIN32_CRYPTO */
    255 
    256 #endif /* CURL_DISABLE_SMB && USE_NTLM && CURL_SIZEOF_CURL_OFF_T > 4 */
    257 
    258 #endif /* HEADER_CURL_SMB_H */
    259