• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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   *
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 http://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