DEVEL15-windows-freelance-improved-dfs-handling-20080127
[openafs.git] / src / WINNT / afsd / smb3.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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
8  */
9
10 #ifndef __SMB3_H_ENV__
11 #define __SMB3_H_ENV__ 1
12
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 opcode;                     /* subopcode we're handling */
24         long flags;                     /* flags */
25         smb_vc_t *vcp;                  /* virtual circuit we're dealing with */
26         unsigned short tid;             /* tid to match */
27         unsigned short mid;             /* mid to match */
28         unsigned short pid;             /* pid to remember */
29         unsigned short uid;             /* uid to remember */
30         unsigned short res[6];          /* contains PidHigh */
31         unsigned short *parmsp;         /* parms */
32         unsigned char *datap;           /* data bytes */
33 } smb_tran2Packet_t;
34
35 /* for flags field */
36 #define SMB_TRAN2PFLAG_ALLOC    1
37
38 typedef struct smb_tran2Dispatch {
39         long (*procp)(smb_vc_t *, smb_tran2Packet_t *, smb_packet_t *);
40         long flags;
41 } smb_tran2Dispatch_t;
42
43 /* Data Structures that are written to or read from the wire directly
44  * must be byte aligned (no padding).
45  */
46 #pragma pack(push, 1)
47 typedef struct smb_tran2QFSInfo {
48     union {
49         struct {
50             unsigned long FSID;                 /* file system ID */
51             unsigned long sectorsPerAllocUnit;
52             unsigned long totalAllocUnits;      /* on the disk */
53             unsigned long availAllocUnits;      /* free blocks */
54             unsigned short bytesPerSector;      /* bytes per sector */
55         } allocInfo;
56         struct {
57             unsigned long vsn;                  /* volume serial number */
58             char vnCount;                       /* count of chars in label, incl null */
59             char label[12];                     /* pad out with nulls */
60         } volumeInfo;
61         struct {
62             FILETIME      vct;          /* volume creation time */
63             unsigned long vsn;          /* volume serial number */
64             unsigned long vnCount;      /* length of volume label in bytes */
65             char res[2];                /* reserved */
66             char label[10];             /* volume label */
67         } FSvolumeInfo;
68         struct {
69             LARGE_INTEGER totalAllocUnits;      /* on the disk */
70             LARGE_INTEGER availAllocUnits;      /* free blocks */
71             unsigned long sectorsPerAllocUnit;
72             unsigned long bytesPerSector;       /* bytes per sector */
73         } FSsizeInfo;
74         struct {
75             unsigned long devType;              /* device type */
76             unsigned long characteristics;
77         } FSdeviceInfo;
78         struct {
79             unsigned long attributes;
80             unsigned long maxCompLength;        /* max path component length */
81             unsigned long FSnameLength;         /* length of file system name */
82             unsigned char FSname[12];
83         } FSattributeInfo;
84     } u;
85 } smb_tran2QFSInfo_t;
86
87 typedef struct {
88     union {
89         struct {
90             unsigned long  creationDateTime;    /* SMB_DATE / SMB_TIME */
91             unsigned long  lastAccessDateTime;  /* SMB_DATE / SMB_TIME */
92             unsigned long  lastWriteDateTime;   /* SMB_DATE / SMB_TIME */
93             unsigned long  dataSize;
94             unsigned long  allocationSize;
95             unsigned short attributes;
96             unsigned long  eaSize;
97         } QPstandardInfo;
98         struct {
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;
106         } QPeaSizeInfo;
107         struct {
108             unsigned short maxDataCount;
109             unsigned short eaErrorOffset;
110             unsigned long  listLength;
111             unsigned char  eaList[128];
112         } QPeasFromListInfo;
113         struct {
114             unsigned short maxDataCount;
115             unsigned short eaErrorOffset;
116             unsigned long  listLength;
117             unsigned char  eaList[128];
118         } QPallEasInfo;
119         struct {
120             FILETIME       creationTime;
121             FILETIME       lastAccessTime;
122             FILETIME       lastWriteTime;
123             FILETIME       changeTime;
124             unsigned long  attributes;
125             unsigned long  reserved;
126         } QPfileBasicInfo;
127         struct {
128             LARGE_INTEGER  allocationSize;
129             LARGE_INTEGER  endOfFile;
130             unsigned long  numberOfLinks;
131             unsigned char  deletePending;
132             unsigned char  directory;
133             unsigned short reserved;
134         } QPfileStandardInfo;
135         struct {
136             unsigned long  eaSize;
137         } QPfileEaInfo;
138         struct {
139             unsigned long  fileNameLength;
140             unsigned char  fileName[512];
141         } QPfileNameInfo;
142         struct {
143             FILETIME       creationTime;
144             FILETIME       lastAccessTime;
145             FILETIME       lastWriteTime;
146             FILETIME       changeTime;
147             unsigned long  attributes;
148             LARGE_INTEGER  allocationSize;
149             LARGE_INTEGER  endOfFile;
150             unsigned long  numberOfLinks;
151             unsigned char  deletePending;
152             unsigned char  directory;
153             LARGE_INTEGER  indexNumber;
154             unsigned long  eaSize;
155             unsigned long  accessFlags;
156             LARGE_INTEGER  indexNumber2;
157             LARGE_INTEGER  currentByteOffset;
158             unsigned long  mode;
159             unsigned long  alignmentRequirement;
160             unsigned long  fileNameLength;
161             unsigned char  fileName[512];
162         } QPfileAllInfo;
163         struct {
164             unsigned long  fileNameLength;
165             unsigned char  fileName[512];
166         } QPfileAltNameInfo;
167         struct {
168             unsigned long  nextEntryOffset;
169             unsigned long  streamNameLength;
170             LARGE_INTEGER  streamSize;
171             LARGE_INTEGER  streamAllocationSize;
172             unsigned char  fileName[512];
173         } QPfileStreamInfo;
174         struct {
175             LARGE_INTEGER  compressedFileSize;
176             unsigned short compressionFormat;
177             unsigned char  compressionUnitShift;
178             unsigned char  chuckShift;
179             unsigned char  clusterShift;
180             unsigned char  reserved[3];
181         } QPfileCompressionInfo;
182     } u;
183 } smb_tran2QPathInfo_t;
184
185 typedef struct {
186     union {
187         struct {
188             FILETIME       creationTime;
189             FILETIME       lastAccessTime;
190             FILETIME       lastWriteTime;
191             FILETIME       lastChangeTime;
192             unsigned long  attributes;
193         } QFbasicInfo;
194         struct {
195             LARGE_INTEGER  allocationSize;
196             LARGE_INTEGER  endOfFile;
197             unsigned long  numberOfLinks;
198             unsigned char  deletePending;
199             unsigned char  directory;
200         } QFstandardInfo;
201         struct {
202             unsigned long  eaSize;
203         } QFeaInfo;
204         struct {        
205             unsigned long  fileNameLength;
206             unsigned char  fileName[512];
207         } QFfileNameInfo;
208     } u;
209 } smb_tran2QFileInfo_t;
210 #pragma pack(pop)
211
212 /* more than enough opcodes for today, anyway */
213 #define SMB_TRAN2_NOPCODES              20
214
215 extern smb_tran2Dispatch_t smb_tran2DispatchTable[SMB_TRAN2_NOPCODES];
216
217 #define SMB_RAP_NOPCODES        64
218
219 extern smb_tran2Dispatch_t smb_rapDispatchTable[SMB_RAP_NOPCODES];
220
221 extern long smb_ReceiveV3SessionSetupX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
222
223 extern long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
224
225 extern long smb_ReceiveV3Trans(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
226
227 extern long smb_ReceiveV3Tran2A(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
228
229 extern long smb_ReceiveRAPNetShareEnum(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
230
231 extern long smb_ReceiveRAPNetShareGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
232
233 extern long smb_ReceiveRAPNetWkstaGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
234
235 extern long smb_ReceiveRAPNetServerGetInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op);
236
237 extern long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p,
238         smb_packet_t *outp);
239
240 extern long smb_ReceiveTran2FindFirst(smb_vc_t *vcp, smb_tran2Packet_t *p,
241         smb_packet_t *outp);
242
243 extern long smb_ReceiveTran2SearchDir(smb_vc_t *vcp, smb_tran2Packet_t *p,
244         smb_packet_t *outp);
245
246 extern long smb_ReceiveTran2FindNext(smb_vc_t *vcp, smb_tran2Packet_t *p,
247         smb_packet_t *outp);
248
249 extern long smb_ReceiveTran2QFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
250         smb_packet_t *outp);
251
252 extern long smb_ReceiveTran2SetFSInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
253         smb_packet_t *outp);
254
255 extern long smb_ReceiveTran2QFSInfoFid(smb_vc_t *vcp, smb_tran2Packet_t *p,
256         smb_packet_t *outp);
257
258 extern long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
259         smb_packet_t *outp);
260
261 extern long smb_ReceiveTran2SetPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
262         smb_packet_t *outp);
263
264 extern long smb_ReceiveTran2QFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
265         smb_packet_t *outp);
266
267 extern long smb_ReceiveTran2SetFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p,
268         smb_packet_t *outp);
269
270 extern long smb_ReceiveTran2FSCTL(smb_vc_t *vcp, smb_tran2Packet_t *p,
271         smb_packet_t *outp);
272
273 extern long smb_ReceiveTran2IOCTL(smb_vc_t *vcp, smb_tran2Packet_t *p,
274         smb_packet_t *outp);
275
276 extern long smb_ReceiveTran2FindNotifyFirst(smb_vc_t *vcp, smb_tran2Packet_t *p,
277         smb_packet_t *outp);
278
279 extern long smb_ReceiveTran2FindNotifyNext(smb_vc_t *vcp, smb_tran2Packet_t *p,
280         smb_packet_t *outp);
281
282 extern long smb_ReceiveTran2CreateDirectory(smb_vc_t *vcp, smb_tran2Packet_t *p,
283         smb_packet_t *outp);
284
285 extern long smb_ReceiveTran2SessionSetup(smb_vc_t *vcp, smb_tran2Packet_t *p,
286         smb_packet_t *outp);
287
288 extern long smb_ReceiveTran2GetDFSReferral(smb_vc_t *vcp, smb_tran2Packet_t *p,
289         smb_packet_t *outp);
290
291 extern long smb_ReceiveTran2ReportDFSInconsistency(smb_vc_t *vcp, smb_tran2Packet_t *p,
292         smb_packet_t *outp);
293
294 extern long smb_ReceiveV3FindClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
295
296 extern long smb_ReceiveV3FindNotifyClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
297
298 extern long smb_ReceiveV3UserLogoffX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
299
300 extern long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
301
302 extern long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
303
304 extern long smb_ReceiveV3GetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
305
306 extern long smb_ReceiveV3ReadX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
307
308 extern long smb_ReceiveV3WriteX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
309
310 extern long smb_ReceiveV3SetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
311
312 extern long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
313
314 extern long smb_ReceiveNTTransact(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
315
316 extern void smb_NotifyChange(DWORD action, DWORD notifyFilter,
317         cm_scache_t *dscp, char *filename, char *otherFilename,
318         BOOL isDirectParent);
319
320 extern long smb_ReceiveNTCancel(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
321
322 extern long smb_ReceiveNTRename(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp);
323
324 extern int smb_V3MatchMask(char *namep, char *maskp, int flags);
325
326 extern void smb3_Init();
327 extern cm_user_t *smb_FindCMUserByName(char *usern, char *machine, afs_uint32 flags);
328
329 /* SMB auth related functions */
330 extern void smb_NegotiateExtendedSecurity(void ** secBlob, int * secBlobLength);
331
332 #ifdef DJGPP
333 #define DELETE (0x00010000)
334 #define READ_CONTROL (0x00020000)
335 #define SYNCHRONIZE (0x00100000)
336 #define FILE_WRITE_ATTRIBUTES ( 0x0100 )
337 #define FILE_GENERIC_READ (0x00120089)
338 #define FILE_GENERIC_WRITE (0x00120116)
339 #define FILE_GENERIC_EXECUTE (0x001200a0)
340 #endif /* DJGPP */
341
342 /* Some of the FILE_NOTIFY_CHANGE values are undefined in winnt.h */
343 #define FILE_NOTIFY_CHANGE_EA           0x00000080
344 #define FILE_NOTIFY_CHANGE_STREAM_NAME  0x00000200
345 #define FILE_NOTIFY_CHANGE_STREAM_SIZE  0x00000400
346 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
347 #endif /*  __SMB3_H_ENV__ */