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