2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
10 #ifndef __SMB3_H_ENV__
11 #define __SMB3_H_ENV__ 1
13 typedef struct smb_tran2Packet {
14 osi_queue_t q; /* queue of all packets */
15 int com; /* Trans or Trans2 (0x25 or 0x32) */
16 int totalData; /* total # of expected data bytes */
17 int totalParms; /* total # of expected parm bytes */
18 int oldTotalParms; /* initial estimate of parm bytes */
19 int curData; /* current # of received data bytes */
20 int curParms; /* current # of received parm bytes */
21 int maxReturnData; /* max # of returned data bytes */
22 int maxReturnParms; /* max # of returned parm bytes */
23 int setupCount; /* setup count field */
24 int opcode; /* subopcode we're handling */
25 long flags; /* flags */
26 smb_vc_t *vcp; /* virtual circuit we're dealing with */
27 unsigned short tid; /* tid to match */
28 unsigned short mid; /* mid to match */
29 unsigned short pid; /* pid to remember */
30 unsigned short uid; /* uid to remember */
31 unsigned short res[6]; /* contains PidHigh */
32 unsigned int error_code; /* CM error code for the packet */
33 unsigned short *parmsp; /* parms */
34 unsigned char *datap; /* data bytes */
35 int pipeCommand; /* named pipe command code */
36 int pipeParam; /* pipe parameter, if there is one */
37 clientchar_t *name; /* contents of Name
38 field. Only used for Named
40 cm_space_t * stringsp; /* decoded strings */
44 #define SMB_TRAN2PFLAG_ALLOC 1
45 #define SMB_TRAN2PFLAG_USEUNICODE 2
47 typedef struct smb_tran2Dispatch {
48 long (*procp)(smb_vc_t *, smb_tran2Packet_t *, smb_packet_t *);
50 } smb_tran2Dispatch_t;
52 /* Data Structures that are written to or read from the wire directly
53 * must be byte aligned (no padding).
56 typedef struct smb_tran2QFSInfo {
59 unsigned long FSID; /* file system ID */
60 unsigned long sectorsPerAllocUnit;
61 unsigned long totalAllocUnits; /* on the disk */
62 unsigned long availAllocUnits; /* free blocks */
63 unsigned short bytesPerSector; /* bytes per sector */
66 unsigned long vsn; /* volume serial number */
67 char vnCount; /* count of chars in label, incl null */
68 char /* STRING */ label[24]; /* pad out with nulls */
71 FILETIME vct; /* volume creation time */
72 unsigned long vsn; /* volume serial number */
73 unsigned long vnCount; /* length of volume label in bytes */
74 char res[2]; /* reserved */
75 char /* STRING */ label[20]; /* volume label */
78 LARGE_INTEGER totalAllocUnits; /* on the disk */
79 LARGE_INTEGER availAllocUnits; /* free blocks */
80 unsigned long sectorsPerAllocUnit;
81 unsigned long bytesPerSector; /* bytes per sector */
84 unsigned long devType; /* device type */
85 unsigned long characteristics;
88 unsigned long attributes;
89 unsigned long maxCompLength; /* max path component length */
90 unsigned long FSnameLength; /* length of file system name */
91 unsigned char /* STRING */ FSname[24]; /* File system name */
99 unsigned long creationDateTime; /* SMB_DATE / SMB_TIME */
100 unsigned long lastAccessDateTime; /* SMB_DATE / SMB_TIME */
101 unsigned long lastWriteDateTime; /* SMB_DATE / SMB_TIME */
102 unsigned long dataSize;
103 unsigned long allocationSize;
104 unsigned short attributes;
105 unsigned long eaSize;
108 unsigned long creationDateTime; /* SMB_DATE / SMB_TIME */
109 unsigned long lastAccessDateTime; /* SMB_DATE / SMB_TIME */
110 unsigned long lastWriteDateTime; /* SMB_DATE / SMB_TIME */
111 unsigned long dataSize;
112 unsigned long allocationSize;
113 unsigned short attributes;
114 unsigned long eaSize;
117 unsigned short maxDataCount;
118 unsigned short eaErrorOffset;
119 unsigned long listLength;
120 unsigned char eaList[128];
123 unsigned short maxDataCount;
124 unsigned short eaErrorOffset;
125 unsigned long listLength;
126 unsigned char eaList[128];
129 FILETIME creationTime;
130 FILETIME lastAccessTime;
131 FILETIME lastWriteTime;
133 unsigned long attributes;
134 unsigned long reserved;
137 LARGE_INTEGER allocationSize;
138 LARGE_INTEGER endOfFile;
139 unsigned long numberOfLinks;
140 unsigned char deletePending;
141 unsigned char directory;
142 unsigned short reserved;
143 } QPfileStandardInfo;
145 unsigned long eaSize;
148 unsigned long fileNameLength;
149 unsigned char fileName[512]; /* STRING */
152 FILETIME creationTime;
153 FILETIME lastAccessTime;
154 FILETIME lastWriteTime;
156 unsigned long attributes;
157 LARGE_INTEGER allocationSize;
158 LARGE_INTEGER endOfFile;
159 unsigned long numberOfLinks;
160 unsigned char deletePending;
161 unsigned char directory;
162 LARGE_INTEGER indexNumber;
163 unsigned long eaSize;
164 unsigned long accessFlags;
165 LARGE_INTEGER indexNumber2;
166 LARGE_INTEGER currentByteOffset;
168 unsigned long alignmentRequirement;
169 unsigned long fileNameLength;
170 unsigned char fileName[512]; /* STRING */
173 unsigned long fileNameLength;
174 unsigned char fileName[512]; /* STRING */
177 unsigned long nextEntryOffset;
178 unsigned long streamNameLength;
179 LARGE_INTEGER streamSize;
180 LARGE_INTEGER streamAllocationSize;
181 unsigned char fileName[512]; /* STRING */
184 LARGE_INTEGER compressedFileSize;
185 unsigned short compressionFormat;
186 unsigned char compressionUnitShift;
187 unsigned char chuckShift;
188 unsigned char clusterShift;
189 unsigned char reserved[3];
190 } QPfileCompressionInfo;
192 } smb_tran2QPathInfo_t;
197 FILETIME creationTime;
198 FILETIME lastAccessTime;
199 FILETIME lastWriteTime;
200 FILETIME lastChangeTime;
201 unsigned long attributes;
204 LARGE_INTEGER allocationSize;
205 LARGE_INTEGER endOfFile;
206 unsigned long numberOfLinks;
207 unsigned char deletePending;
208 unsigned char directory;
211 unsigned long eaSize;
214 unsigned long fileNameLength;
215 unsigned char fileName[512];
218 } smb_tran2QFileInfo_t;
221 unsigned long creationDateTime; /* SMB_DATE / SMB_TIME */
222 unsigned long lastAccessDateTime; /* SMB_DATE / SMB_TIME */
223 unsigned long lastWriteDateTime; /* SMB_DATE / SMB_TIME */
224 unsigned long dataSize;
225 unsigned long allocationSize;
226 unsigned short attributes;
227 } smb_V3FileAttrsShort;
230 FILETIME creationTime;
231 FILETIME lastAccessTime;
232 FILETIME lastWriteTime;
233 FILETIME lastChangeTime;
234 LARGE_INTEGER endOfFile;
235 LARGE_INTEGER allocationSize;
236 unsigned long extFileAttributes;
237 } smb_V3FileAttrsLong;
242 smb_V3FileAttrsShort fileAttrs;
243 unsigned char fileNameLength;
244 /* STRING fileName */
248 smb_V3FileAttrsShort fileAttrs;
249 unsigned long eaSize;
250 unsigned char fileNameLength;
251 /* STRING fileName */
252 } FeaSizeInfo, FeasFromListInfo;
255 unsigned long nextEntryOffset;
256 unsigned long fileIndex;
257 smb_V3FileAttrsLong fileAttrs;
258 unsigned long fileNameLength;
259 /* STRING fileName */
260 } FfileDirectoryInfo;
263 unsigned long nextEntryOffset;
264 unsigned long fileIndex;
265 smb_V3FileAttrsLong fileAttrs;
266 unsigned long fileNameLength;
267 unsigned long eaSize;
268 /* STRING fileName */
269 } FfileFullDirectoryInfo;
272 unsigned long nextEntryOffset;
273 unsigned long fileIndex;
274 smb_V3FileAttrsLong fileAttrs;
275 unsigned long fileNameLength;
276 unsigned long eaSize;
277 unsigned char shortNameLength;
278 unsigned char reserved;
279 wchar_t shortName[12];
280 /* STRING fileName */
281 } FfileBothDirectoryInfo;
284 unsigned long nextEntryOffset;
285 unsigned long fileIndex;
286 unsigned long fileNameLength;
287 /* STRING fileName */
294 /* more than enough opcodes for today, anyway */
295 #define SMB_TRAN2_NOPCODES 20
297 extern smb_tran2Dispatch_t smb_tran2DispatchTable[SMB_TRAN2_NOPCODES];
299 #define SMB_RAP_NOPCODES 64
301 extern smb_tran2Dispatch_t smb_rapDispatchTable[SMB_RAP_NOPCODES];
303 extern smb_tran2Packet_t *smb_GetTran2ResponsePacket(smb_vc_t *vcp,
304 smb_tran2Packet_t *inp, smb_packet_t *outp,
305 int totalParms, int totalData);
307 extern void smb_FreeTran2Packet(smb_tran2Packet_t *t2p);
309 extern void smb_SendTran2Packet(smb_vc_t *vcp, smb_tran2Packet_t *t2p, smb_packet_t *tp);
311 extern long smb_ReceiveV3SessionSetupX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
313 extern long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
315 extern long smb_ReceiveV3Trans(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
317 extern long smb_ReceiveV3Tran2A(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
319 extern long smb_ReceiveRAPNetShareEnum(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
321 extern long smb_ReceiveRAPNetShareGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
323 extern long smb_ReceiveRAPNetWkstaGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
325 extern long smb_ReceiveRAPNetServerGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
327 extern long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p,
330 extern long smb_ReceiveTran2FindFirst(smb_vc_t *vcp, smb_tran2Packet_t *p,
333 extern long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p,
336 extern long smb_ReceiveTran2FindNext(smb_vc_t *vcp, smb_tran2Packet_t *p,
339 extern long smb_ReceiveTran2QFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
342 extern long smb_ReceiveTran2SetFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
345 extern long smb_ReceiveTran2QFSInfoFid(smb_vc_t *vcp, smb_tran2Packet_t *p,
348 extern long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
351 extern long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
354 extern long smb_ReceiveTran2QFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
357 extern long smb_ReceiveTran2SetFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
360 extern long smb_ReceiveTran2FSCTL(smb_vc_t *vcp, smb_tran2Packet_t *p,
363 extern long smb_ReceiveTran2IOCTL(smb_vc_t *vcp, smb_tran2Packet_t *p,
366 extern long smb_ReceiveTran2FindNotifyFirst(smb_vc_t *vcp, smb_tran2Packet_t *p,
369 extern long smb_ReceiveTran2FindNotifyNext(smb_vc_t *vcp, smb_tran2Packet_t *p,
372 extern long smb_ReceiveTran2CreateDirectory(smb_vc_t *vcp, smb_tran2Packet_t *p,
375 extern long smb_ReceiveTran2SessionSetup(smb_vc_t *vcp, smb_tran2Packet_t *p,
378 extern long smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p,
381 extern long smb_ReceiveTran2ReportDFSInconsistency(smb_vc_t *vcp, smb_tran2Packet_t *p,
384 extern long smb_ReceiveV3FindClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
386 extern long smb_ReceiveV3FindNotifyClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
388 extern long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
390 extern long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
392 extern long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
394 extern long smb_ReceiveV3GetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
396 extern long smb_ReceiveV3ReadX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
398 extern long smb_ReceiveV3WriteX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
400 extern long smb_ReceiveV3SetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
402 extern long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
404 extern long smb_ReceiveNTTransact(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
406 extern void smb_NotifyChange(DWORD action, DWORD notifyFilter,
407 cm_scache_t *dscp, clientchar_t *filename, clientchar_t *otherFilename,
408 BOOL isDirectParent);
410 extern long smb_ReceiveNTCancel(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
412 extern long smb_ReceiveNTRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
414 extern unsigned long smb_ExtAttributes(cm_scache_t *scp);
416 extern void smb3_Init();
418 /* SMB auth related functions */
419 extern void smb_NegotiateExtendedSecurity(void ** secBlob, int * secBlobLength);
421 /* Some of the FILE_NOTIFY_CHANGE values are undefined in winnt.h */
422 #define FILE_NOTIFY_CHANGE_EA 0x00000080
423 #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
424 #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
425 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
426 #endif /* __SMB3_H_ENV__ */