Windows: Fcb sectionObjectResource
[openafs.git] / src / WINNT / afsrdr / common / AFSRedirCommonStructs.h
1 /*
2  * Copyright (c) 2008-2011 Kernel Drivers, LLC.
3  * Copyright (c) 2009-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 name of Kernel Drivers, LLC nor the names of its
18  *   contributors may be
19  *   used to endorse or promote products derived from this software without
20  *   specific prior written permission from Kernel Drivers, LLC
21  *   and Your File System, Inc.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
27  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35
36 #ifndef _AFS_REDIR_COMMON_STRUCTS_H
37 #define _AFS_REDIR_COMMON_STRUCTS_H
38
39 //
40 // BTree Entry
41 //
42
43 typedef struct AFS_BTREE_ENTRY
44 {
45
46     void    *parentLink;
47
48     void    *leftLink;
49
50     void    *rightLink;
51
52     ULONGLONG HashIndex;
53
54 } AFSBTreeEntry, *PAFSBTreeEntry;
55
56 typedef struct AFS_LIST_ENTRY
57 {
58
59     void    *fLink;
60
61     void    *bLink;
62
63 } AFSListEntry;
64
65 typedef struct _AFS_TREE_HDR
66 {
67
68     AFSBTreeEntry *TreeHead;
69
70     ERESOURCE     *TreeLock;
71
72 } AFSTreeHdr;
73
74 //
75 // Sys Name Information CB
76 //
77
78 typedef struct _AFS_SYS_NAME_CB
79 {
80
81     struct _AFS_SYS_NAME_CB     *fLink;
82
83     UNICODE_STRING      SysName;
84
85 } AFSSysNameCB;
86
87 //
88 // Communication service control structures
89 //
90
91 typedef struct _AFSFSD_SRVC_CONTROL_BLOCK
92 {
93
94     ULONG                       IrpPoolRequestIndex;
95
96     struct _POOL_ENTRY          *RequestPoolHead;
97
98     struct _POOL_ENTRY          *RequestPoolTail;
99
100     ERESOURCE                   IrpPoolLock;
101
102     struct _POOL_ENTRY          *ResultPoolHead;
103
104     struct _POOL_ENTRY          *ResultPoolTail;
105
106     ERESOURCE                   ResultPoolLock;
107
108     KEVENT                      IrpPoolHasEntries;
109
110     KEVENT                      IrpPoolHasReleaseEntries;
111
112     ULONG                       IrpPoolControlFlag;
113
114     LONG                        QueueCount;
115
116 } AFSCommSrvcCB, *PAFSCommSrvcCB;
117
118 //
119 // Irp Pool entry
120 //
121
122 typedef struct _POOL_ENTRY
123 {
124
125     struct _POOL_ENTRY    *fLink;
126
127     struct _POOL_ENTRY    *bLink;
128
129     KEVENT      Event;
130
131     GUID        AuthGroup;
132
133     AFSFileID    FileId;
134
135     UNICODE_STRING  FileName;
136
137     ULONG       RequestType;
138
139     ULONG       RequestIndex;
140
141     ULONG       RequestFlags;
142
143     ULONG       DataLength;
144
145     void       *Data;
146
147     ULONG       ResultStatus;
148
149     void       *ResultBuffer;
150
151     ULONG      *ResultBufferLength;
152
153 } AFSPoolEntry;
154
155 //
156 // The first portion is the non-paged section of the Fcb
157 //
158
159 typedef struct _AFS_NONPAGED_FCB
160 {
161
162     USHORT          Size;
163     USHORT          Type;
164
165     //
166     // Ranking - File Resource, Paging Resource,
167     //           then SectionObject Resource
168     //
169
170     ERESOURCE       Resource;
171
172     ERESOURCE       PagingResource;
173
174     ERESOURCE       SectionObjectResource;
175
176     //
177     // The section object pointer
178     //
179
180     SECTION_OBJECT_POINTERS        SectionObjectPointers;
181
182     FAST_MUTEX      AdvancedHdrMutex;
183
184     ERESOURCE       CcbListLock;
185
186     union
187     {
188
189         struct
190         {
191
192             ERESOURCE       ExtentsResource;
193
194             //
195             // This is set when an Extents Request completes.  Do not wait for this
196             // with the Extents resource held!
197             //
198             KEVENT          ExtentsRequestComplete;
199
200             NTSTATUS        ExtentsRequestStatus;
201
202             GUID            ExtentsRequestAuthGroup;
203
204             struct _AFS_FSD_EXTENT  *DirtyListHead;
205
206             struct _AFS_FSD_EXTENT  *DirtyListTail;
207
208             ERESOURCE       DirtyExtentsListLock;
209
210             KEVENT          FlushEvent;
211
212             //
213             // Queued Flush event. This event is set when the queued flush count
214             // is zero, cleared otherwise.
215
216             KEVENT          QueuedFlushEvent;
217
218         } File;
219
220         struct
221         {
222
223             LONG            DirectoryEnumCount;
224
225         } Directory;
226
227     } Specific;
228
229 } AFSNonPagedFcb, *PAFSNonPagedFcb;
230
231 typedef struct _AFS_FSD_EXTENT
232 {
233     //
234     // Linked list first - the extents and then the skip list
235     //
236
237     LIST_ENTRY          Lists[AFS_NUM_EXTENT_LISTS];
238
239     AFSListEntry        DirtyList;
240
241     //
242     // And the extent itself
243     //
244
245     LARGE_INTEGER       FileOffset;
246
247     LARGE_INTEGER       CacheOffset;
248
249     ULONG               Size;
250
251     ULONG               Flags;
252
253     LONG                ActiveCount;
254
255 #if GEN_MD5
256     UCHAR               MD5[16];
257 #endif
258
259 } AFSExtent, *PAFSExtent;
260
261 typedef struct AFS_FCB
262 {
263
264     FSRTL_ADVANCED_FCB_HEADER Header;
265
266     //
267     // This is the linked list of nodes processed asynchronously by the respective worker thread
268     //
269
270     AFSListEntry        ListEntry;
271
272     //
273     // The NP portion of the Fcb
274     //
275
276     AFSNonPagedFcb    *NPFcb;
277
278     //
279     // Fcb flags
280     //
281
282     ULONG               Flags;
283
284     //
285     // Share access mapping
286     //
287
288     SHARE_ACCESS        ShareAccess;
289
290     //
291     // Open pointer count on this file
292     //
293
294     LONG                OpenReferenceCount;
295
296     //
297     // Open handle count on this file
298     //
299
300     LONG                OpenHandleCount;
301
302     //
303     // Object info block
304     //
305
306     struct _AFS_OBJECT_INFORMATION_CB   *ObjectInformation;
307
308     //
309     // Ccb list pointers
310     //
311
312     struct _AFS_CCB    *CcbListHead;
313
314     struct _AFS_CCB    *CcbListTail;
315
316     //
317     // Union for node type specific information
318     //
319
320     union
321     {
322
323         struct
324         {
325             //
326             // We set this when a flush has been sent to the
327             // server sucessfully.  We use this to influence when we
328             // write the flush.
329             //
330             LARGE_INTEGER       LastServerFlush;
331
332             //
333             // We set this when the extent ref count goes to zero.
334             // we use this to influence which files to purge
335             //
336             LARGE_INTEGER       LastExtentAccess;
337
338             //
339             // If there has been a RELEASE_FILE_EXTENTS - this is
340             // where we stopped last time this stops us from
341             // constantly refreeing the same extents and then grabbing
342             // them again.
343             //
344             LARGE_INTEGER       LastPurgePoint;
345
346             //
347             // File lock
348             //
349
350             FILE_LOCK           FileLock;
351
352             //
353             // The extents
354             //
355
356             LIST_ENTRY          ExtentsLists[AFS_NUM_EXTENT_LISTS];
357
358             //
359             // There is only ever one request active, so we embed it
360             //
361
362             AFSRequestExtentsCB ExtentsRequest;
363
364             //
365             // Last PID that requested extents, NOT the system process
366             //
367
368             ULONGLONG           ExtentRequestProcessId;
369
370             //
371             // Dirty extent count
372             //
373
374             LONG                ExtentsDirtyCount;
375
376             //
377             // Extent count for this file
378             //
379
380             LONG                ExtentCount;
381
382             //
383             // Current count of queued flush items for the file
384             //
385
386             LONG                QueuedFlushCount;
387
388             //
389             // Cache space currently held by extents for the file
390             //
391
392             LONG                ExtentLength; // in KBs
393
394         } File;
395
396         struct
397         {
398
399             ULONG       Reserved;
400
401         } Directory;
402
403     } Specific;
404
405 } AFSFcb, *PAFSFcb;
406
407 typedef struct _AFS_DEVICE_EXTENSION
408 {
409
410     //
411     // Self pointer
412     //
413
414     PDEVICE_OBJECT  Self;
415
416     //
417     // List of device isntances
418     //
419
420     struct _AFS_DEVICE_EXTENSION *DeviceLink;
421
422     //
423     // Device flags
424     //
425
426     ULONG           DeviceFlags;
427
428     AFSFcb*         Fcb;
429
430     union
431     {
432
433         struct
434         {
435
436             //
437             // Volume worker tracking information
438             //
439
440             KEVENT           VolumeWorkerCloseEvent;
441
442             LONG             VolumeWorkerThreadCount;
443
444             //
445             // Fcb lifetime & flush time tickcount. This is calculated
446             // in DriverEntry() for the control device.
447             //
448
449             LARGE_INTEGER           ObjectLifeTimeCount;
450             LARGE_INTEGER           FcbFlushTimeCount;
451             LARGE_INTEGER           FcbPurgeTimeCount;
452             LARGE_INTEGER           ExtentRequestTimeCount;
453
454             //
455             // Comm interface
456             //
457
458             AFSCommSrvcCB    CommServiceCB;
459
460             //
461             // Extent Release Interface
462             //
463
464             ERESOURCE        ExtentReleaseResource;
465
466             KEVENT           ExtentReleaseEvent;
467
468             ULONG            ExtentReleaseSequence;
469
470             PKPROCESS        ServiceProcess;
471
472             //
473             // SysName information control block
474             //
475
476             ERESOURCE       SysName32ListLock;
477
478             AFSSysNameCB    *SysName32ListHead;
479
480             AFSSysNameCB    *SysName32ListTail;
481
482             ERESOURCE       SysName64ListLock;
483
484             AFSSysNameCB    *SysName64ListHead;
485
486             AFSSysNameCB    *SysName64ListTail;
487
488             //
489             // Our process tree information
490             //
491
492             AFSTreeHdr          ProcessTree;
493
494             ERESOURCE           ProcessTreeLock;
495
496             //
497             // SID Entry tree
498             //
499
500             AFSTreeHdr          AuthGroupTree;
501
502             ERESOURCE           AuthGroupTreeLock;
503
504             //
505             // Notificaiton information. This is used for change notification
506             //
507
508             LIST_ENTRY          DirNotifyList;
509
510             PNOTIFY_SYNC        NotifySync;
511
512             //
513             // Library load information
514             //
515
516             KEVENT              LoadLibraryEvent;
517
518             ULONG               LibraryState;
519
520             ERESOURCE           LibraryStateLock;
521
522             LONG                InflightLibraryRequests;
523
524             KEVENT              InflightLibraryEvent;
525
526             ERESOURCE           LibraryQueueLock;
527
528             struct _AFS_LIBRARY_QUEUE_REQUEST_CB    *LibraryQueueHead;
529
530             struct _AFS_LIBRARY_QUEUE_REQUEST_CB    *LibraryQueueTail;
531
532             UNICODE_STRING      LibraryServicePath;
533
534             DEVICE_OBJECT      *LibraryDeviceObject;
535
536             FILE_OBJECT        *LibraryFileObject;
537
538             //
539             // Extent processing information within the library
540             //
541
542             LONG                ExtentCount;
543
544             LONG                ExtentsHeldLength;
545
546             KEVENT              ExtentsHeldEvent;
547
548             //
549             // Outstanding service request information
550             //
551
552             LONG                OutstandingServiceRequestCount;
553
554             KEVENT              OutstandingServiceRequestEvent;
555
556             //
557             // Out of memory signalling
558             //
559
560             LONG                WaitingForMemoryCount;
561
562             KEVENT              MemoryAvailableEvent;
563
564         } Control;
565
566         struct
567         {
568
569             //
570             // Cache file information
571             //
572
573             HANDLE              CacheFileHandle;
574
575             PFILE_OBJECT        CacheFileObject;
576
577             ULONG               CacheBlockSize;
578
579             UNICODE_STRING      CacheFile;
580
581             LARGE_INTEGER       CacheBlockCount; // Total number of cache blocks in the cache file
582
583             void               *CacheBaseAddress;
584
585             LARGE_INTEGER       CacheLength;
586
587             PMDL                CacheMdl;
588
589             //
590             // Throttles on behavior
591             //
592             LARGE_INTEGER       MaxIo;
593
594             LARGE_INTEGER       MaxDirty;
595
596             //
597             // Maximum RPC length that is issued by the service. We should limit our
598             // data requests such as for extents to this length
599             //
600
601             ULONG               MaximumRPCLength;
602
603             //
604             // Volume tree
605             //
606
607             AFSTreeHdr          VolumeTree;
608
609             ERESOURCE           VolumeTreeLock;
610
611             struct _AFS_VOLUME_CB        *VolumeListHead;
612
613             struct _AFS_VOLUME_CB        *VolumeListTail;
614
615             ERESOURCE           VolumeListLock;
616
617             //
618             // Queued extent release count and event
619             //
620
621             LONG                QueuedReleaseExtentCount;
622
623             KEVENT              QueuedReleaseExtentEvent;
624
625             //
626             // Name array related information
627             //
628
629             ULONG               NameArrayLength;
630
631             ULONG               MaxLinkCount;
632
633             //
634             // Our root cell tree
635             //
636
637             AFSTreeHdr          RootCellTree;
638
639             ERESOURCE           RootCellTreeLock;
640
641             //
642             // Cache file object access
643             //
644
645             ERESOURCE           CacheFileLock;
646
647             //
648             // NP Connection list information
649             //
650
651             ERESOURCE                 ProviderListLock;
652
653             struct _AFSFSD_PROVIDER_CONNECTION_CB   *ProviderConnectionList;
654
655             struct _AFSFSD_PROVIDER_CONNECTION_CB   *ProviderEnumerationList;
656
657         } RDR;
658
659         struct
660         {
661
662             //
663             // Worker pool information
664             //
665
666             ULONG            WorkerCount;
667
668             struct _AFS_WORKER_QUEUE_HDR *PoolHead;
669
670             ERESOURCE        QueueLock;
671
672             struct _AFS_WORK_ITEM     *QueueHead;
673
674             struct _AFS_WORK_ITEM     *QueueTail;
675
676             KEVENT           WorkerQueueHasItems;
677
678             LONG             QueueItemCount;
679
680             //
681             // IO Worker queue
682             //
683
684             ULONG            IOWorkerCount;
685
686             struct _AFS_WORKER_QUEUE_HDR *IOPoolHead;
687
688             ERESOURCE        IOQueueLock;
689
690             struct _AFS_WORK_ITEM     *IOQueueHead;
691
692             struct _AFS_WORK_ITEM     *IOQueueTail;
693
694             KEVENT           IOWorkerQueueHasItems;
695
696             LONG             IOQueueItemCount;
697
698         } Library;
699
700     } Specific;
701
702 } AFSDeviceExt, *PAFSDeviceExt;
703
704 //
705 // Network provider connection cb
706 //
707 #pragma pack(push, 1)
708 typedef struct _AFSFSD_PROVIDER_CONNECTION_CB
709 {
710
711     struct _AFSFSD_PROVIDER_CONNECTION_CB *fLink;
712
713     struct _AFSFSD_PROVIDER_CONNECTION_CB *EnumerationList;
714
715     ULONG       Flags;
716
717     ULONG       Type;
718
719     ULONG       Scope;
720
721     ULONG       DisplayType;
722
723     ULONG       Usage;
724
725     LARGE_INTEGER AuthenticationId;
726
727     WCHAR       LocalName;
728
729     UNICODE_STRING RemoteName;
730
731     UNICODE_STRING ComponentName;
732
733     UNICODE_STRING Comment;
734
735 } AFSProviderConnectionCB;
736 #pragma pack(pop)
737
738 //
739 // Callbacks defined in the framework
740 //
741
742 typedef
743 NTSTATUS
744 (*PAFSProcessRequest)( IN ULONG RequestType,
745                        IN ULONG RequestFlags,
746                        IN GUID *AuthGroup,
747                        IN PUNICODE_STRING FileName,
748                        IN AFSFileID *FileId,
749                        IN void  *Data,
750                        IN ULONG DataLength,
751                        IN OUT void *ResultBuffer,
752                        IN OUT PULONG ResultBufferLength);
753
754 typedef
755 NTSTATUS
756 (*PAFSDbgLogMsg)( IN ULONG Subsystem,
757                   IN ULONG Level,
758                   IN PCCH Format,
759                   ...);
760
761 typedef
762 NTSTATUS
763 (*PAFSAddConnectionEx)( IN UNICODE_STRING *RemoteName,
764                         IN ULONG DisplayType,
765                         IN ULONG Flags);
766
767 typedef
768 void *
769 (*PAFSExAllocatePoolWithTag)( IN POOL_TYPE  PoolType,
770                               IN SIZE_T  NumberOfBytes,
771                               IN ULONG  Tag);
772
773 typedef
774 void
775 (*PAFSExFreePoolWithTag)( IN void *Pointer, IN ULONG Tag);
776
777 typedef
778 void
779 (*PAFSRetrieveAuthGroup)( IN ULONGLONG ProcessId,
780                           IN ULONGLONG ThreadId,
781                           OUT GUID *AuthGroup);
782
783 typedef struct _AFS_LIBRARY_INIT_CB
784 {
785
786     PDEVICE_OBJECT      AFSControlDeviceObject;
787
788     PDEVICE_OBJECT      AFSRDRDeviceObject;
789
790     UNICODE_STRING      AFSServerName;
791
792     UNICODE_STRING      AFSMountRootName;
793
794     ULONG               AFSDebugFlags;
795
796     AFSFileID           GlobalRootFid;
797
798     CACHE_MANAGER_CALLBACKS *AFSCacheManagerCallbacks;
799
800     void               *AFSCacheBaseAddress;
801
802     LARGE_INTEGER       AFSCacheLength;
803
804     //
805     // Callbacks in the framework
806     //
807
808     PAFSProcessRequest  AFSProcessRequest;
809
810     PAFSDbgLogMsg       AFSDbgLogMsg;
811
812     PAFSAddConnectionEx AFSAddConnectionEx;
813
814     PAFSExAllocatePoolWithTag   AFSExAllocatePoolWithTag;
815
816     PAFSExFreePoolWithTag      AFSExFreePoolWithTag;
817
818     PAFSDumpTraceFiles  AFSDumpTraceFiles;
819
820     PAFSRetrieveAuthGroup AFSRetrieveAuthGroup;
821
822 } AFSLibraryInitCB;
823
824
825 #endif
826