Squelch an MSVC++ complaint.
[obnox/wireshark/wip.git] / smb.h
1 /* smb.h
2  * Defines for smb packet dissection
3  * Copyright 1999, Richard Sharpe <rsharpe@ns.aus.com>
4  *
5  * $Id: smb.h,v 1.17 2001/11/12 08:46:14 guy Exp $
6  *
7  * Ethereal - Network traffic analyzer
8  * By Gerald Combs <gerald@ethereal.com>
9  * Copyright 1998, 1999 Gerald Combs
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  * 
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  * 
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26 /*
27  * Don't include if already included
28  */
29
30 #ifndef _SMB_H
31 #define _SMB_H
32
33 #ifndef min
34 #define min(a,b) (a < b ? a : b)
35 #endif
36
37 #ifndef max
38 #define max(a,b) (a > b ? a : b)
39 #endif
40
41 #define SMB_PORT 139
42 #define NMB_PORT 137
43 #define DGRAM_PORT 138
44 #define MAX_BUF_SIZE 4096
45
46 #define DEFAULT_BACKLOG 5
47
48 #define SMBopen       0x02   /* open a file */
49 #define SMBcreate     0x03   /* create a file */
50 #define SMBclose      0x04   /* close a file */
51 #define SMBflush      0x05   /* flush a file */
52 #define SMBunlink     0x06   /* delete a file */
53 #define SMBmv         0x07   /* rename a file */
54 #define SMBgetatr     0x08   /* get file attributes */
55 #define SMBsetatr     0x09   /* set file attributes */
56 #define SMBread       0x0A   /* read from a file */
57 #define SMBwrite      0x0B   /* write to a file */
58 #define SMBlock       0x0C   /* lock a byte range */
59 #define SMBunlock     0x0D   /* unlock a byte range */
60 #define SMBctemp      0x0E   /* create a temporary file */
61 #define SMBmknew      0x0F   /* make a new file */
62 #define SMBchkpth     0x10   /* check a directory path */
63 #define SMBexit       0x11   /* process exit */
64 #define SMBlseek      0x12   /* seek */
65 #define SMBtcon       0x70   /* tree connect */
66 #define SMBtdis       0x71   /* tree disconnect */
67 #define SMBnegprot    0x72   /* negotiate a protocol */
68 #define SMBdskattr    0x80   /* get disk attributes */
69 #define SMBsearch     0x81   /* search a directory */
70 #define SMBsplopen    0xC0   /* open a print spool file */
71 #define SMBsplwr      0xC1   /* write to a print spool file */
72 #define SMBsplclose   0xC2   /* close a print spool file */
73 #define SMBsplretq    0xC3   /* return print queue */
74 #define SMBsends      0xD0   /* send a single block message */
75 #define SMBsendb      0xD1   /* send a broadcast message */
76 #define SMBfwdname    0xD2   /* forward user name */
77 #define SMBcancelf    0xD3   /* cancel forward */
78 #define SMBgetmac     0xD4   /* get a machine name */
79 #define SMBsendstrt   0xD5   /* send start of multi-block message */
80 #define SMBsendend    0xD6   /* send end of multi-block message */
81 #define SMBsendtxt    0xD7   /* send text of multi-block message */
82
83 /* CorePlus protocol                                        */
84
85 #define SMBlockread   0x13  /* Lock a range and read it */
86 #define SMBwriteunlock 0x14 /* Unlock a range and then write */
87 #define SMBreadbraw   0x1a  /* read a block of data without smb header ohead*/
88 #define SMBwritebraw  0x1d  /* write a block of data without smb header ohead*/
89 #define SMBwritec     0x20  /* secondary write request */
90 #define SMBwriteclose 0x2c  /* write a file and then close it */
91
92 /* DOS Extended Protocol                                    */
93
94 #define SMBreadBraw      0x1A   /* read block raw */
95 #define SMBreadBmpx      0x1B   /* read block multiplexed */
96 #define SMBreadBs        0x1C   /* read block (secondary response) */
97 #define SMBwriteBraw     0x1D   /* write block raw */
98 #define SMBwriteBmpx     0x1E   /* write block multiplexed */
99 #define SMBwriteBs       0x1F   /* write block (secondary request) */
100 #define SMBwriteC        0x20   /* write complete response */
101 #define SMBsetattrE      0x22   /* set file attributes expanded */
102 #define SMBgetattrE      0x23   /* get file attributes expanded */
103 #define SMBlockingX      0x24   /* lock/unlock byte ranges and X */
104 #define SMBtrans         0x25   /* transaction - name, bytes in/out */
105 #define SMBtranss        0x26   /* transaction (secondary request/response) */
106 #define SMBioctl         0x27   /* IOCTL */
107 #define SMBioctls        0x28   /* IOCTL  (secondary request/response) */
108 #define SMBcopy          0x29   /* copy */
109 #define SMBmove          0x2A   /* move */
110 #define SMBecho          0x2B   /* echo */
111 #define SMBopenX         0x2D   /* open and X */
112 #define SMBreadX         0x2E   /* read and X */
113 #define SMBwriteX        0x2F   /* write and X */
114 #define SMBsesssetupX    0x73   /* Session Set Up & X (including User Logon) */
115 #define SMBtconX         0x75   /* tree connect and X */
116 #define SMBffirst        0x82   /* find first */
117 #define SMBfunique       0x83   /* find unique */
118 #define SMBfclose        0x84   /* find close */
119 #define SMBinvalid       0xFE   /* invalid command */
120
121 /* Any more ? */
122
123 #define SMBdatablockID     0x01  /* A data block identifier */
124 #define SMBdialectID       0x02  /* A dialect id            */
125 #define SMBpathnameID      0x03  /* A pathname ID           */
126 #define SMBasciiID         0x04  /* An ascii string ID      */
127 #define SMBvariableblockID 0x05  /* A variable block ID     */
128
129 /* some other defines we need */
130
131 #define SMB_AMODE_WTRU      0x4000
132 #define SMB_AMODE_NOCACHE   0x1000
133 #define SMB_AMODE_COMPAT    0x0000
134 #define SMB_AMODE_DENYRWX   0x0010
135 #define SMB_AMODE_DENYW     0x0020
136 #define SMB_AMODE_DENYRX    0x0030
137 #define SMB_AMODE_DENYNONE  0x0040
138 #define SMB_AMODE_OPENR     0x0000
139 #define SMB_AMODE_OPENW     0x0001
140 #define SMB_AMODE_OPENRW    0x0002
141 #define SMB_AMODE_OPENX     0x0003
142 #define SMB_AMODE_FCBOPEN   0x00FF
143 #define SMB_AMODE_LOCUNKN   0x0000
144 #define SMB_AMODE_LOCMSEQ   0x0100
145 #define SMB_AMODE_LOCMRAN   0x0200
146 #define SMB_AMODE_LOCRAL    0x0300
147
148 /* Flags defines ... */
149
150 #define SMB_FLG2_NON_DOS    0x01 /* We know non dos names             */
151 #define SMB_FLG2_EXT_ATR    0x02 /* We know about Extended Attributes */
152 #define SMB_FLG2_LNG_NAM    0x04 /* Long names ?                      */
153
154 #define SMB_EOF 0
155 #define SMB_SMB 1
156
157 /* SMB Protocols ... Samba should be in there as well ... */
158
159 #define SMB_P_Unknown      -1        /* Hmmm, is this smart? */
160 #define SMB_P_Core         0
161 #define SMB_P_CorePlus     1
162 #define SMB_P_DOSLanMan1   2
163 #define SMB_P_LanMan1      3
164 #define SMB_P_DOSLanMan2   4 
165 #define SMB_P_LanMan2      5
166 #define SMB_P_DOSLanMan2_1 6
167 #define SMB_P_LanMan2_1    7
168 #define SMB_P_NT1          8
169
170 /* Error codes */
171
172 #define SMB_SUCCESS 0x00  /* All OK */
173 #define SMB_ERRDOS  0x01  /* DOS based error */
174 #define SMB_ERRSRV  0x02  /* server error, network file manager */
175 #define SMB_ERRHRD  0x03  /* Hardware style error */
176 #define SMB_ERRCMD  0x04  /* Not an SMB format command */
177
178 /* SMB X/Open error codes for the ERRDOS error class */
179 #define SMBE_badfunc 1             /* Invalid function (or system call) */
180 #define SMBE_badfile 2             /* File not found (pathname error) */
181 #define SMBE_badpath 3             /* Directory not found */
182 #define SMBE_nofids 4              /* Too many open files */
183 #define SMBE_noaccess 5            /* Access denied */
184 #define SMBE_badfid 6              /* Invalid fid */
185 #define SMBE_nomem 8               /* Out of memory */
186 #define SMBE_badmem 9              /* Invalid memory block address */
187 #define SMBE_badenv 10             /* Invalid environment */
188 #define SMBE_badaccess 12          /* Invalid open mode */
189 #define SMBE_baddata 13            /* Invalid data (only from ioctl call) */
190 #define SMBE_res 14 
191 #define SMBE_baddrive 15           /* Invalid drive */
192 #define SMBE_remcd 16              /* Attempt to delete current directory */
193 #define SMBE_diffdevice 17         /* rename/move across different filesystems */
194 #define SMBE_nofiles 18            /* no more files found in file search */
195 #define SMBE_badshare 32           /* Share mode on file conflict with open mode */
196 #define SMBE_lock 33               /* Lock request conflicts with existing lock */
197 #define SMBE_unsup 50              /* Request unsupported, returned by Win 95, RJS 20Jun98 */
198 #define SMBE_nosuchshare 67        /* Share does not exits */
199 #define SMBE_filexists 80          /* File in operation already exists */
200 #define SMBE_cannotopen 110        /* Cannot open the file specified */
201 #define SMBE_unknownlevel 124
202 #define SMBE_badpipe 230           /* Named pipe invalid */
203 #define SMBE_pipebusy 231          /* All instances of pipe are busy */
204 #define SMBE_pipeclosing 232       /* named pipe close in progress */
205 #define SMBE_notconnected 233      /* No process on other end of named pipe */
206 #define SMBE_moredata 234          /* More data to be returned */
207 #define SMBE_baddirectory 267      /* Invalid directory name in a path. */
208 #define SMBE_eas_didnt_fit 275     /* Extended attributes didn't fit */
209 #define SMBE_eas_nsup 282          /* Extended attributes not supported */
210 #define SMBE_notify_buf_small 1022 /* Buffer too small to return change notify. */
211 #define SMBE_unknownipc 2142
212 #define SMBE_noipc 66              /* don't support ipc */
213
214 /* Error codes for the ERRSRV class */
215
216 #define SMBE_error 1               /* Non specific error code */
217 #define SMBE_badpw 2               /* Bad password */
218 #define SMBE_badtype 3             /* reserved */
219 #define SMBE_access 4              /* No permissions to do the requested operation */
220 #define SMBE_invnid 5              /* tid invalid */
221 #define SMBE_invnetname 6          /* Invalid servername */
222 #define SMBE_invdevice 7           /* Invalid device */
223 #define SMBE_qfull 49              /* Print queue full */
224 #define SMBE_qtoobig 50            /* Queued item too big */
225 #define SMBE_qeof 51               /* EOF in print queue dump */
226 #define SMBE_invpfid 52            /* Invalid print file in smb_fid */
227 #define SMBE_smbcmd 64             /* Unrecognised command */
228 #define SMBE_srverror 65           /* smb server internal error */
229 #define SMBE_filespecs 67          /* fid and pathname invalid combination */
230 #define SMBE_badlink 68 
231 #define SMBE_badpermits 69         /* Access specified for a file is not valid */
232 #define SMBE_badpid 70 
233 #define SMBE_setattrmode 71        /* attribute mode invalid */
234 #define SMBE_paused 81             /* Message server paused */
235 #define SMBE_msgoff 82             /* Not receiving messages */
236 #define SMBE_noroom 83             /* No room for message */
237 #define SMBE_rmuns 87              /* too many remote usernames */
238 #define SMBE_timeout 88            /* operation timed out */
239 #define SMBE_noresource  89        /* No resources currently available for request. */
240 #define SMBE_toomanyuids 90        /* too many userids */
241 #define SMBE_baduid 91             /* bad userid */
242 #define SMBE_useMPX 250            /* temporarily unable to use raw mode, use MPX mode */
243 #define SMBE_useSTD 251            /* temporarily unable to use raw mode, use standard mode */
244 #define SMBE_contMPX 252           /* resume MPX mode */
245 #define SMBE_badPW 253             /* Check this out ... */ 
246 #define SMBE_nosupport 0xFFFF
247 #define SMBE_unknownsmb 22         /* from NT 3.5 response */
248
249 /* Error codes for the ERRHRD class */
250
251 #define SMBE_nowrite 19   /* read only media */
252 #define SMBE_badunit 20   /* Unknown device */
253 #define SMBE_notready 21  /* Drive not ready */
254 #define SMBE_badcmd 22    /* Unknown command */
255 #define SMBE_data 23      /* Data (CRC) error */
256 #define SMBE_badreq 24    /* Bad request structure length */
257 #define SMBE_seek 25
258 #define SMBE_badmedia 26
259 #define SMBE_badsector 27
260 #define SMBE_nopaper 28
261 #define SMBE_write 29 
262 #define SMBE_read 30 
263 #define SMBE_general 31 
264 #define SMBE_badshare 32 
265 #define SMBE_lock 33 
266 #define SMBE_wrongdisk 34
267 #define SMBE_FCBunavail 35
268 #define SMBE_sharebufexc 36
269 #define SMBE_diskfull 39
270
271 /* Flags ... CIFS 3.1.1 */
272
273 #define SMB_FLG_LCKREAD   0x01   /* Supports LockRead   */
274 #define SMB_FLG_CLT_BUF   0x02   /* Client Buff avail   */
275 #define SMB_FLG_RES       0x04   /* Reserved            */
276 #define SMB_FLG_CSLS_PN   0x08   /* Caseless Pathnames  */
277 #define SMB_FLG_CAN_PN    0x10   /* Canonical Pathnames */
278 #define SMB_FLG_REQ_OPL   0x20   /* Requests OPLOCKS    */
279 #define SMB_FLG_REQ_BOPL  0x40   /* Requests Batch OPLs */
280 #define SMB_FLG_REPLY     0x80   /* A reply             */
281
282 /* SMB Offsets ... */
283
284 #define SMB_FieldP(smb, off) (smb+off)
285
286 #define SMB_DEF_IDF 0x424D53FF        /* "\377SMB" */
287
288 #define SMB_hdr_idf_offset    0          /* 0xFF,'SMB' 0-3 */
289 #define SMB_hdr_com_offset    4          /* BYTE       4   */
290 #define SMB_hdr_rcls_offset   5          /* BYTE       5   */
291 #define SMB_hdr_reh_offset    6          /* BYTE       6   */
292 #define SMB_hdr_err_offset    7          /* WORD       7   */
293 #define SMB_hdr_reb_offset    9          /* BYTE       9   */
294 #define SMB_hdr_flg_offset    9          /* same as reb ...*/
295 #define SMB_hdr_res_offset    10         /* 7 WORDs    10  */
296 #define SMB_hdr_res0_offset   10         /* WORD       10  */
297 #define SMB_hdr_flg2_offset   10         /* WORD           */
298 #define SMB_hdr_res1_offset   12         /* WORD       12  */
299 #define SMB_hdr_res2_offset   14
300 #define SMB_hdr_res3_offset   16
301 #define SMB_hdr_res4_offset   18
302 #define SMB_hdr_res5_offset   20
303 #define SMB_hdr_res6_offset   22
304 #define SMB_hdr_tid_offset    24
305 #define SMB_hdr_pid_offset    26
306 #define SMB_hdr_uid_offset    28
307 #define SMB_hdr_mid_offset    30
308 #define SMB_hdr_wct_offset    32
309
310 #define SMB_hdr_len           33        /* 33 byte header?      */
311
312 #define SMB_hdr_axc_offset    33        /* AndX Command         */
313 #define SMB_hdr_axr_offset    34        /* AndX Reserved        */
314 #define SMB_hdr_axo_offset    35     /* Offset from start to WCT of AndX cmd */
315
316 /* Format of the Negotiate Protocol SMB */
317
318 #define SMB_negp_bcc_offset   33
319 #define SMB_negp_buf_offset   35        /* Where the buffer starts   */
320 #define SMB_negp_len          35        /* plus the data             */
321
322 /* Format of the Negotiate Response SMB, for CoreProtocol, LM1.2 and */
323 /* NT LM 0.12. wct will be 1 for CoreProtocol, 13 for LM 1.2, and 17 */
324 /* for NT LM 0.12                                                    */
325
326 #define SMB_negrCP_idx_offset   33        /* Response to the neg req */
327 #define SMB_negrCP_bcc_offset   35
328 #define SMB_negrLM_idx_offset   33        /* dialect index           */
329 #define SMB_negrLM_sec_offset   35        /* Security mode           */
330 #define SMB_sec_user_mask       0x01      /* 0 = share, 1 = user     */
331 #define SMB_sec_encrypt_mask    0x02      /* pick out encrypt        */
332 #define SMB_negrLM_mbs_offset   37        /* max buffer size         */
333 #define SMB_negrLM_mmc_offset   39        /* max mpx count           */
334 #define SMB_negrLM_mnv_offset   41        /* max number of VCs       */
335 #define SMB_negrLM_rm_offset    43        /* raw mode support bit vec*/
336 #define SMB_read_raw_mask       0x01
337 #define SMB_write_raw_mask      0x02
338 #define SMB_negrLM_sk_offset    45        /* session key, 32 bits    */
339 #define SMB_negrLM_st_offset    49        /* Current server time     */
340 #define SMB_negrLM_sd_offset    51        /* Current server date     */
341 #define SMB_negrLM_stz_offset   53        /* Server Time Zone        */
342 #define SMB_negrLM_ekl_offset   55        /* encryption key length   */
343 #define SMB_negrLM_res_offset   57        /* reserved                */
344 #define SMB_negrLM_bcc_offset   59        /* bcc                     */
345 #define SMB_negrLM_len          61        /* 61 bytes ?              */
346 #define SMB_negrLM_buf_offset   61        /* Where the fun begins    */
347
348 #define SMB_negrNTLM_idx_offset 33        /* Selected protocol       */
349 #define SMB_negrNTLM_sec_offset 35        /* Security more           */
350 #define SMB_negrNTLM_mmc_offset 36        /* Different format above  */
351 #define SMB_negrNTLM_mnv_offset 38        /* Max VCs                 */
352 #define SMB_negrNTLM_mbs_offset 40        /* MBS now a long          */
353 #define SMB_negrNTLM_mrs_offset 44        /* Max raw size            */
354 #define SMB_negrNTLM_sk_offset  48        /* Session Key             */
355 #define SMB_negrNTLM_cap_offset 52        /* Capabilities            */
356 #define SMB_negrNTLM_stl_offset 56        /* Server time low         */
357 #define SMB_negrNTLM_sth_offset 60        /* Server time high        */
358 #define SMB_negrNTLM_stz_offset 64        /* Server time zone        */
359 #define SMB_negrNTLM_ekl_offset 66        /* Encrypt key len         */
360 #define SMB_negrNTLM_bcc_offset 67        /* Bcc                     */
361 #define SMB_negrNTLM_len        69
362 #define SMB_negrNTLM_buf_offset 69
363
364 /* Offsets related to Tree Connect                                      */
365
366 #define SMB_tcon_bcc_offset     33
367 #define SMB_tcon_buf_offset     35        /* where the data is for tcon */
368 #define SMB_tcon_len            35        /* plus the data              */
369
370 #define SMB_tconr_mbs_offset    33        /* max buffer size         */
371 #define SMB_tconr_tid_offset    35        /* returned tree id        */
372 #define SMB_tconr_bcc_offset    37       
373 #define SMB_tconr_len           39 
374
375 #define SMB_tconx_axc_offset    33        /* And X Command                */
376 #define SMB_tconx_axr_offset    34        /* reserved                     */
377 #define SMB_tconx_axo_offset    35        /* Next command offset          */
378 #define SMB_tconx_flg_offset    37        /* Flags, bit0=1 means disc TID */
379 #define SMB_tconx_pwl_offset    39        /* Password length              */
380 #define SMB_tconx_bcc_offset    41        /* bcc                          */
381 #define SMB_tconx_buf_offset    43        /* buffer                       */
382 #define SMB_tconx_len           43        /* up to data ...               */
383
384 #define SMB_tconxr_axc_offset   33        /* Where the AndX Command is    */
385 #define SMB_tconxr_axr_offset   34        /* Reserved                     */
386 #define SMB_tconxr_axo_offset   35        /* AndX offset location         */
387
388 /* Offsets related to tree_disconnect                                  */
389
390 #define SMB_tdis_bcc_offset     33        /* bcc                     */
391 #define SMB_tdis_len            35        /* total len               */
392
393 #define SMB_tdisr_bcc_offset    33        /* bcc                     */
394 #define SMB_tdisr_len           35
395
396 /* Offsets related to Open Request                                     */
397
398 #define SMB_open_mod_offset     33        /* Mode to open with       */
399 #define SMB_open_atr_offset     35        /* Attributes of file      */
400 #define SMB_open_bcc_offset     37        /* bcc                     */
401 #define SMB_open_buf_offset     39        /* File name               */
402 #define SMB_open_len            39        /* Plus the file name      */
403
404 #define SMB_openx_axc_offset    33        /* Next command            */
405 #define SMB_openx_axr_offset    34        /* Reserved                */
406 #define SMB_openx_axo_offset    35        /* offset of next wct      */
407 #define SMB_openx_flg_offset    37        /* Flags, bit0 = need more info */
408                                           /* bit1 = exclusive oplock */
409                                           /* bit2 = batch oplock     */
410 #define SMB_openx_mod_offset    39        /* mode to open with       */
411 #define SMB_openx_atr_offset    41        /* search attributes       */
412 #define SMB_openx_fat_offset    43        /* File attributes         */
413 #define SMB_openx_tim_offset    45        /* time and date of creat  */
414 #define SMB_openx_ofn_offset    49        /* Open function           */
415 #define SMB_openx_als_offset    51        /* Space to allocate on    */
416 #define SMB_openx_res_offset    55        /* reserved                */
417 #define SMB_openx_bcc_offset    63        /* bcc                     */
418 #define SMB_openx_buf_offset    65        /* Where file name goes    */
419 #define SMB_openx_len           65
420
421 #define SMB_openr_fid_offset    33        /* FID returned            */
422 #define SMB_openr_atr_offset    35        /* Attributes opened with  */
423 #define SMB_openr_tim_offset    37        /* Last mod time of file   */
424 #define SMB_openr_fsz_offset    41        /* File size 4 bytes       */
425 #define SMB_openr_acc_offset    45        /* Access allowed          */
426 #define SMB_openr_bcc_offset    47
427 #define SMB_openr_len           49
428
429 #define SMB_openxr_axc_offset   33        /* And X command           */
430 #define SMB_openxr_axr_offset   34        /* reserved                */
431 #define SMB_openxr_axo_offset   35        /* offset to next command  */
432 #define SMB_openxr_fid_offset   37        /* FID returned            */
433 #define SMB_openxr_fat_offset   39        /* File attributes returned*/
434 #define SMB_openxr_tim_offset   41        /* File creation date etc  */
435 #define SMB_openxr_fsz_offset   45        /* Size of file            */
436 #define SMB_openxr_acc_offset   49        /* Access granted          */
437
438 #define SMB_clos_fid_offset     33        /* FID to close            */
439 #define SMB_clos_tim_offset     35        /* Last mod time           */
440 #define SMB_clos_bcc_offset     39        /* bcc                     */        
441 #define SMB_clos_len            41
442
443 /* Offsets related to Write requests                                 */
444
445 #define SMB_write_fid_offset    33        /* FID to write            */
446 #define SMB_write_cnt_offset    35        /* bytes to write          */
447 #define SMB_write_ofs_offset    37        /* location to write to    */
448 #define SMB_write_clf_offset    41        /* advisory count left     */
449 #define SMB_write_bcc_offset    43        /* bcc = data bytes + 3    */
450 #define SMB_write_buf_offset    45        /* Data=0x01, len, data    */
451 #define SMB_write_len           45        /* plus the data ...       */
452
453 #define SMB_writr_cnt_offset    33        /* Count of bytes written  */
454 #define SMB_writr_bcc_offset    35        /* bcc                     */
455 #define SMB_writr_len           37
456
457 /* Offsets related to read requests */
458
459 #define SMB_read_fid_offset     33        /* FID of file to read     */
460 #define SMB_read_cnt_offset     35        /* count of words to read  */
461 #define SMB_read_ofs_offset     37        /* Where to read from      */
462 #define SMB_read_clf_offset     41        /* Advisory count to go    */
463 #define SMB_read_bcc_offset     43
464 #define SMB_read_len            45
465
466 #define SMB_readr_cnt_offset    33        /* Count of bytes returned */
467 #define SMB_readr_res_offset    35        /* 4 shorts reserved, 8 bytes */
468 #define SMB_readr_bcc_offset    43        /* bcc                     */
469 #define SMB_readr_bff_offset    45        /* buffer format char = 0x01 */
470 #define SMB_readr_len_offset    46        /* buffer len              */
471 #define SMB_readr_len           45        /* length of the readr before data */
472
473 /* Offsets for Create file                                           */
474
475 #define SMB_creat_atr_offset    33        /* Attributes of new file ... */
476 #define SMB_creat_tim_offset    35        /* Time of creation           */
477 #define SMB_creat_dat_offset    37        /* 4004BCE :-)                */
478 #define SMB_creat_bcc_offset    39        /* bcc                        */
479 #define SMB_creat_buf_offset    41
480 #define SMB_creat_len           41        /* Before the data            */
481
482 #define SMB_creatr_fid_offset   33        /* FID of created file        */
483
484 /* Offsets for Delete file                                           */
485
486 #define SMB_delet_sat_offset    33        /* search attribites          */
487 #define SMB_delet_bcc_offset    35        /* bcc                        */
488 #define SMB_delet_buf_offset    37
489 #define SMB_delet_len           37
490
491 /* Offsets for SESSION_SETUP_ANDX for both LM and NT LM protocols    */
492
493 #define SMB_ssetpLM_mbs_offset  37        /* Max buffer Size, allow for AndX */
494 #define SMB_ssetpLM_mmc_offset  39        /* max multiplex count             */
495 #define SMB_ssetpLM_vcn_offset  41        /* VC number if new VC             */
496 #define SMB_ssetpLM_snk_offset  43        /* Session Key                     */
497 #define SMB_ssetpLM_pwl_offset  47        /* password length                 */
498 #define SMB_ssetpLM_res_offset  49        /* reserved                        */
499 #define SMB_ssetpLM_bcc_offset  53        /* bcc                             */
500 #define SMB_ssetpLM_len         55        /* before data ...                 */
501 #define SMB_ssetpLM_buf_offset  55
502
503 #define SMB_ssetpNTLM_mbs_offset 37       /* Max Buffer Size for NT LM 0.12  */
504                                           /* and above                       */
505 #define SMB_ssetpNTLM_mmc_offset 39       /* Max Multiplex count             */
506 #define SMB_ssetpNTLM_vcn_offset 41       /* VC Number                       */
507 #define SMB_ssetpNTLM_snk_offset 43       /* Session key                     */
508 #define SMB_ssetpNTLM_cipl_offset 47      /* Case Insensitive PW Len         */
509 #define SMB_ssetpNTLM_cspl_offset 49      /* Unicode pw len                  */
510 #define SMB_ssetpNTLM_res_offset 51       /* reserved                        */
511 #define SMB_ssetpNTLM_cap_offset 55       /* server capabilities             */
512 #define SMB_ssetpNTLM_bcc_offset 59       /* bcc                             */
513 #define SMB_ssetpNTLM_len        61       /* before data                     */
514 #define SMB_ssetpNTLM_buf_offset 61
515
516 #define SMB_ssetpr_axo_offset  35         /* Offset of next response ...    */
517 #define SMB_ssetpr_act_offset  37         /* action, bit 0 = 1 => guest     */
518 #define SMB_ssetpr_bcc_offset  39         /* bcc                            */
519 #define SMB_ssetpr_buf_offset  41         /* Native OS etc                  */
520
521 /* Offsets for SMB create directory                                         */
522
523 #define SMB_creatdir_bcc_offset 33        /* only a bcc here                */
524 #define SMB_creatdir_buf_offset 35        /* Where things start             */
525 #define SMB_creatdir_len        35
526
527 /* Offsets for SMB delete directory                                         */
528
529 #define SMB_deletdir_bcc_offset 33        /* only a bcc here                */
530 #define SMB_deletdir_buf_offset 35        /* where things start             */
531 #define SMB_deletdir_len        35
532
533 /* Offsets for SMB check directory                                          */
534
535 #define SMB_checkdir_bcc_offset 33        /* Only a bcc here                */
536 #define SMB_checkdir_buf_offset 35        /* where things start             */
537 #define SMB_checkdir_len        35
538
539 /* Offsets for SMB search                                                   */
540
541 #define SMB_search_mdc_offset   33        /* Max Dir ents to return         */
542 #define SMB_search_atr_offset   35        /* Search attributes              */
543 #define SMB_search_bcc_offset   37        /* bcc                            */
544 #define SMB_search_buf_offset   39        /* where the action is            */
545 #define SMB_search_len          39
546
547 #define SMB_searchr_dec_offset  33        /* Dir ents returned              */
548 #define SMB_searchr_bcc_offset  35        /* bcc                            */
549 #define SMB_searchr_buf_offset  37        /* Where the action starts        */
550 #define SMB_searchr_len         37        /* before the dir ents            */
551
552 #define SMB_searchr_dirent_len  43        /* 53 bytes                       */
553
554 /* Defines for SMB getatr call                                              */
555
556 #define SMB_getatr_bcc_offset 33        /* Only a bcc here           */
557 #define SMB_getatr_buf_offset 35        /* Where the buffer starts   */
558 #define SMB_getatr_len        35
559
560 #define SMB_getatrr_atr_offset 33       /* Attr offset               */
561 #define SMB_getatrr_tim_offset 35       /* Time1 field offset        */
562 #define SMB_getatrr_siz_offset 39       /* Size offset               */
563 #define SMB_getatrr_mbz_offset 43       /* MBZ Field                 */
564 #define SMB_getatrr_bcc_offset 53       /* bcc = 0                   */
565 #define SMB_getatrr_len        55
566
567 /* Defines the setatr call                                           */
568
569 #define SMB_setatr_atr_offset  33      /* Attribute offset           */
570 #define SMB_setatr_tim_offset  35      /* Time1 offset               */
571 #define SMB_setatr_siz_offset  39      /* size offset                */
572 #define SMB_setatr_mbz_offset  43      
573 #define SMB_setatr_bcc_offset  53      /* Where bcc is               */
574 #define SMB_setatr_buf_offset  55      /* Where the data goes        */
575 #define SMB_setatr_len         55      /* Plus the params            */
576
577 #define SMB_setatrr_bcc        33      /* Nothing much here          */
578 #define SMB_setatrr_len        35
579
580 /* Defines for SMB transact and transact2 calls                             */
581
582 #define SMB_trans_tpc_offset    33        /* Total param count              */
583 #define SMB_trans_tdc_offset    35        /* total Data count               */
584 #define SMB_trans_mpc_offset    37        /* Max params bytes to return     */
585 #define SMB_trans_mdc_offset    39        /* Max data bytes to return       */
586 #define SMB_trans_msc_offset    41        /* Max setup words to return      */
587 #define SMB_trans_rs1_offset    42        /* Reserved byte                  */
588 #define SMB_trans_flg_offset    43        /* flags                          */
589 #define SMB_trans_tmo_offset    45        /* Timeout, long                  */
590 #define SMB_trans_rs2_offset    49        /* Next reserved                  */
591 #define SMB_trans_pbc_offset    51        /* Param Byte count in buf        */
592 #define SMB_trans_pbo_offset    53        /* Offset to param bytes          */
593 #define SMB_trans_dbc_offset    55        /* Data byte count in buf         */
594 #define SMB_trans_dbo_offset    57        /* Data byte offset               */
595 #define SMB_trans_suc_offset    59        /* Setup count - byte             */
596 #define SMB_trans_rs3_offset    60        /* Reserved to pad ...            */
597 #define SMB_trans_len           61        /* Up to setup, still need bcc    */
598
599 #define SMB_transr_tpc_offset   33        /* Total param bytes returned     */
600 #define SMB_transr_tdc_offset   35
601 #define SMB_transr_rs1_offset   37
602 #define SMB_transr_pbc_offset   39
603 #define SMB_transr_pbo_offset   41
604 #define SMB_transr_pdi_offset   43        /* parameter displacement         */
605 #define SMB_transr_dbc_offset   45
606 #define SMB_transr_dbo_offset   47
607 #define SMB_transr_ddi_offset   49
608 #define SMB_transr_suc_offset   51
609 #define SMB_transr_rs2_offset   52
610 #define SMB_transr_len          53
611
612 /* Bit masks for SMB Capabilities ...                       */
613
614 #define SMB_cap_raw_mode         0x0001
615 #define SMB_cap_mpx_mode         0x0002
616 #define SMB_cap_unicode          0x0004
617 #define SMB_cap_large_files      0x0008
618 #define SMB_cap_nt_smbs          0x0010
619 #define SMB_rpc_remote_apis      0x0020
620 #define SMB_cap_nt_status        0x0040
621 #define SMB_cap_level_II_oplocks 0x0080
622 #define SMB_cap_lock_and_read    0x0100
623 #define SMB_cap_nt_find          0x0200
624
625 /* SMB LANMAN api call defines */
626
627 #define SMB_LMapi_SetUserInfo     0x0072
628 #define SMB_LMapi_UserPasswordSet 0x0073
629
630 /*
631  * One of these data structures is allocated for a transaction or
632  * transaction2 request; it keeps track of all information that's
633  * available in the request but not the reply and that's needed in
634  * order to dissect the reply, as well as the frame number of the
635  * request.
636  */
637 struct smb_request_val {
638   int frame;                   /* Frame in which this request appeared */
639   int last_transact2_command;
640   gchar *last_transact_command;
641   guint16 last_lanman_cmd;
642   guchar *last_param_descrip;  /* Keep these descriptors around */
643   guchar *last_data_descrip;
644   guchar *last_aux_data_descrip;
645   guint16 trans_response_seen;
646   int last_level;              /* Last level in request */
647 };
648
649 /*
650  * One of these data structures is allocated for a transaction reply
651  * that's continued in a later reply; it keeps track of the pathname
652  * from the request that generated the reply, as well as the frame
653  * number of the continued message.
654  */
655 struct smb_continuation_val {
656   int frame;                   /* Frame in which this reply appeared */
657   const gchar *transact_name;
658 };
659
660 typedef struct smb_info {
661   /* this will be cleaned up when all smb is tvbuffified */
662   int cmd, tid, uid, mid, pid;  /* Any more? */
663   address *src, *dst;
664   int frame_req, frame_res;
665   gboolean unidir;
666   int subcmd;
667   int info_level;
668   int info_count;
669
670
671   conversation_t *conversation;
672   struct smb_request_val *request_val;
673   struct smb_continuation_val *continuation_val;
674   gboolean unicode;             /* Are strings in this SMB Unicode? */
675   gboolean request;             /* Is this a request? */
676   gboolean is_interim_response; /* Is this an interim transaction response? */
677   int parameter_count;          /* Number of bytes of parameter in transaction */
678   int data_offset;              /* Offset from parameter to data in transaction */
679   int data_count;               /* Number of bytes of data in transaction */
680   guint16 ddisp;                /* Data displacement for transaction commands */
681   char *trans_cmd;              /* Command for mailslot dissection */
682 } smb_info_t;
683
684 #endif