1*da6c28aaSamw /* 2*da6c28aaSamw * CDDL HEADER START 3*da6c28aaSamw * 4*da6c28aaSamw * The contents of this file are subject to the terms of the 5*da6c28aaSamw * Common Development and Distribution License (the "License"). 6*da6c28aaSamw * You may not use this file except in compliance with the License. 7*da6c28aaSamw * 8*da6c28aaSamw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*da6c28aaSamw * or http://www.opensolaris.org/os/licensing. 10*da6c28aaSamw * See the License for the specific language governing permissions 11*da6c28aaSamw * and limitations under the License. 12*da6c28aaSamw * 13*da6c28aaSamw * When distributing Covered Code, include this CDDL HEADER in each 14*da6c28aaSamw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*da6c28aaSamw * If applicable, add the following below this CDDL HEADER, with the 16*da6c28aaSamw * fields enclosed by brackets "[]" replaced with your own identifying 17*da6c28aaSamw * information: Portions Copyright [yyyy] [name of copyright owner] 18*da6c28aaSamw * 19*da6c28aaSamw * CDDL HEADER END 20*da6c28aaSamw */ 21*da6c28aaSamw /* 22*da6c28aaSamw * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23*da6c28aaSamw * Use is subject to license terms. 24*da6c28aaSamw */ 25*da6c28aaSamw 26*da6c28aaSamw #ifndef _SMBSRV_SMB_H 27*da6c28aaSamw #define _SMBSRV_SMB_H 28*da6c28aaSamw 29*da6c28aaSamw /* 30*da6c28aaSamw * SMB definitions and interfaces, mostly defined in the CIFS spec. 31*da6c28aaSamw */ 32*da6c28aaSamw 33*da6c28aaSamw #pragma ident "%Z%%M% %I% %E% SMI" 34*da6c28aaSamw 35*da6c28aaSamw /* 36*da6c28aaSamw * SMB definitions and interfaces, mostly defined in the CIFS spec. 37*da6c28aaSamw */ 38*da6c28aaSamw 39*da6c28aaSamw #ifdef _KERNEL 40*da6c28aaSamw #include <sys/types.h> 41*da6c28aaSamw #endif 42*da6c28aaSamw #include <smbsrv/smb_i18n.h> 43*da6c28aaSamw #include <smbsrv/msgbuf.h> 44*da6c28aaSamw 45*da6c28aaSamw 46*da6c28aaSamw #ifdef __cplusplus 47*da6c28aaSamw extern "C" { 48*da6c28aaSamw #endif 49*da6c28aaSamw 50*da6c28aaSamw 51*da6c28aaSamw /* 52*da6c28aaSamw * Typedefs from CIFS section 3.2 53*da6c28aaSamw */ 54*da6c28aaSamw typedef unsigned char UCHAR; 55*da6c28aaSamw typedef unsigned short USHORT; 56*da6c28aaSamw typedef uint32_t ULONG; 57*da6c28aaSamw typedef int32_t LONG; 58*da6c28aaSamw 59*da6c28aaSamw 60*da6c28aaSamw /* 61*da6c28aaSamw * The msgbuf format and length of an SMB header. 62*da6c28aaSamw */ 63*da6c28aaSamw #define SMB_HEADER_DOS_FMT "Mbbbwbww10.wwww" 64*da6c28aaSamw #define SMB_HEADER_NT_FMT "Mblbww#c2.wwww" 65*da6c28aaSamw #define SMB_HEADER_LEN 32 66*da6c28aaSamw #define SMB_SIG_SIZE 8 /* SMB signature size */ 67*da6c28aaSamw 68*da6c28aaSamw /* 69*da6c28aaSamw * CIFS definition for the SMB header (CIFS Section 3.2). Note that the 70*da6c28aaSamw * pid_high field is not documented in the 1997 CIFS specificaction. This 71*da6c28aaSamw * is a decoded or memory-based definition, which may be padded to align 72*da6c28aaSamw * its elements on word boundaries. See smb_hdrbuf_t for the network 73*da6c28aaSamw * ready structure. 74*da6c28aaSamw */ 75*da6c28aaSamw typedef struct smb_hdr { 76*da6c28aaSamw UCHAR protocol[4]; 77*da6c28aaSamw UCHAR command; 78*da6c28aaSamw 79*da6c28aaSamw union { 80*da6c28aaSamw struct { 81*da6c28aaSamw UCHAR error_class; 82*da6c28aaSamw UCHAR reserved; 83*da6c28aaSamw USHORT error; 84*da6c28aaSamw } dos_error; 85*da6c28aaSamw ULONG ntstatus; 86*da6c28aaSamw }status; 87*da6c28aaSamw 88*da6c28aaSamw UCHAR flags; 89*da6c28aaSamw USHORT flags2; 90*da6c28aaSamw USHORT pid_high; 91*da6c28aaSamw 92*da6c28aaSamw union { 93*da6c28aaSamw USHORT pad[5]; 94*da6c28aaSamw struct { 95*da6c28aaSamw USHORT reserved; 96*da6c28aaSamw UCHAR security_sig[SMB_SIG_SIZE]; 97*da6c28aaSamw } extra; 98*da6c28aaSamw } extra; 99*da6c28aaSamw 100*da6c28aaSamw USHORT tid; 101*da6c28aaSamw USHORT pid; 102*da6c28aaSamw USHORT uid; 103*da6c28aaSamw USHORT mid; 104*da6c28aaSamw } smb_hdr_t; 105*da6c28aaSamw 106*da6c28aaSamw 107*da6c28aaSamw /* 108*da6c28aaSamw * Encoded or packed SMB header in network ready format. 109*da6c28aaSamw */ 110*da6c28aaSamw typedef struct smb_hdrbuf { 111*da6c28aaSamw unsigned char hdr[SMB_HEADER_LEN]; 112*da6c28aaSamw } smb_hdrbuf_t; 113*da6c28aaSamw 114*da6c28aaSamw typedef struct smb_nethdr { 115*da6c28aaSamw uint8_t sh_protocol[4]; 116*da6c28aaSamw uint8_t sh_command; 117*da6c28aaSamw 118*da6c28aaSamw union { 119*da6c28aaSamw struct { 120*da6c28aaSamw uint8_t sh_error_class; 121*da6c28aaSamw uint8_t sh_reserved; 122*da6c28aaSamw uint8_t sh_error[2]; 123*da6c28aaSamw } dos_error; 124*da6c28aaSamw uint8_t sh_ntstatus[4]; 125*da6c28aaSamw } status; 126*da6c28aaSamw 127*da6c28aaSamw uint8_t sh_flags; 128*da6c28aaSamw uint8_t sh_flags2[2]; 129*da6c28aaSamw uint8_t sh_pid_high[2]; 130*da6c28aaSamw 131*da6c28aaSamw union { 132*da6c28aaSamw uint8_t sh_pad[10]; 133*da6c28aaSamw struct { 134*da6c28aaSamw uint8_t sh_reserved[2]; 135*da6c28aaSamw uint8_t sh_security_sig[SMB_SIG_SIZE]; 136*da6c28aaSamw } extra; 137*da6c28aaSamw } extra; 138*da6c28aaSamw 139*da6c28aaSamw uint8_t sh_tid[2]; 140*da6c28aaSamw uint8_t sh_pid[2]; 141*da6c28aaSamw uint8_t sh_uid[2]; 142*da6c28aaSamw uint8_t sh_mid[2]; 143*da6c28aaSamw } smb_nethdr_t; 144*da6c28aaSamw 145*da6c28aaSamw /* 146*da6c28aaSamw * Protocol magic value as a 32-bit. This will be 0xff 0x53 0x4d 0x42 on 147*da6c28aaSamw * the wire. 148*da6c28aaSamw */ 149*da6c28aaSamw 150*da6c28aaSamw #define SMB_PROTOCOL_MAGIC 0x424d53ff 151*da6c28aaSamw 152*da6c28aaSamw /* 153*da6c28aaSamw * Time and date encoding (CIFS Section 3.6). The date is encoded such 154*da6c28aaSamw * that the year has a range of 0-119, which represents 1980-2099. The 155*da6c28aaSamw * month range is 1-12, and the day range is 1-31. 156*da6c28aaSamw */ 157*da6c28aaSamw typedef struct smb_date { 158*da6c28aaSamw USHORT day : 5; 159*da6c28aaSamw USHORT month : 4; 160*da6c28aaSamw USHORT year : 7; 161*da6c28aaSamw } smb_date_t; 162*da6c28aaSamw 163*da6c28aaSamw 164*da6c28aaSamw /* 165*da6c28aaSamw * The hours range is 0-23, the minutes range is 0-59 and the two_sec 166*da6c28aaSamw * range is 0-29. 167*da6c28aaSamw */ 168*da6c28aaSamw typedef struct smb_time { 169*da6c28aaSamw USHORT two_sec : 5; 170*da6c28aaSamw USHORT minutes : 6; 171*da6c28aaSamw USHORT hours : 5; 172*da6c28aaSamw } smb_time_t; 173*da6c28aaSamw 174*da6c28aaSamw 175*da6c28aaSamw /* 176*da6c28aaSamw * This is a 64-bit signed absolute time representing 100ns increments. 177*da6c28aaSamw * A positive value represents the absolute time since 1601AD. A 178*da6c28aaSamw * negative value represents a context specific relative time. 179*da6c28aaSamw */ 180*da6c28aaSamw typedef struct smb_time2 { 181*da6c28aaSamw ULONG low_time; 182*da6c28aaSamw LONG high_time; 183*da6c28aaSamw } smb_time2_t; 184*da6c28aaSamw 185*da6c28aaSamw 186*da6c28aaSamw /* 187*da6c28aaSamw * The number of seconds since Jan 1, 1970, 00:00:00.0. 188*da6c28aaSamw */ 189*da6c28aaSamw typedef uint32_t smb_utime_t; 190*da6c28aaSamw 191*da6c28aaSamw 192*da6c28aaSamw #define SMB_LM_NEGOTIATE_WORDCNT 13 193*da6c28aaSamw #define SMB_NT_NEGOTIATE_WORDCNT 17 194*da6c28aaSamw 195*da6c28aaSamw 196*da6c28aaSamw typedef struct smb_nt_negotiate_rsp { 197*da6c28aaSamw UCHAR word_count; 198*da6c28aaSamw USHORT dialect_index; 199*da6c28aaSamw UCHAR security_mode; 200*da6c28aaSamw USHORT max_mpx; 201*da6c28aaSamw USHORT max_vc; 202*da6c28aaSamw ULONG max_buffer_size; 203*da6c28aaSamw ULONG max_raw_size; 204*da6c28aaSamw ULONG session_key; 205*da6c28aaSamw ULONG capabilities; 206*da6c28aaSamw ULONG time_low; 207*da6c28aaSamw ULONG time_high; 208*da6c28aaSamw USHORT server_tz; 209*da6c28aaSamw UCHAR security_len; 210*da6c28aaSamw USHORT byte_count; 211*da6c28aaSamw UCHAR *guid; 212*da6c28aaSamw UCHAR *challenge; 213*da6c28aaSamw UCHAR *oem_domain; 214*da6c28aaSamw } smb_nt_negotiate_rsp_t; 215*da6c28aaSamw 216*da6c28aaSamw /* 217*da6c28aaSamw * SMB_COM_TRANSACTION 218*da6c28aaSamw */ 219*da6c28aaSamw typedef struct smb_transact_rsp { 220*da6c28aaSamw UCHAR WordCount; /* Count of data bytes */ 221*da6c28aaSamw /* value = 10 + SetupCount */ 222*da6c28aaSamw USHORT TotalParamCount; /* Total parameter bytes being sent */ 223*da6c28aaSamw USHORT TotalDataCount; /* Total data bytes being sent */ 224*da6c28aaSamw USHORT Reserved; 225*da6c28aaSamw USHORT ParamCount; /* Parameter bytes sent this buffer */ 226*da6c28aaSamw USHORT ParamOffset; /* Offset (from hdr start) to params */ 227*da6c28aaSamw USHORT ParamDisplacement; /* Displacement of these param bytes */ 228*da6c28aaSamw USHORT DataCount; /* Data bytes sent this buffer */ 229*da6c28aaSamw USHORT DataOffset; /* Offset (from hdr start) to data */ 230*da6c28aaSamw USHORT DataDisplacement; /* Displacement of these data bytes */ 231*da6c28aaSamw UCHAR SetupCount; /* Count of setup words */ 232*da6c28aaSamw USHORT BCC; 233*da6c28aaSamw #if 0 234*da6c28aaSamw UCHAR Reserved2; /* Reserved (pad above to word) */ 235*da6c28aaSamw UCHAR Buffer[1]; /* Buffer containing: */ 236*da6c28aaSamw USHORT Setup[]; /* Setup words (# = SetupWordCount) */ 237*da6c28aaSamw USHORT ByteCount; /* Count of data bytes */ 238*da6c28aaSamw UCHAR Pad[]; /* Pad to SHORT or LONG */ 239*da6c28aaSamw UCHAR Params[]; /* Param. bytes (# = ParamCount) */ 240*da6c28aaSamw UCHAR Pad1[]; /* Pad to SHORT or LONG */ 241*da6c28aaSamw UCHAR Data[]; /* Data bytes (# = DataCount) */ 242*da6c28aaSamw #endif 243*da6c28aaSamw } smb_transact_rsp_t; 244*da6c28aaSamw 245*da6c28aaSamw /* 246*da6c28aaSamw * SMBreadX 247*da6c28aaSamw */ 248*da6c28aaSamw typedef struct smb_read_andx_rsp { 249*da6c28aaSamw UCHAR WordCount; 250*da6c28aaSamw UCHAR AndXCmd; 251*da6c28aaSamw UCHAR AndXReserved; 252*da6c28aaSamw USHORT AndXOffset; 253*da6c28aaSamw USHORT Remaining; 254*da6c28aaSamw USHORT DataCompactionMode; 255*da6c28aaSamw USHORT Reserved; 256*da6c28aaSamw USHORT DataLength; 257*da6c28aaSamw USHORT DataOffset; 258*da6c28aaSamw ULONG DataLengthHigh; 259*da6c28aaSamw USHORT Reserved2[3]; 260*da6c28aaSamw USHORT ByteCount; 261*da6c28aaSamw #if 0 262*da6c28aaSamw UCHAR Pad[]; 263*da6c28aaSamw UCHAR Data[]; 264*da6c28aaSamw #endif 265*da6c28aaSamw } smb_read_andx_rsp_t; 266*da6c28aaSamw 267*da6c28aaSamw #ifdef __cplusplus 268*da6c28aaSamw } 269*da6c28aaSamw #endif 270*da6c28aaSamw 271*da6c28aaSamw 272*da6c28aaSamw #endif /* _SMBSRV_SMB_H */ 273