Windows: AFSRedirLib.sys file system library driver
[openafs.git] / src / WINNT / afsrdr / kernel / lib / Include / AFSStructs.h
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009, 2010, 2011 Your File System, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * - Redistributions of source code must retain the above copyright notice,
11  *   this list of conditions and the following disclaimer.
12  * - Redistributions in binary form must reproduce the above copyright
13  *   notice,
14  *   this list of conditions and the following disclaimer in the
15  *   documentation
16  *   and/or other materials provided with the distribution.
17  * - Neither the names of Kernel Drivers, LLC and Your File System, Inc.
18  *   nor the names of their contributors may be used to endorse or promote
19  *   products derived from this software without specific prior written
20  *   permission from Kernel Drivers, LLC and Your File System, Inc.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #ifndef _AFS_STRUCTS_H
36 #define _AFS_STRUCTS_H
37
38 //
39 // File: AFSStructs.h
40 //
41
42 typedef struct _AFS_DIR_HDR
43 {
44
45     struct _AFS_DIRECTORY_CB *CaseSensitiveTreeHead;
46
47     struct _AFS_DIRECTORY_CB *CaseInsensitiveTreeHead;
48
49     ERESOURCE               *TreeLock;
50
51     LONG                     ContentIndex;
52
53 } AFSDirHdr;
54
55 //
56 // Worker pool header
57 //
58
59 typedef struct _AFS_WORKER_QUEUE_HDR
60 {
61
62     struct _AFS_WORKER_QUEUE_HDR    *fLink;
63
64     KEVENT           WorkerThreadReady;
65
66     void            *WorkerThreadObject;
67
68     ULONG            State;
69
70 } AFSWorkQueueContext, *PAFSWorkQueueContext;
71
72 //
73 // These are the context control blocks for the open instance
74 //
75
76 typedef struct _AFS_CCB
77 {
78
79     USHORT        Size;
80     USHORT        Type;
81
82     ULONG         Flags;
83
84     //
85     // Directory enumeration informaiton
86     //
87
88     UNICODE_STRING MaskName;
89
90     struct _AFS_DIRECTORY_SS_HDR    *DirectorySnapshot;
91
92     ULONG          CurrentDirIndex;
93
94     //
95     // PIOCtl and share interface request id
96     //
97
98     ULONG          RequestID;
99
100     //
101     // Full path of how the instance was opened
102     //
103
104     UNICODE_STRING FullFileName;
105
106     //
107     // Name array for this open
108     //
109
110     struct _AFS_NAME_ARRAY_HEADER  *NameArray;
111
112     //
113     // Pointer to this entries meta data
114     //
115
116     struct _AFS_DIRECTORY_CB  *DirectoryCB;
117
118     //
119     // Notification name
120     //
121
122     UNICODE_STRING          NotifyMask;
123
124     //
125     // File unwind info
126     //
127
128     struct
129     {
130
131         ULONG           FileAttributes;
132
133         LARGE_INTEGER   CreationTime;
134
135         LARGE_INTEGER   LastAccessTime;
136
137         LARGE_INTEGER   LastWriteTime;
138
139         LARGE_INTEGER   ChangeTime;
140
141     } FileUnwindInfo;
142
143 } AFSCcb;
144
145 //
146 // Object information block
147 //
148
149 typedef struct _AFS_NONPAGED_OBJECT_INFO_CB
150 {
151
152     ERESOURCE           DirectoryNodeHdrLock;
153
154 } AFSNonPagedObjectInfoCB;
155
156 typedef struct _AFS_OBJECT_INFORMATION_CB
157 {
158
159     AFSBTreeEntry             TreeEntry;
160
161     AFSListEntry              ListEntry;
162
163     ULONG                     Flags;
164
165     LONG                      ObjectReferenceCount;
166
167     AFSNonPagedObjectInfoCB  *NonPagedInfo;
168
169     //
170     // The VolumeCB where this entry resides
171     //
172
173     struct _AFS_VOLUME_CB    *VolumeCB;
174
175     //
176     // Parent object information
177     //
178
179     struct _AFS_OBJECT_INFORMATION_CB   *ParentObjectInformation;
180
181     //
182     // Pointer to the current Fcb, if available
183     //
184
185     AFSFcb                   *Fcb;
186
187     //
188     // Last access time.
189     //
190
191     LARGE_INTEGER           LastAccessCount;
192
193     //
194     // Per file metadata information
195     //
196
197     AFSFileID               FileId;
198
199     AFSFileID               TargetFileId;
200
201     LARGE_INTEGER           Expiration;         /* FILETIME */
202
203     LARGE_INTEGER           DataVersion;
204
205     ULONG                   FileType;           /* File, Dir, MountPoint, Symlink */
206
207     LARGE_INTEGER           CreationTime;       /* FILETIME */
208
209     LARGE_INTEGER           LastAccessTime;     /* FILETIME */
210
211     LARGE_INTEGER           LastWriteTime;      /* FILETIME */
212
213     LARGE_INTEGER           ChangeTime;         /* FILETIME */
214
215     ULONG                   FileAttributes;     /* NTFS FILE_ATTRIBUTE_xxxx see below */
216
217     LARGE_INTEGER           EndOfFile;
218
219     LARGE_INTEGER           AllocationSize;
220
221     ULONG                   EaSize;
222
223     ULONG                   Links;
224
225     //
226     // Directory and file specific information
227     //
228
229         union
230         {
231
232                 struct
233                 {
234
235                         //
236                         // The directory search and listing information for the node
237                         //
238
239                         AFSDirHdr                  DirectoryNodeHdr;
240
241                         struct _AFS_DIRECTORY_CB  *DirectoryNodeListHead;
242
243                         struct _AFS_DIRECTORY_CB  *DirectoryNodeListTail;
244
245             LONG                       DirectoryNodeCount;
246
247                         struct _AFS_DIRECTORY_CB  *ShortNameTree;
248
249             //
250             // PIOCtl directory cb entry
251             //
252
253             struct _AFS_DIRECTORY_CB  *PIOCtlDirectoryCB;
254
255             //
256             // Open handle and reference count for this object
257             //
258
259             LONG                       ChildOpenHandleCount;
260
261             LONG                       ChildOpenReferenceCount;
262
263             //
264             // Index for the PIOCtl and share open count
265             //
266
267             LONG                OpenRequestIndex;
268
269                 } Directory;
270
271                 struct
272                 {
273
274             ULONG       Reserved;
275
276                 } File;
277
278         } Specific;
279
280 } AFSObjectInfoCB;
281
282 //
283 // Volume control block structure
284 //
285
286 typedef struct _AFS_NON_PAGED_VOLUME_CB
287 {
288
289     ERESOURCE           VolumeLock;
290
291     ERESOURCE           ObjectInfoTreeLock;
292
293     ERESOURCE           DirectoryNodeHdrLock;
294
295 }AFSNonPagedVolumeCB;
296
297 typedef struct _AFS_VOLUME_CB
298 {
299
300     //
301     // Our tree entry.
302     //
303
304     AFSBTreeEntry             TreeEntry;
305
306     //
307     // This is the linked list of nodes processed asynchronously by the respective worker thread
308     //
309
310     AFSListEntry              ListEntry;
311
312     ULONG                     Flags;
313
314     AFSNonPagedVolumeCB      *NonPagedVcb;
315
316     ERESOURCE                *VolumeLock;
317
318     //
319     // Reference count on the object
320     //
321
322     LONG                      VolumeReferenceCount;
323
324     //
325     // Object information tree
326     //
327
328     AFSTreeHdr                ObjectInfoTree;
329
330     AFSObjectInfoCB          *ObjectInfoListHead;
331
332     AFSObjectInfoCB          *ObjectInfoListTail;
333
334     //
335     // Object information for the volume
336     //
337
338     AFSObjectInfoCB           ObjectInformation;
339
340     //
341     // Root directory cb for this volume
342     //
343
344     struct _AFS_DIRECTORY_CB *DirectoryCB;
345
346     //
347     // The Fcb for this volume
348     //
349
350     AFSFcb                   *RootFcb;
351
352     //
353     // Volume worker thread
354     //
355
356     AFSWorkQueueContext       VolumeWorkerContext;
357
358     //
359     // Volume information
360     //
361
362     AFSVolumeInfoCB           VolumeInformation;
363
364 } AFSVolumeCB;
365
366 typedef struct _AFS_NAME_INFORMATION_CB
367 {
368
369     CCHAR           ShortNameLength;
370
371     WCHAR           ShortName[12];
372
373     UNICODE_STRING  FileName;
374
375     UNICODE_STRING  TargetName;
376
377 } AFSNameInfoCB;
378
379 typedef struct _AFS_NON_PAGED_DIRECTORY_CB
380 {
381
382     ERESOURCE       Lock;
383
384 } AFSNonPagedDirectoryCB;
385
386 typedef struct _AFS_DIRECTORY_CB
387 {
388
389     AFSBTreeEntry    CaseSensitiveTreeEntry;    // For entries in the NameEntry tree, the
390                                                 // Index is a CRC on the name. For Volume,
391                                                 // MP and SL nodes, the Index is the Cell, Volume
392                                                 // For all others it is the vnode, uniqueid
393
394     AFSBTreeEntry    CaseInsensitiveTreeEntry;
395
396     AFSListEntry     CaseInsensitiveList;
397
398     ULONG            Flags;
399
400     //
401     // Current open reference count on the directory entry. This count is used
402     // for tear down
403     //
404
405     LONG             OpenReferenceCount;
406
407     //
408     // File index used in directory enumerations
409     //
410
411     ULONG            FileIndex;
412
413     //
414     // Name information for this entry
415     //
416
417     AFSNameInfoCB    NameInformation;
418
419     //
420     // List entry for the directory enumeration list in a parent node
421     //
422
423     AFSListEntry     ListEntry;
424
425     //
426     // Back pointer to the ObjectInfo block for this entry
427     //
428
429     AFSObjectInfoCB *ObjectInformation;
430
431     //
432     // Non paged pointer
433     //
434
435     AFSNonPagedDirectoryCB  *NonPaged;
436
437     //
438     // Type specific information
439     //
440
441     union
442     {
443
444         struct
445         {
446
447             AFSBTreeEntry    ShortNameTreeEntry;
448
449         } Data;
450
451         struct
452         {
453
454             ULONG           Reserved;
455
456         } MountPoint;
457
458         struct
459         {
460
461             ULONG           Reserved;
462
463         } SymLink;
464
465     } Type;
466
467 } AFSDirectoryCB;
468
469 // Read and writes can fan out and so they are syncrhonized via one of
470 // these structures
471 //
472
473 typedef struct _AFS_GATHER_READWRITE
474 {
475     KEVENT     Event;
476
477     LONG       Count;
478
479     NTSTATUS   Status;
480
481     PIRP       MasterIrp;
482
483     BOOLEAN    Synchronous;
484
485     BOOLEAN    CompleteMasterIrp;
486
487     AFSFcb    *Fcb;
488
489 } AFSGatherIo;
490
491 typedef struct _AFS_IO_RUNS {
492
493     LARGE_INTEGER CacheOffset;
494     PIRP          ChildIrp;
495     ULONG         ByteCount;
496 } AFSIoRun;
497
498 //
499 // Name array element and header
500 //
501
502 typedef struct _AFS_NAME_ARRAY_ELEMENT
503 {
504
505     UNICODE_STRING      Component;
506
507     AFSFileID           FileId;
508
509     AFSDirectoryCB     *DirectoryCB;
510
511     ULONG               Flags;
512
513 } AFSNameArrayCB;
514
515 typedef struct _AFS_NAME_ARRAY_HEADER
516 {
517
518     AFSNameArrayCB      *CurrentEntry;
519
520     LONG                 Count;
521
522     LONG                 LinkCount;
523
524     ULONG                Flags;
525
526     ULONG                MaxElementCount;
527
528     AFSNameArrayCB       ElementArray[ 1];
529
530 } AFSNameArrayHdr;
531
532 typedef struct _AFS_FILE_INFO_CB
533 {
534
535     ULONG           FileAttributes;
536
537     LARGE_INTEGER   AllocationSize;
538
539     LARGE_INTEGER   EndOfFile;
540
541     LARGE_INTEGER   CreationTime;
542
543     LARGE_INTEGER   LastAccessTime;
544
545     LARGE_INTEGER   LastWriteTime;
546
547     LARGE_INTEGER   ChangeTime;
548
549 } AFSFileInfoCB;
550
551 //
552 // Work item
553 //
554
555 typedef struct _AFS_WORK_ITEM
556 {
557
558     struct _AFS_WORK_ITEM *next;
559
560     ULONG    RequestType;
561
562     ULONG    RequestFlags;
563
564     NTSTATUS Status;
565
566     KEVENT   Event;
567
568     ULONG    Size;
569
570     ULONGLONG   ProcessID;
571
572     union
573     {
574         struct
575         {
576             PIRP Irp;
577
578         } ReleaseExtents;
579
580         struct
581         {
582             AFSFcb *Fcb;
583
584             AFSFcb **TargetFcb;
585
586             AFSFileInfoCB   FileInfo;
587
588             struct _AFS_NAME_ARRAY_HEADER *NameArray;
589
590         } Fcb;
591
592         struct
593         {
594             PIRP Irp;
595
596             PDEVICE_OBJECT Device;
597
598             HANDLE CallingProcess;
599
600         } AsynchIo;
601
602         struct
603         {
604
605             UCHAR FunctionCode;
606
607             ULONG RequestFlags;
608
609             struct _AFS_IO_RUNS    *IoRuns;
610
611             ULONG RunCount;
612
613             struct _AFS_GATHER_READWRITE *GatherIo;
614
615             FILE_OBJECT *CacheFileObject;
616
617         } CacheAccess;
618
619         struct
620         {
621             char     Context[ 1];
622
623         } Other;
624
625     } Specific;
626
627 } AFSWorkItem, *PAFSWorkItem;
628
629 //
630 // Directory snapshot structures
631 //
632
633 typedef struct _AFS_DIRECTORY_SS_ENTRY
634 {
635
636     ULONG       NameHash;
637
638 } AFSSnapshotEntry;
639
640 typedef struct _AFS_DIRECTORY_SS_HDR
641 {
642
643     ULONG       EntryCount;
644
645     AFSSnapshotEntry    *TopEntry;
646
647 } AFSSnapshotHdr;
648
649 #endif /* _AFS_STRUCTS_H */