1 /*
   2  * Copyright (c) 2000-2001 Boris Popov
   3  * All rights reserved.
   4  *
   5  * Now many of these defines are from samba4 code, by Andrew Tridgell.
   6  * (Permission given to Conrad Minshall at CIFS plugfest Aug 13 2003.)
   7  * (Note the main decision was whether to use defines found in MS includes
   8  * and web pages, versus Samba, and the deciding factor is which developers
   9  * are more likely to be looking at this code base.)
  10  *
  11  * Redistribution and use in source and binary forms, with or without
  12  * modification, are permitted provided that the following conditions
  13  * are met:
  14  * 1. Redistributions of source code must retain the above copyright
  15  *    notice, this list of conditions and the following disclaimer.
  16  * 2. Redistributions in binary form must reproduce the above copyright
  17  *    notice, this list of conditions and the following disclaimer in the
  18  *    documentation and/or other materials provided with the distribution.
  19  * 3. All advertising materials mentioning features or use of this software
  20  *    must display the following acknowledgement:
  21  *    This product includes software developed by Boris Popov.
  22  * 4. Neither the name of the author nor the names of any co-contributors
  23  *    may be used to endorse or promote products derived from this software
  24  *    without specific prior written permission.
  25  *
  26  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  36  * SUCH DAMAGE.
  37  *
  38  * $Id: smb.h,v 1.36.90.1 2005/05/27 02:35:29 lindak Exp $
  39  */
  40 
  41 /*
  42  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  43  */
  44 
  45 #ifndef _NETSMB_SMB_H_
  46 #define _NETSMB_SMB_H_
  47 
  48 /*
  49  * Common definitions and structures for SMB/CIFS protocol
  50  * This file should be purely SMB protocol definition stuff.
  51  * (Please don't make it a catch-all:)
  52  */
  53 
  54 #include <smb/doserror.h>
  55 #include <smb/lmerr.h>
  56 #include <smb/nterror.h>
  57 #include <smb/ntstatus.h>
  58 
  59 /*
  60  * SMB dialects that we have to deal with.
  61  */
  62 enum smb_dialects {
  63         SMB_DIALECT_NONE,
  64         SMB_DIALECT_CORE,               /* PC NETWORK PROGRAM 1.0, PCLAN1.0 */
  65         SMB_DIALECT_COREPLUS,           /* MICROSOFT NETWORKS 1.03 */
  66         SMB_DIALECT_LANMAN1_0,          /* MICROSOFT NETWORKS 3.0, LANMAN1.0 */
  67         SMB_DIALECT_LANMAN2_0,          /* LM1.2X002, DOS LM1.2X002, Samba */
  68         SMB_DIALECT_LANMAN2_1,          /* DOS LANMAN2.1, LANMAN2.1 */
  69         SMB_DIALECT_NTLM0_12            /* NT LM 0.12, Windows for Workgroups */
  70                                         /* 3.1a, * NT LANMAN 1.0 */
  71 };
  72 
  73 /*
  74  * Formats of data/string buffers
  75  */
  76 #define SMB_DT_DATA             1
  77 #define SMB_DT_DIALECT          2
  78 #define SMB_DT_PATHNAME         3
  79 #define SMB_DT_ASCII            4
  80 #define SMB_DT_VARIABLE         5
  81 
  82 /*
  83  * SMB header
  84  */
  85 #define SMB_SIGNATURE           "\xFFSMB"
  86 #define SMB_SIGLEN              4
  87 #define SMB_HDRCMD(p)           (*((uchar_t *)(p) + SMB_SIGLEN))
  88 #define SMB_HDRMID(p)           (*(ushort_t *)((uchar_t *)(p) + 30))
  89 #define SMB_HDRLEN              32
  90 /*
  91  * bits in the smb_flags field
  92  */
  93 #define SMB_FLAGS_SUPPORT_LOCKREAD      0x01
  94 #define SMB_FLAGS_CLIENT_BUF_AVAIL      0x02
  95 #define SMB_FLAGS_CASELESS              0x08
  96 #define SMB_FLAGS_CANONICAL_PATHNAMES   0x10
  97 #define SMB_FLAGS_REQUEST_OPLOCK        0x20
  98 #define SMB_FLAGS_REQUEST_BATCH_OPLOCK  0x40
  99 #define SMB_FLAGS_SERVER_RESP           0x80
 100 
 101 /*
 102  * bits in the smb_flags2 field
 103  */
 104 #define SMB_FLAGS2_KNOWS_LONG_NAMES     0x0001
 105 #define SMB_FLAGS2_KNOWS_EAS            0x0002  /* client know about EAs */
 106 #define SMB_FLAGS2_SECURITY_SIGNATURE   0x0004  /* check SMB integrity */
 107 #define SMB_FLAGS2_IS_LONG_NAME         0x0040  /* any path name is long name */
 108 #define SMB_FLAGS2_EXT_SEC              0x0800  /* client aware of Extended */
 109                                                 /* Security negotiation */
 110 #define SMB_FLAGS2_DFS                  0x1000  /* resolve paths in DFS */
 111 #define SMB_FLAGS2_PAGING_IO            0x2000  /* for exec */
 112 #define SMB_FLAGS2_ERR_STATUS           0x4000  /* 1 - status.status */
 113 #define SMB_FLAGS2_UNICODE              0x8000  /* use Unicode for strings */
 114 
 115 #define SMB_UID_UNKNOWN         0xffff
 116 #define SMB_TID_UNKNOWN         0xffff
 117 #define SMB_FID_UNUSED          0xffff
 118 
 119 /*
 120  * Security mode bits
 121  */
 122 #define SMB_SM_USER             0x01    /* server in the user security mode */
 123 #define SMB_SM_ENCRYPT          0x02    /* use challenge/responce */
 124 #define SMB_SM_SIGS             0x04
 125 #define SMB_SM_SIGS_REQUIRE     0x08
 126 
 127 /*
 128  * Action bits in session setup reply
 129  */
 130 #define SMB_ACT_GUEST           0x01
 131 
 132 /*
 133  * NTLM capabilities
 134  */
 135 #define SMB_CAP_RAW_MODE                0x0001
 136 #define SMB_CAP_MPX_MODE                0x0002
 137 #define SMB_CAP_UNICODE                 0x0004
 138 #define SMB_CAP_LARGE_FILES             0x0008  /* 64 bit offsets supported */
 139 #define SMB_CAP_NT_SMBS                 0x0010
 140 #define SMB_CAP_RPC_REMOTE_APIS         0x0020
 141 #define SMB_CAP_STATUS32                0x0040
 142 #define SMB_CAP_LEVEL_II_OPLOCKS        0x0080
 143 #define SMB_CAP_LOCK_AND_READ           0x0100
 144 #define SMB_CAP_NT_FIND                 0x0200
 145 #define SMB_CAP_DFS                     0x1000
 146 #define SMB_CAP_INFOLEVEL_PASSTHRU      0x2000
 147 #define SMB_CAP_LARGE_READX             0x4000
 148 #define SMB_CAP_LARGE_WRITEX            0x8000
 149 #define SMB_CAP_UNIX                    0x00800000
 150 #define SMB_CAP_BULK_TRANSFER           0x20000000
 151 #define SMB_CAP_COMPRESSED_DATA         0x40000000
 152 #define SMB_CAP_EXT_SECURITY            0x80000000
 153 
 154 /*
 155  * File attributes
 156  */
 157 #define SMB_FA_RDONLY           0x01
 158 #define SMB_FA_HIDDEN           0x02
 159 #define SMB_FA_SYSTEM           0x04
 160 #define SMB_FA_VOLUME           0x08
 161 #define SMB_FA_DIR              0x10
 162 #define SMB_FA_ARCHIVE          0x20
 163 
 164 /*
 165  * Extended file attributes
 166  */
 167 #define SMB_EFA_RDONLY                  0x00000001
 168 #define SMB_EFA_HIDDEN                  0x00000002
 169 #define SMB_EFA_SYSTEM                  0x00000004
 170 #define SMB_EFA_VOLUME                  0x00000008
 171 #define SMB_EFA_DIRECTORY               0x00000010
 172 #define SMB_EFA_ARCHIVE                 0x00000020
 173 #define SMB_EFA_DEVICE                  0x00000040
 174 #define SMB_EFA_NORMAL                  0x00000080
 175 #define SMB_EFA_TEMPORARY               0x00000100
 176 #define SMB_EFA_SPARSE                  0x00000200
 177 #define SMB_EFA_REPARSE_POINT           0x00000400
 178 #define SMB_EFA_COMPRESSED              0x00000800
 179 #define SMB_EFA_OFFLINE                 0x00001000
 180 #define SMB_EFA_NONINDEXED              0x00002000
 181 #define SMB_EFA_ENCRYPTED               0x00004000
 182 #define SMB_EFA_POSIX_SEMANTICS         0x01000000
 183 #define SMB_EFA_BACKUP_SEMANTICS        0x02000000
 184 #define SMB_EFA_DELETE_ON_CLOSE         0x04000000
 185 #define SMB_EFA_SEQUENTIAL_SCAN         0x08000000
 186 #define SMB_EFA_RANDOM_ACCESS           0x10000000
 187 #define SMB_EFA_NO_BUFFERING            0x20000000
 188 #define SMB_EFA_WRITE_THROUGH           0x80000000
 189 
 190 /*
 191  * Access Mode Encoding
 192  */
 193 #define SMB_AM_OPENREAD         0x0000
 194 #define SMB_AM_OPENWRITE        0x0001
 195 #define SMB_AM_OPENRW           0x0002
 196 #define SMB_AM_OPENEXEC         0x0003
 197 #define SMB_AM_OPENMODE         0x0003  /* mask for access mode bits */
 198 #define SMB_SM_COMPAT           0x0000
 199 #define SMB_SM_EXCLUSIVE        0x0010
 200 #define SMB_SM_DENYWRITE        0x0020
 201 #define SMB_SM_DENYREADEXEC     0x0030
 202 #define SMB_SM_DENYNONE         0x0040
 203 
 204 /* NT_CREATE_ANDX flags */
 205 #define NTCREATEX_FLAGS_REQUEST_OPLOCK          0x02
 206 #define NTCREATEX_FLAGS_REQUEST_BATCH_OPLOCK    0x04
 207 #define NTCREATEX_FLAGS_OPEN_DIRECTORY          0x08
 208 #define NTCREATEX_FLAGS_EXTENDED                0x10
 209 
 210 /* NT_CREATE_ANDX share_access (share mode) */
 211 #define NTCREATEX_SHARE_ACCESS_NONE             0
 212 #define NTCREATEX_SHARE_ACCESS_READ             1
 213 #define NTCREATEX_SHARE_ACCESS_WRITE            2
 214 #define NTCREATEX_SHARE_ACCESS_DELETE           4
 215 #define NTCREATEX_SHARE_ACCESS_ALL              7
 216 
 217 /* NT_CREATE_ANDX open_disposition */
 218 #define NTCREATEX_DISP_SUPERSEDE        0 /* if file exists supersede it */
 219 #define NTCREATEX_DISP_OPEN             1 /* exists ? open it : fail */
 220 #define NTCREATEX_DISP_CREATE           2 /* exists ? fail : create it */
 221 #define NTCREATEX_DISP_OPEN_IF          3 /* exists ? open it : create it */
 222 #define NTCREATEX_DISP_OVERWRITE        4 /* exists ? overwrite : fail */
 223 #define NTCREATEX_DISP_OVERWRITE_IF     5 /* exists ? overwrite : create */
 224 
 225 /* NT_CREATE_ANDX create_options */
 226 #define NTCREATEX_OPTIONS_DIRECTORY             0x0001
 227 #define NTCREATEX_OPTIONS_WRITE_THROUGH         0x0002
 228 #define NTCREATEX_OPTIONS_SEQUENTIAL_ONLY       0x0004
 229 #define NTCREATEX_OPTIONS_SYNC_ALERT            0x0010
 230 #define NTCREATEX_OPTIONS_ASYNC_ALERT           0x0020
 231 #define NTCREATEX_OPTIONS_NON_DIRECTORY_FILE    0x0040
 232 #define NTCREATEX_OPTIONS_NO_EA_KNOWLEDGE       0x0200
 233 #define NTCREATEX_OPTIONS_EIGHT_DOT_THREE_ONLY  0x0400
 234 #define NTCREATEX_OPTIONS_RANDOM_ACCESS         0x0800
 235 #define NTCREATEX_OPTIONS_DELETE_ON_CLOSE       0x1000
 236 #define NTCREATEX_OPTIONS_OPEN_BY_FILE_ID       0x2000
 237 
 238 /* NT_CREATE_ANDX "impersonation" */
 239 #define NTCREATEX_IMPERSONATION_ANONYMOUS               0
 240 #define NTCREATEX_IMPERSONATION_IDENTIFICATION          1
 241 #define NTCREATEX_IMPERSONATION_IMPERSONATION           2
 242 #define NTCREATEX_IMPERSONATION_DELEGATION              3
 243 
 244 /* NT_CREATE_ANDX security flags */
 245 #define NTCREATEX_SECURITY_DYNAMIC      1
 246 #define NTCREATEX_SECURITY_ALL          2
 247 
 248 /* NT_CREATE_ANDX create_action in reply */
 249 #define NTCREATEX_ACTION_EXISTED        1
 250 #define NTCREATEX_ACTION_CREATED        2
 251 #define NTCREATEX_ACTION_TRUNCATED      3
 252 
 253 /* SMB_TRANS2_FIND_FIRST2/SMB_TRANS2_FIND_NEXT2 flags */
 254 #define FIND2_CLOSE_AFTER_REQUEST       0x0001
 255 #define FIND2_CLOSE_ON_EOS              0x0002
 256 #define FIND2_RETURN_RESUME_KEYS        0x0004
 257 #define FIND2_CONTINUE_SEARCH           0x0008
 258 #define FIND2_BACKUP_INTENT             0x0010
 259 
 260 /*
 261  * SMB commands
 262  */
 263 #define SMB_COM_CREATE_DIRECTORY        0x00
 264 #define SMB_COM_DELETE_DIRECTORY        0x01
 265 #define SMB_COM_OPEN                    0x02
 266 #define SMB_COM_CREATE                  0x03
 267 #define SMB_COM_CLOSE                   0x04
 268 #define SMB_COM_FLUSH                   0x05
 269 #define SMB_COM_DELETE                  0x06
 270 #define SMB_COM_RENAME                  0x07
 271 #define SMB_COM_QUERY_INFORMATION       0x08
 272 #define SMB_COM_SET_INFORMATION         0x09
 273 #define SMB_COM_READ                    0x0A
 274 #define SMB_COM_WRITE                   0x0B
 275 #define SMB_COM_LOCK_BYTE_RANGE         0x0C
 276 #define SMB_COM_UNLOCK_BYTE_RANGE       0x0D
 277 #define SMB_COM_CREATE_TEMPORARY        0x0E
 278 #define SMB_COM_CREATE_NEW              0x0F
 279 #define SMB_COM_CHECK_DIRECTORY         0x10
 280 #define SMB_COM_PROCESS_EXIT            0x11
 281 #define SMB_COM_SEEK                    0x12
 282 #define SMB_COM_LOCK_AND_READ           0x13
 283 #define SMB_COM_WRITE_AND_UNLOCK        0x14
 284 #define SMB_COM_READ_RAW                0x1A
 285 #define SMB_COM_READ_MPX                0x1B
 286 #define SMB_COM_READ_MPX_SECONDARY      0x1C
 287 #define SMB_COM_WRITE_RAW               0x1D
 288 #define SMB_COM_WRITE_MPX               0x1E
 289 #define SMB_COM_WRITE_COMPLETE          0x20
 290 #define SMB_COM_SET_INFORMATION2        0x22
 291 #define SMB_COM_QUERY_INFORMATION2      0x23
 292 #define SMB_COM_LOCKING_ANDX            0x24
 293 #define SMB_COM_TRANSACTION             0x25
 294 #define SMB_COM_TRANSACTION_SECONDARY   0x26
 295 #define SMB_COM_IOCTL                   0x27
 296 #define SMB_COM_IOCTL_SECONDARY         0x28
 297 #define SMB_COM_COPY                    0x29
 298 #define SMB_COM_MOVE                    0x2A
 299 #define SMB_COM_ECHO                    0x2B
 300 #define SMB_COM_WRITE_AND_CLOSE         0x2C
 301 #define SMB_COM_OPEN_ANDX               0x2D
 302 #define SMB_COM_READ_ANDX               0x2E
 303 #define SMB_COM_WRITE_ANDX              0x2F
 304 #define SMB_COM_CLOSE_AND_TREE_DISC     0x31
 305 #define SMB_COM_TRANSACTION2            0x32
 306 #define SMB_COM_TRANSACTION2_SECONDARY  0x33
 307 #define SMB_COM_FIND_CLOSE2             0x34
 308 #define SMB_COM_FIND_NOTIFY_CLOSE       0x35
 309 #define SMB_COM_TREE_CONNECT            0x70
 310 #define SMB_COM_TREE_DISCONNECT         0x71
 311 #define SMB_COM_NEGOTIATE               0x72
 312 #define SMB_COM_SESSION_SETUP_ANDX      0x73
 313 #define SMB_COM_LOGOFF_ANDX             0x74
 314 #define SMB_COM_TREE_CONNECT_ANDX       0x75
 315 #define SMB_COM_QUERY_INFORMATION_DISK  0x80
 316 #define SMB_COM_SEARCH                  0x81
 317 #define SMB_COM_FIND                    0x82
 318 #define SMB_COM_FIND_UNIQUE             0x83
 319 #define SMB_COM_NT_TRANSACT             0xA0
 320 #define SMB_COM_NT_TRANSACT_SECONDARY   0xA1
 321 #define SMB_COM_NT_CREATE_ANDX          0xA2
 322 #define SMB_COM_NT_CANCEL               0xA4
 323 #define SMB_COM_OPEN_PRINT_FILE         0xC0
 324 #define SMB_COM_WRITE_PRINT_FILE        0xC1
 325 #define SMB_COM_CLOSE_PRINT_FILE        0xC2
 326 #define SMB_COM_GET_PRINT_QUEUE         0xC3
 327 #define SMB_COM_READ_BULK               0xD8
 328 #define SMB_COM_WRITE_BULK              0xD9
 329 #define SMB_COM_WRITE_BULK_DATA         0xDA
 330 
 331 /*
 332  * SMB_COM_TRANSACTION2 subcommands
 333  */
 334 #define SMB_TRANS2_OPEN2                        0x00
 335 #define SMB_TRANS2_FIND_FIRST2                  0x01
 336 #define SMB_TRANS2_FIND_NEXT2                   0x02
 337 #define SMB_TRANS2_QUERY_FS_INFORMATION         0x03
 338 #define SMB_TRANS2_SETFSINFO                    0x04
 339 #define SMB_TRANS2_QUERY_PATH_INFORMATION       0x05
 340 #define SMB_TRANS2_SET_PATH_INFORMATION         0x06
 341 #define SMB_TRANS2_QUERY_FILE_INFORMATION       0x07
 342 #define SMB_TRANS2_SET_FILE_INFORMATION         0x08
 343 #define SMB_TRANS2_FSCTL                        0x09
 344 #define SMB_TRANS2_IOCTL2                       0x0A
 345 #define SMB_TRANS2_FIND_NOTIFY_FIRST            0x0B
 346 #define SMB_TRANS2_FIND_NOTIFY_NEXT             0x0C
 347 #define SMB_TRANS2_CREATE_DIRECTORY             0x0D
 348 #define SMB_TRANS2_SESSION_SETUP                0x0E
 349 #define SMB_TRANS2_GET_DFS_REFERRAL             0x10
 350 #define SMB_TRANS2_REPORT_DFS_INCONSISTENCY     0x11
 351 
 352 /*
 353  * SMB_COM_NT_TRANSACT subcommands
 354  */
 355 #define NT_TRANSACT_CREATE              0x01
 356 #define NT_TRANSACT_IOCTL               0x02
 357 #define NT_TRANSACT_SET_SECURITY_DESC   0x03
 358 #define NT_TRANSACT_NOTIFY_CHANGE       0x04
 359 #define NT_TRANSACT_RENAME              0x05
 360 #define NT_TRANSACT_QUERY_SECURITY_DESC 0x06
 361 #define NT_TRANSACT_GET_USER_QUOTA      0x07
 362 #define NT_TRANSACT_SET_USER_QUOTA      0x08
 363 
 364 /*
 365  * SMB_TRANS2_QUERY_FS_INFORMATION levels
 366  */
 367 #define SMB_QFS_ALLOCATION                      1
 368 #define SMB_QFS_VOLUME                          2
 369 #define SMB_QFS_LABEL_INFO                      0x101
 370 #define SMB_QFS_VOLUME_INFO                     0x102
 371 #define SMB_QFS_SIZE_INFO                       0x103
 372 #define SMB_QFS_DEVICE_INFO                     0x104
 373 #define SMB_QFS_ATTRIBUTE_INFO                  0x105
 374 #define SMB_QFS_UNIX_INFO                       0x200
 375 #define SMB_QFS_MAC_FS_INFO                     0x301
 376 #define SMB_QFS_VOLUME_INFORMATION              1001
 377 #define SMB_QFS_SIZE_INFORMATION                1003
 378 #define SMB_QFS_DEVICE_INFORMATION              1004
 379 #define SMB_QFS_ATTRIBUTE_INFORMATION           1005
 380 #define SMB_QFS_QUOTA_INFORMATION               1006
 381 #define SMB_QFS_FULL_SIZE_INFORMATION           1007
 382 #define SMB_QFS_OBJECTID_INFORMATION            1008
 383 
 384 
 385 /*
 386  * SMB_QFS_ATTRIBUTE_INFO bits.
 387  * The following info found in msdn
 388  * (http://msdn.microsoft.com/library/default.asp?
 389  * url=/library/en-us/wmisdk/wmi/win32_cdromdrive.asp)
 390  * Naming is mostly as in samba, to help Those Who Google.
 391  */
 392 #define FILE_CASE_SENSITIVE_SEARCH      0x00000001
 393 #define FILE_CASE_PRESERVED_NAMES       0x00000002
 394 #define FILE_UNICODE_ON_DISK            0x00000004
 395 #define FILE_PERSISTENT_ACLS            0x00000008
 396 #define FILE_FILE_COMPRESSION           0x00000010
 397 #define FILE_VOLUME_QUOTAS              0x00000020
 398 #define FILE_SUPPORTS_SPARSE_FILES      0x00000040
 399 #define FILE_SUPPORTS_REPARSE_POINTS    0x00000080
 400 #define FILE_SUPPORTS_REMOTE_STORAGE    0x00000100
 401 #define FILE_SUPPORTS_LONG_NAMES        0x00004000
 402 #define FILE_VOLUME_IS_COMPRESSED       0x00008000
 403 #define FILE_SUPPORTS_OBJECT_IDS        0x00010000
 404 #define FILE_SUPPORTS_ENCRYPTION        0x00020000
 405 #define FILE_NAMED_STREAMS              0x00040000
 406 
 407 /*
 408  * SMB_TRANS2_QUERY_PATH levels
 409  */
 410 #define SMB_QFILEINFO_STANDARD                  1
 411 #define SMB_QFILEINFO_EA_SIZE                   2
 412 #define SMB_QFILEINFO_EAS_FROM_LIST             3
 413 #define SMB_QFILEINFO_ALL_EAS                   4
 414 #define SMB_QFILEINFO_IS_NAME_VALID             6       /* QPATHINFO only? */
 415 #define SMB_QFILEINFO_BASIC_INFO                0x101
 416 #define SMB_QFILEINFO_STANDARD_INFO             0x102
 417 #define SMB_QFILEINFO_EA_INFO                   0x103
 418 #define SMB_QFILEINFO_NAME_INFO                 0x104
 419 #define SMB_QFILEINFO_ALLOCATION_INFO           0x105
 420 #define SMB_QFILEINFO_END_OF_FILE_INFO          0x106
 421 #define SMB_QFILEINFO_ALL_INFO                  0x107
 422 #define SMB_QFILEINFO_ALT_NAME_INFO             0x108
 423 #define SMB_QFILEINFO_STREAM_INFO               0x109
 424 #define SMB_QFILEINFO_COMPRESSION_INFO          0x10b
 425 #define SMB_QFILEINFO_UNIX_BASIC                0x200
 426 #define SMB_QFILEINFO_UNIX_LINK                 0x201
 427 #define SMB_QFILEINFO_MAC_DT_GET_APPL           0x306
 428 #define SMB_QFILEINFO_MAC_DT_GET_ICON           0x307
 429 #define SMB_QFILEINFO_MAC_DT_GET_ICON_INFO      0x308
 430 #define SMB_QFILEINFO_BASIC_INFORMATION         1004
 431 #define SMB_QFILEINFO_STANDARD_INFORMATION      1005
 432 #define SMB_QFILEINFO_INTERNAL_INFORMATION      1006
 433 #define SMB_QFILEINFO_EA_INFORMATION            1007
 434 #define SMB_QFILEINFO_ACCESS_INFORMATION        1008
 435 #define SMB_QFILEINFO_NAME_INFORMATION          1009
 436 #define SMB_QFILEINFO_POSITION_INFORMATION      1014
 437 #define SMB_QFILEINFO_MODE_INFORMATION          1016
 438 #define SMB_QFILEINFO_ALIGNMENT_INFORMATION     1017
 439 #define SMB_QFILEINFO_ALL_INFORMATION           1018
 440 #define SMB_QFILEINFO_ALT_NAME_INFORMATION      1021
 441 #define SMB_QFILEINFO_STREAM_INFORMATION        1022
 442 #define SMB_QFILEINFO_COMPRESSION_INFORMATION   1028
 443 #define SMB_QFILEINFO_NETWORK_OPEN_INFORMATION  1034
 444 #define SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION 1035
 445 
 446 /*
 447  * SMB_TRANS2_FIND_FIRST2 information levels
 448  */
 449 #define SMB_FIND_STANDARD               1
 450 #define SMB_FIND_EA_SIZE                2
 451 #define SMB_FIND_EAS_FROM_LIST          3
 452 #define SMB_FIND_DIRECTORY_INFO         0x101
 453 #define SMB_FIND_FULL_DIRECTORY_INFO    0x102
 454 #define SMB_FIND_NAME_INFO              0x103
 455 #define SMB_FIND_BOTH_DIRECTORY_INFO    0x104
 456 #define SMB_FIND_UNIX_INFO              0x200
 457 
 458 /*
 459  * Selectors for NT_TRANSACT_QUERY_SECURITY_DESC and
 460  * NT_TRANSACT_SET_SECURITY_DESC.  Details found in the MSDN
 461  * library by searching on security_information.
 462  * Note the protected/unprotected bits did not exist in NT.
 463  */
 464 
 465 #define OWNER_SECURITY_INFORMATION              0x00000001
 466 #define GROUP_SECURITY_INFORMATION              0x00000002
 467 #define DACL_SECURITY_INFORMATION               0x00000004
 468 #define SACL_SECURITY_INFORMATION               0x00000008
 469 #define UNPROTECTED_SACL_SECURITY_INFORMATION   0x10000000
 470 #define UNPROTECTED_DACL_SECURITY_INFORMATION   0x20000000
 471 #define PROTECTED_SACL_SECURITY_INFORMATION     0x40000000
 472 #define PROTECTED_DACL_SECURITY_INFORMATION     0x80000000
 473 
 474 /*
 475  * security descriptor header
 476  * it is followed by the optional SIDs and ACLs
 477  * note this is "raw", ie little-endian
 478  */
 479 struct ntsecdesc {
 480         uint8_t         sd_revision;    /* 0x01 observed between W2K */
 481         uint8_t         sd_pad1;
 482         uint16_t        sd_flags;
 483         uint32_t        sd_owneroff;    /* offset to owner SID */
 484         uint32_t        sd_groupoff;    /* offset to group SID */
 485         uint32_t        sd_sacloff;     /* offset to system/audit ACL */
 486         uint32_t        sd_dacloff;     /* offset to discretionary ACL */
 487 }; /* XXX: __attribute__((__packed__)); */
 488 typedef struct ntsecdesc ntsecdesc_t;
 489 
 490 #define wset_sdrevision(s) ((s)->sd_revision = 0x01)
 491 #define sdflags(s) (letohs((s)->sd_flags))
 492 #define wset_sdflags(s, f) ((s)->sd_flags = letohs(f))
 493 #define sdowner(s) \
 494         ((struct ntsid *)((s)->sd_owneroff ? \
 495         (char *)(s) + letohl((s)->sd_owneroff) : \
 496         NULL))
 497 #define wset_sdowneroff(s, o) ((s)->sd_owneroff = htolel(o))
 498 #define sdgroup(s) \
 499         ((struct ntsid *)((s)->sd_groupoff ? \
 500         (char *)(s) + letohl((s)->sd_groupoff) : \
 501         NULL))
 502 #define wset_sdgroupoff(s, o) ((s)->sd_groupoff = htolel(o))
 503 #define sdsacl(s) \
 504         ((struct ntacl *)((s)->sd_sacloff ? \
 505         (char *)(s) + letohl((s)->sd_sacloff) : \
 506         NULL))
 507 #define wset_sdsacloff(s, o) ((s)->sd_sacloff = htolel(o))
 508 #define sddacl(s) \
 509         ((struct ntacl *)((s)->sd_dacloff ? \
 510         (char *)(s) + letohl((s)->sd_dacloff) : \
 511         NULL))
 512 #define wset_sddacloff(s, o) ((s)->sd_dacloff = htolel(o))
 513 
 514 /*
 515  * sd_flags bits
 516  */
 517 #define SD_OWNER_DEFAULTED              0x0001
 518 #define SD_GROUP_DEFAULTED              0x0002
 519 #define SD_DACL_PRESENT                 0x0004
 520 #define SD_DACL_DEFAULTED               0x0008
 521 #define SD_SACL_PRESENT                 0x0010
 522 #define SD_SACL_DEFAULTED               0x0020
 523 #define SD_DACL_TRUSTED                 0x0040
 524 #define SD_SERVER_SECURITY              0x0080
 525 #define SD_DACL_AUTO_INHERIT_REQ        0x0100
 526 #define SD_SACL_AUTO_INHERIT_REQ        0x0200
 527 #define SD_DACL_AUTO_INHERITED          0x0400
 528 #define SD_SACL_AUTO_INHERITED          0x0800
 529 #define SD_DACL_PROTECTED               0x1000
 530 #define SD_SACL_PROTECTED               0x2000
 531 #define SD_RM_CONTROL_VALID             0x4000
 532 #define SD_SELF_RELATIVE                0x8000
 533 
 534 /*
 535  * access control list header
 536  * it is followed by the ACEs
 537  * note this is "raw", ie little-endian
 538  */
 539 struct ntacl {
 540         uint8_t acl_revision;   /* 0x02 observed with W2K */
 541         uint8_t acl_pad1;
 542         uint16_t        acl_len; /* bytes; includes this header */
 543         uint16_t        acl_acecount;
 544         uint16_t        acl_pad2;
 545 }; /* XXX: __attribute__((__packed__)); */
 546 typedef struct ntacl ntacl_t;
 547 
 548 #define wset_aclrevision(a) ((a)->acl_revision = 0x02)
 549 #define acllen(a) (letohs((a)->acl_len))
 550 #define wset_acllen(a, l) ((a)->acl_len = htoles(l))
 551 #define aclacecount(a) (letohs((a)->acl_acecount))
 552 #define wset_aclacecount(a, c) ((a)->acl_acecount = htoles(c))
 553 #define aclace(a) ((struct ntace *)((char *)(a) + sizeof (struct ntacl)))
 554 
 555 /*
 556  * access control entry header
 557  * it is followed by type-specific ace data,
 558  * which for the simple types is just a SID
 559  * note this is "raw", ie little-endian
 560  */
 561 struct ntace {
 562         uint8_t ace_type;
 563         uint8_t ace_flags;
 564         uint16_t        ace_len; /* bytes; includes this header */
 565         uint32_t        ace_rights; /* generic, standard, specific, etc */
 566 }; /* XXX: __attribute__((__packed__)); */
 567 
 568 #define acetype(a) ((a)->ace_type)
 569 #define wset_acetype(a, t) ((a)->ace_type = (t))
 570 #define aceflags(a) ((a)->ace_flags)
 571 #define wset_aceflags(a, f) ((a)->ace_flags = (f))
 572 #define acelen(a) (letohs((a)->ace_len))
 573 #define wset_acelen(a, l) ((a)->ace_len = htoles(l))
 574 #define acerights(a) (letohl((a)->ace_rights))
 575 #define wset_acerights(a, r) ((a)->ace_rights = htolel(r))
 576 #define aceace(a) ((struct ntace *)((char *)(a) + acelen(a)))
 577 #define acesid(a) ((struct ntsid *)((char *)(a) + sizeof (struct ntace)))
 578 
 579 /*
 580  * ace_rights
 581  * (Samba bit names are used here, with permission, as the shorter Windows
 582  * names are more likely to cause namespace collisions)
 583  */
 584 #define SA_RIGHT_FILE_READ_DATA         0x00000001
 585 #define SA_RIGHT_FILE_WRITE_DATA        0x00000002
 586 #define SA_RIGHT_FILE_APPEND_DATA       0x00000004
 587 #define SA_RIGHT_FILE_READ_EA           0x00000008
 588 #define SA_RIGHT_FILE_WRITE_EA          0x00000010
 589 #define SA_RIGHT_FILE_EXECUTE           0x00000020
 590 #define SA_RIGHT_FILE_DELETE_CHILD      0x00000040
 591 #define SA_RIGHT_FILE_READ_ATTRIBUTES   0x00000080
 592 #define SA_RIGHT_FILE_WRITE_ATTRIBUTES  0x00000100
 593 #define SA_RIGHT_FILE_ALL_ACCESS        0x000001FF
 594 
 595 #define STD_RIGHT_DELETE_ACCESS         0x00010000
 596 #define STD_RIGHT_READ_CONTROL_ACCESS   0x00020000
 597 #define STD_RIGHT_WRITE_DAC_ACCESS      0x00040000
 598 #define STD_RIGHT_WRITE_OWNER_ACCESS    0x00080000
 599 #define STD_RIGHT_SYNCHRONIZE_ACCESS    0x00100000
 600 #define STD_RIGHT_ALL_ACCESS            0x001F0000
 601 
 602 #define SEC_RIGHT_SYSTEM_SECURITY       0x01000000
 603 /*
 604  * Don't use MAXIMUM_ALLOWED as Samba (2.2.3 at least) will
 605  * return NT_STATUS_INVALID_LOCK_SEQUENCE
 606  */
 607 #define SEC_RIGHT_MAXIMUM_ALLOWED       0x02000000
 608 
 609 #define GENERIC_RIGHT_ALL_ACCESS        0x10000000
 610 #define GENERIC_RIGHT_EXECUTE_ACCESS    0x20000000
 611 #define GENERIC_RIGHT_WRITE_ACCESS      0x40000000
 612 #define GENERIC_RIGHT_READ_ACCESS       0x80000000
 613 
 614 /*
 615  * these mappings are from Windows sample code but are likely incomplete
 616  *
 617  * GENERIC_RIGHT_READ_ACCESS :
 618  *      STD_RIGHT_SYNCHRONIZE_ACCESS |
 619  *      STD_RIGHT_READ_CONTROL_ACCESS |
 620  *      SA_RIGHT_FILE_READ_ATTRIBUTES |
 621  *      SA_RIGHT_FILE_READ_EA |
 622  *      SA_RIGHT_FILE_READ_DATA
 623  * GENERIC_RIGHT_WRITE_ACCESS :
 624  *      STD_RIGHT_SYNCHRONIZE_ACCESS |
 625  *      STD_RIGHT_READ_CONTROL_ACCESS |
 626  *      SA_RIGHT_FILE_WRITE_ATTRIBUTES |
 627  *      SA_RIGHT_FILE_WRITE_EA |
 628  *      SA_RIGHT_FILE_APPEND_DATA |
 629  *      SA_RIGHT_FILE_WRITE_DATA
 630  * GENERIC_RIGHT_EXECUTE_ACCESS :
 631  *      STD_RIGHT_SYNCHRONIZE_ACCESS |
 632  *      STD_RIGHT_READ_CONTROL_ACCESS |
 633  *      SA_RIGHT_FILE_READ_ATTRIBUTES |
 634  *      SA_RIGHT_FILE_EXECUTE
 635  * GENERIC_RIGHT_ALL_ACCESS :
 636  *      STD_RIGHT_SYNCHRONIZE_ACCESS |
 637  *      STD_RIGHT_WRITE_OWNER_ACCESS |
 638  *      STD_RIGHT_WRITE_DAC_ACCESS |
 639  *      STD_RIGHT_READ_CONTROL_ACCESS |
 640  *      STD_RIGHT_DELETE_ACCESS |
 641  *      SA_RIGHT_FILE_ALL_ACCESS
 642  */
 643 
 644 /*
 645  * security identifier header
 646  * it is followed by sid_numauth sub-authorities,
 647  * which are 32 bits each.
 648  * note the subauths are little-endian on the wire, but
 649  * need to be big-endian for memberd/DS
 650  */
 651 #define SIDAUTHSIZE 6
 652 struct ntsid {
 653         uint8_t sid_revision;
 654         uint8_t sid_subauthcount;
 655         uint8_t sid_authority[SIDAUTHSIZE]; /* ie not little endian */
 656 }; /* XXX: __attribute__((__packed__)); */
 657 typedef struct ntsid ntsid_t;
 658 
 659 #define sidsubauthcount(s) (s->sid_subauthcount)
 660 #define sidlen(s) (sizeof (struct ntsid) + 4 * (s)->sid_subauthcount)
 661 #define MAXSIDLEN (sizeof (struct ntsid) + 4 * KAUTH_NTSID_MAX_AUTHORITIES)
 662 #define sidsub(s) ((uint32_t *)((char *)(s) + sizeof (struct ntsid)))
 663 
 664 /*
 665  * MS' defined values for ace_type
 666  */
 667 #define ACCESS_ALLOWED_ACE_TYPE                 0x0
 668 #define ACCESS_DENIED_ACE_TYPE                  0x1
 669 #define SYSTEM_AUDIT_ACE_TYPE                   0x2
 670 #define SYSTEM_ALARM_ACE_TYPE                   0x3
 671 #define ACCESS_ALLOWED_COMPOUND_ACE_TYPE        0x4
 672 #define ACCESS_ALLOWED_OBJECT_ACE_TYPE          0x5
 673 #define ACCESS_DENIED_OBJECT_ACE_TYPE           0x6
 674 #define SYSTEM_AUDIT_OBJECT_ACE_TYPE            0x7
 675 #define SYSTEM_ALARM_OBJECT_ACE_TYPE            0x8
 676 #define ACCESS_ALLOWED_CALLBACK_ACE_TYPE        0x9
 677 #define ACCESS_DENIED_CALLBACK_ACE_TYPE         0xA
 678 #define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE 0xB
 679 #define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE  0xC
 680 #define SYSTEM_AUDIT_CALLBACK_ACE_TYPE          0xD
 681 #define SYSTEM_ALARM_CALLBACK_ACE_TYPE          0xE
 682 #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE   0xF
 683 #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE   0x10
 684 
 685 /*
 686  * MS' defined values for ace_flags
 687  */
 688 #define OBJECT_INHERIT_ACE_FLAG                 0x01
 689 #define CONTAINER_INHERIT_ACE_FLAG              0x02
 690 #define NO_PROPAGATE_INHERIT_ACE_FLAG           0x04
 691 #define INHERIT_ONLY_ACE_FLAG                   0x08
 692 #define INHERITED_ACE_FLAG                      0x10
 693 #define UNDEF_ACE_FLAG                          0x20 /* MS doesn't define it */
 694 #define VALID_INHERIT_ACE_FLAGS                 0x1F
 695 #define SUCCESSFUL_ACCESS_ACE_FLAG              0x40
 696 #define FAILED_ACCESS_ACE_FLAG                  0x80
 697 
 698 /*
 699  * Set PATH/FILE information levels
 700  */
 701 #define SMB_SFILEINFO_STANDARD                  1
 702 #define SMB_SFILEINFO_EA_SET                    2
 703 #define SMB_SFILEINFO_BASIC_INFO                0x101
 704 #define SMB_SFILEINFO_DISPOSITION_INFO          0x102
 705 #define SMB_SFILEINFO_ALLOCATION_INFO           0x103
 706 #define SMB_SFILEINFO_END_OF_FILE_INFO          0x104
 707 #define SMB_SFILEINFO_UNIX_BASIC                0x200
 708 #define SMB_SFILEINFO_UNIX_LINK                 0x201
 709 #define SMB_SFILEINFO_UNIX_HLINK                0x203
 710 #define SMB_SFILEINFO_DIRECTORY_INFORMATION     1001
 711 #define SMB_SFILEINFO_FULL_DIRECTORY_INFORMATION        1002
 712 #define SMB_SFILEINFO_BOTH_DIRECTORY_INFORMATION        1003
 713 #define SMB_SFILEINFO_BASIC_INFORMATION         1004
 714 #define SMB_SFILEINFO_STANDARD_INFORMATION      1005
 715 #define SMB_SFILEINFO_INTERNAL_INFORMATION      1006
 716 #define SMB_SFILEINFO_EA_INFORMATION            1007
 717 #define SMB_SFILEINFO_ACCESS_INFORMATION        1008
 718 #define SMB_SFILEINFO_NAME_INFORMATION          1009
 719 #define SMB_SFILEINFO_RENAME_INFORMATION        1010
 720 #define SMB_SFILEINFO_LINK_INFORMATION          1011
 721 #define SMB_SFILEINFO_NAMES_INFORMATION         1012
 722 #define SMB_SFILEINFO_DISPOSITION_INFORMATION   1013
 723 #define SMB_SFILEINFO_POSITION_INFORMATION      1014
 724 #define SMB_SFILEINFO_1015                      1015 /* ? */
 725 #define SMB_SFILEINFO_MODE_INFORMATION          1016
 726 #define SMB_SFILEINFO_ALIGNMENT_INFORMATION     1017
 727 #define SMB_SFILEINFO_ALL_INFORMATION           1018
 728 #define SMB_SFILEINFO_ALLOCATION_INFORMATION    1019
 729 #define SMB_SFILEINFO_END_OF_FILE_INFORMATION   1020
 730 #define SMB_SFILEINFO_ALT_NAME_INFORMATION      1021
 731 #define SMB_SFILEINFO_STREAM_INFORMATION        1022
 732 #define SMB_SFILEINFO_PIPE_INFORMATION          1023
 733 #define SMB_SFILEINFO_PIPE_LOCAL_INFORMATION    1024
 734 #define SMB_SFILEINFO_PIPE_REMOTE_INFORMATION   1025
 735 #define SMB_SFILEINFO_MAILSLOT_QUERY_INFORMATION        1026
 736 #define SMB_SFILEINFO_MAILSLOT_SET_INFORMATION          1027
 737 #define SMB_SFILEINFO_COMPRESSION_INFORMATION           1028
 738 #define SMB_SFILEINFO_OBJECT_ID_INFORMATION             1029
 739 #define SMB_SFILEINFO_COMPLETION_INFORMATION            1030
 740 #define SMB_SFILEINFO_MOVE_CLUSTER_INFORMATION          1031
 741 #define SMB_SFILEINFO_QUOTA_INFORMATION         1032
 742 #define SMB_SFILEINFO_REPARSE_POINT_INFORMATION 1033
 743 #define SMB_SFILEINFO_NETWORK_OPEN_INFORMATION  1034
 744 #define SMB_SFILEINFO_ATTRIBUTE_TAG_INFORMATION 1035
 745 #define SMB_SFILEINFO_TRACKING_INFORMATION      1036
 746 #define SMB_SFILEINFO_MAXIMUM_INFORMATION       1037
 747 
 748 /*
 749  * LOCKING_ANDX LockType flags
 750  */
 751 #define SMB_LOCKING_ANDX_SHARED_LOCK    0x01
 752 #define SMB_LOCKING_ANDX_OPLOCK_RELEASE 0x02
 753 #define SMB_LOCKING_ANDX_CHANGE_LOCKTYPE 0x04
 754 #define SMB_LOCKING_ANDX_CANCEL_LOCK    0x08
 755 #define SMB_LOCKING_ANDX_LARGE_FILES    0x10
 756 
 757 
 758 /*
 759  * size of the GUID returned in an extended security negotiate response
 760  */
 761 #define SMB_GUIDLEN     16
 762 
 763 typedef uint16_t        smbfh;
 764 
 765 /*
 766  * NTLMv2 blob header structure.
 767  */
 768 struct ntlmv2_blobhdr {
 769         uint32_t        header;
 770         uint32_t        reserved;
 771         uint64_t        timestamp;
 772         uint64_t        client_nonce;
 773         uint32_t        unknown1;
 774 };
 775 typedef struct ntlmv2_blobhdr ntlmv2_blobhdr_t;
 776 
 777 /*
 778  * NTLMv2 name header structure, for names in a blob.
 779  */
 780 struct ntlmv2_namehdr {
 781         uint16_t        type;
 782         uint16_t        len;
 783 };
 784 typedef struct ntlmv2_namehdr ntlmv2_namehdr_t;
 785 
 786 #define NAMETYPE_EOL            0x0000  /* end of list of names */
 787 #define NAMETYPE_MACHINE_NB     0x0001  /* NetBIOS machine name */
 788 #define NAMETYPE_DOMAIN_NB      0x0002  /* NetBIOS domain name */
 789 #define NAMETYPE_MACHINE_DNS    0x0003  /* DNS machine name */
 790 #define NAMETYPE_DOMAIN_DNS     0x0004  /* DNS Active Directory domain name */
 791 
 792 /*
 793  * Named pipe commands.
 794  */
 795 #define TRANS_CALL_NAMED_PIPE           0x54    /* open/write/read/close pipe */
 796 #define TRANS_WAIT_NAMED_PIPE           0x53    /* wait for pipe to be !busy */
 797 #define TRANS_PEEK_NAMED_PIPE           0x23    /* read but don't remove data */
 798 #define TRANS_Q_NAMED_PIPE_HAND_STATE   0x21    /* query pipe handle modes */
 799 #define TRANS_SET_NAMED_PIPE_HAND_STATE 0x01    /* set pipe handle modes */
 800 #define TRANS_Q_NAMED_PIPE_INFO         0x22    /* query pipe attributes */
 801 #define TRANS_TRANSACT_NAMED_PIPE       0x26    /* r/w operation on pipe */
 802 #define TRANS_READ_NAMED_PIPE           0x11    /* read pipe in "raw" mode */
 803                                                 /* (non message mode) */
 804 #define TRANS_WRITE_NAMED_PIPE          0x31    /* write pipe "raw" mode */
 805                                                 /* (non message mode) */
 806 
 807 /*
 808  * Share types, visible via NetShareEnum
 809  */
 810 #define STYPE_DISKTREE                  0x00000000
 811 #define STYPE_PRINTQ                    0x00000001
 812 #define STYPE_DEVICE                    0x00000002
 813 #define STYPE_IPC                       0x00000003
 814 #define STYPE_UNKNOWN                   0x00000004
 815 #define STYPE_MASK                      0x0000000F
 816 #define STYPE_TEMPORARY                 0x40000000
 817 #define STYPE_HIDDEN                    0x80000000
 818 
 819 #endif /* _NETSMB_SMB_H_ */