Windows: Track AuthGroup in Context Control Block
[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 first, then Paging Resource
167     //
168
169     ERESOURCE       Resource;
170
171     ERESOURCE       PagingResource;
172
173     //
174     // The section object pointer
175     //
176
177     SECTION_OBJECT_POINTERS        SectionObjectPointers;
178
179     FAST_MUTEX      AdvancedHdrMutex;
180
181     ERESOURCE       CcbListLock;
182
183     union
184     {
185
186         struct
187         {
188
189             ERESOURCE       ExtentsResource;
190
191             //
192             // This is set when an Extents Request completes.  Do not wait for this
193             // with the Extents resource held!
194             //
195             KEVENT          ExtentsRequestComplete;
196
197             NTSTATUS        ExtentsRequestStatus;
198
199             struct _AFS_FSD_EXTENT  *DirtyListHead;
200
201             struct _AFS_FSD_EXTENT  *DirtyListTail;
202
203             ERESOURCE       DirtyExtentsListLock;
204
205             KEVENT          FlushEvent;
206
207             //
208             // Queued Flush event. This event is set when the queued flush count
209             // is zero, cleared otherwise.
210
211             KEVENT          QueuedFlushEvent;
212
213         } File;
214
215         struct
216         {
217
218             KEVENT          DirectoryEnumEvent;
219
220             LONG            DirectoryEnumCount;
221
222         } Directory;
223
224     } Specific;
225
226 } AFSNonPagedFcb, *PAFSNonPagedFcb;
227
228 typedef struct _AFS_FSD_EXTENT
229 {
230     //
231     // Linked list first - the extents and then the skip list
232     //
233
234     LIST_ENTRY          Lists[AFS_NUM_EXTENT_LISTS];
235
236     AFSListEntry        DirtyList;
237
238     //
239     // And the extent itself
240     //
241
242     LARGE_INTEGER       FileOffset;
243
244     LARGE_INTEGER       CacheOffset;
245
246     ULONG               Size;
247
248     ULONG               Flags;
249
250     LONG                ActiveCount;
251
252 #if GEN_MD5
253     UCHAR               MD5[16];
254 #endif
255
256 } AFSExtent, *PAFSExtent;
257
258 typedef struct AFS_FCB
259 {
260
261     FSRTL_ADVANCED_FCB_HEADER Header;
262
263     //
264     // This is the linked list of nodes processed asynchronously by the respective worker thread
265     //
266
267     AFSListEntry        ListEntry;
268
269     //
270     // The NP portion of the Fcb
271     //
272
273     AFSNonPagedFcb    *NPFcb;
274
275     //
276     // Fcb flags
277     //
278
279     ULONG               Flags;
280
281     //
282     // Share access mapping
283     //
284
285     SHARE_ACCESS        ShareAccess;
286
287     //
288     // Open pointer count on this file
289     //
290
291     LONG                OpenReferenceCount;
292
293     //
294     // Open handle count on this file
295     //
296
297     LONG                OpenHandleCount;
298
299     //
300     // Object info block
301     //
302
303     struct _AFS_OBJECT_INFORMATION_CB   *ObjectInformation;
304
305     //
306     // Ccb list pointers
307     //
308
309     struct _AFS_CCB    *CcbListHead;
310
311     struct _AFS_CCB    *CcbListTail;
312
313     //
314     // Union for node type specific information
315     //
316
317     union
318     {
319
320         struct
321         {
322             //
323             // We set this when a flush has been sent to the
324             // server sucessfully.  We use this to influence when we
325             // write the flush.
326             //
327             LARGE_INTEGER       LastServerFlush;
328
329             //
330             // We set this when the extent ref count goes to zero.
331             // we use this to influence which files to purge
332             //
333             LARGE_INTEGER       LastExtentAccess;
334
335             //
336             // If there has been a RELEASE_FILE_EXTENTS - this is
337             // where we stopped last time this stops us from
338             // constantly refreeing the same extents and then grabbing
339             // them again.
340             //
341             LARGE_INTEGER       LastPurgePoint;
342
343             //
344             // File lock
345             //
346
347             FILE_LOCK           FileLock;
348
349             //
350             // The extents
351             //
352
353             LIST_ENTRY          ExtentsLists[AFS_NUM_EXTENT_LISTS];
354
355             //
356             // There is only ever one request active, so we embed it
357             //
358
359             AFSRequestExtentsCB ExtentsRequest;
360
361             //
362             // Last PID that requested extents, NOT the system process
363             //
364
365             ULONGLONG           ExtentRequestProcessId;
366
367             //
368             // Dirty extent count
369             //
370
371             LONG                ExtentsDirtyCount;
372
373             //
374             // Extent count for this file
375             //
376
377             LONG                ExtentCount;
378
379             //
380             // The Lazy writer thread
381             //
382
383             PETHREAD            LazyWriterThread;
384
385             //
386             // Current count of queued flush items for the file
387             //
388
389             LONG                QueuedFlushCount;
390
391             //
392             // Cache space currently held by extents for the file
393             //
394
395             LONG                ExtentLength; // in KBs
396
397         } File;
398
399         struct
400         {
401
402             ULONG       Reserved;
403
404         } Directory;
405
406     } Specific;
407
408 } AFSFcb, *PAFSFcb;
409
410 typedef struct _AFS_DEVICE_EXTENSION
411 {
412
413     //
414     // Self pointer
415     //
416
417     PDEVICE_OBJECT  Self;
418
419     //
420     // List of device isntances
421     //
422
423     struct _AFS_DEVICE_EXTENSION *DeviceLink;
424
425     //
426     // Device flags
427     //
428
429     ULONG           DeviceFlags;
430
431     union
432     {
433
434         struct
435         {
436
437             //
438             // Volume worker tracking information
439             //
440
441             KEVENT           VolumeWorkerCloseEvent;
442
443             LONG             VolumeWorkerThreadCount;
444
445             //
446             // Fcb lifetime & flush time tickcount. This is calculated
447             // in DriverEntry() for the control device.
448             //
449
450             LARGE_INTEGER           ObjectLifeTimeCount;
451             LARGE_INTEGER           FcbFlushTimeCount;
452             LARGE_INTEGER           FcbPurgeTimeCount;
453             LARGE_INTEGER           ExtentRequestTimeCount;
454
455             //
456             // Comm interface
457             //
458
459             AFSCommSrvcCB    CommServiceCB;
460
461             //
462             // Extent Release Interface
463             //
464
465             ERESOURCE        ExtentReleaseResource;
466
467             KEVENT           ExtentReleaseEvent;
468
469             ULONG            ExtentReleaseSequence;
470
471             PKPROCESS        ServiceProcess;
472
473             //
474             // SysName information control block
475             //
476
477             ERESOURCE       SysName32ListLock;
478
479             AFSSysNameCB    *SysName32ListHead;
480
481             AFSSysNameCB    *SysName32ListTail;
482
483             ERESOURCE       SysName64ListLock;
484
485             AFSSysNameCB    *SysName64ListHead;
486
487             AFSSysNameCB    *SysName64ListTail;
488
489             //
490             // Our process tree information
491             //
492
493             AFSTreeHdr          ProcessTree;
494
495             ERESOURCE           ProcessTreeLock;
496
497             //
498             // SID Entry tree
499             //
500
501             AFSTreeHdr          AuthGroupTree;
502
503             ERESOURCE           AuthGroupTreeLock;
504
505             //
506             // Notificaiton information. This is used for change notification
507             //
508
509             LIST_ENTRY          DirNotifyList;
510
511             PNOTIFY_SYNC        NotifySync;
512
513             //
514             // Library load information
515             //
516
517             KEVENT              LoadLibraryEvent;
518
519             ULONG               LibraryState;
520
521             ERESOURCE           LibraryStateLock;
522
523             LONG                InflightLibraryRequests;
524
525             KEVENT              InflightLibraryEvent;
526
527             ERESOURCE           LibraryQueueLock;
528
529             struct _AFS_LIBRARY_QUEUE_REQUEST_CB    *LibraryQueueHead;
530
531             struct _AFS_LIBRARY_QUEUE_REQUEST_CB    *LibraryQueueTail;
532
533             UNICODE_STRING      LibraryServicePath;
534
535             DEVICE_OBJECT      *LibraryDeviceObject;
536
537             FILE_OBJECT        *LibraryFileObject;
538
539             //
540             // Extent processing information within the library
541             //
542
543             LONG                ExtentCount;
544
545             LONG                ExtentsHeldLength;
546
547             KEVENT              ExtentsHeldEvent;
548
549             //
550             // Outstanding service request information
551             //
552
553             LONG                OutstandingServiceRequestCount;
554
555             KEVENT              OutstandingServiceRequestEvent;
556
557         } Control;
558
559         struct
560         {
561
562             //
563             // Cache file information
564             //
565
566             HANDLE              CacheFileHandle;
567
568             PFILE_OBJECT        CacheFileObject;
569
570             ULONG               CacheBlockSize;
571
572             UNICODE_STRING      CacheFile;
573
574             LARGE_INTEGER       CacheBlockCount; // Total number of cache blocks in the cache file
575
576             void               *CacheBaseAddress;
577
578             LARGE_INTEGER       CacheLength;
579
580             PMDL                CacheMdl;
581
582             //
583             // Throttles on behavior
584             //
585             LARGE_INTEGER       MaxIo;
586
587             LARGE_INTEGER       MaxDirty;
588
589             //
590             // Maximum RPC length that is issued by the service. We should limit our
591             // data requests such as for extents to thsi length
592             //
593
594             ULONG               MaximumRPCLength;
595
596             //
597             // Volume tree
598             //
599
600             AFSTreeHdr          VolumeTree;
601
602             ERESOURCE           VolumeTreeLock;
603
604             struct _AFS_VOLUME_CB        *VolumeListHead;
605
606             struct _AFS_VOLUME_CB        *VolumeListTail;
607
608             ERESOURCE           VolumeListLock;
609
610             //
611             // Queued extent release count and event
612             //
613
614             LONG                QueuedReleaseExtentCount;
615
616             KEVENT              QueuedReleaseExtentEvent;
617
618             //
619             // Name array related information
620             //
621
622             ULONG               NameArrayLength;
623
624             ULONG               MaxLinkCount;
625
626             //
627             // Our root cell tree
628             //
629
630             AFSTreeHdr          RootCellTree;
631
632             ERESOURCE           RootCellTreeLock;
633
634             //
635             // Cache file object access
636             //
637
638             ERESOURCE           CacheFileLock;
639
640             //
641             // NP Connection list information
642             //
643
644             ERESOURCE                 ProviderListLock;
645
646             struct _AFSFSD_PROVIDER_CONNECTION_CB   *ProviderConnectionList;
647
648             struct _AFSFSD_PROVIDER_CONNECTION_CB   *ProviderEnumerationList;
649
650         } RDR;
651
652         struct
653         {
654
655             //
656             // Worker pool information
657             //
658
659             ULONG            WorkerCount;
660
661             struct _AFS_WORKER_QUEUE_HDR *PoolHead;
662
663             ERESOURCE        QueueLock;
664
665             struct _AFS_WORK_ITEM     *QueueHead;
666
667             struct _AFS_WORK_ITEM     *QueueTail;
668
669             KEVENT           WorkerQueueHasItems;
670
671             LONG             QueueItemCount;
672
673             //
674             // IO Worker queue
675             //
676
677             ULONG            IOWorkerCount;
678
679             struct _AFS_WORKER_QUEUE_HDR *IOPoolHead;
680
681             ERESOURCE        IOQueueLock;
682
683             struct _AFS_WORK_ITEM     *IOQueueHead;
684
685             struct _AFS_WORK_ITEM     *IOQueueTail;
686
687             KEVENT           IOWorkerQueueHasItems;
688
689             LONG             IOQueueItemCount;
690
691         } Library;
692
693     } Specific;
694
695 } AFSDeviceExt, *PAFSDeviceExt;
696
697 //
698 // Network provider connection cb
699 //
700 #pragma pack(push, 1)
701 typedef struct _AFSFSD_PROVIDER_CONNECTION_CB
702 {
703
704     struct _AFSFSD_PROVIDER_CONNECTION_CB *fLink;
705
706     struct _AFSFSD_PROVIDER_CONNECTION_CB *EnumerationList;
707
708     ULONG       Flags;
709
710     ULONG       Type;
711
712     ULONG       Scope;
713
714     ULONG       DisplayType;
715
716     ULONG       Usage;
717
718     LARGE_INTEGER AuthenticationId;
719
720     WCHAR       LocalName;
721
722     UNICODE_STRING RemoteName;
723
724     UNICODE_STRING ComponentName;
725
726     UNICODE_STRING Comment;
727
728 } AFSProviderConnectionCB;
729 #pragma pack(pop)
730
731 //
732 // Callbacks defined in the framework
733 //
734
735 typedef
736 NTSTATUS
737 (*PAFSProcessRequest)( IN ULONG RequestType,
738                        IN ULONG RequestFlags,
739                        IN GUID *AuthGroup,
740                        IN PUNICODE_STRING FileName,
741                        IN AFSFileID *FileId,
742                        IN void  *Data,
743                        IN ULONG DataLength,
744                        IN OUT void *ResultBuffer,
745                        IN OUT PULONG ResultBufferLength);
746
747 typedef
748 NTSTATUS
749 (*PAFSDbgLogMsg)( IN ULONG Subsystem,
750                   IN ULONG Level,
751                   IN PCCH Format,
752                   ...);
753
754 typedef
755 NTSTATUS
756 (*PAFSAddConnectionEx)( IN UNICODE_STRING *RemoteName,
757                         IN ULONG DisplayType,
758                         IN ULONG Flags);
759
760 typedef
761 void *
762 (*PAFSExAllocatePoolWithTag)( IN POOL_TYPE  PoolType,
763                               IN SIZE_T  NumberOfBytes,
764                               IN ULONG  Tag);
765
766 typedef
767 void
768 (*PAFSExFreePool)( IN void *Pointer);
769
770 typedef
771 void
772 (*PAFSRetrieveAuthGroup)( IN ULONGLONG ProcessId,
773                           IN ULONGLONG ThreadId,
774                           OUT GUID *AuthGroup);
775
776 typedef struct _AFS_LIBRARY_INIT_CB
777 {
778
779     PDEVICE_OBJECT      AFSControlDeviceObject;
780
781     PDEVICE_OBJECT      AFSRDRDeviceObject;
782
783     UNICODE_STRING      AFSServerName;
784
785     ULONG               AFSDebugFlags;
786
787     AFSFileID           GlobalRootFid;
788
789     CACHE_MANAGER_CALLBACKS *AFSCacheManagerCallbacks;
790
791     void               *AFSCacheBaseAddress;
792
793     LARGE_INTEGER       AFSCacheLength;
794
795     //
796     // Callbacks in the framework
797     //
798
799     PAFSProcessRequest  AFSProcessRequest;
800
801     PAFSDbgLogMsg       AFSDbgLogMsg;
802
803     PAFSAddConnectionEx AFSAddConnectionEx;
804
805     PAFSExAllocatePoolWithTag   AFSExAllocatePoolWithTag;
806
807     PAFSExFreePool      AFSExFreePool;
808
809     PAFSDumpTraceFiles  AFSDumpTraceFiles;
810
811     PAFSRetrieveAuthGroup AFSRetrieveAuthGroup;
812
813 } AFSLibraryInitCB;
814
815
816 #endif
817