xref: /reactos/sdk/include/ddk/fcb.h (revision c2c66aff)
1 #ifndef _FCB_STRUCTS_DEFINED_
2 #define _FCB_STRUCTS_DEFINED_
3 
4 #include "buffring.h"
5 
6 struct _FCB_INIT_PACKET;
7 typedef struct _FCB_INIT_PACKET *PFCB_INIT_PACKET;
8 
9 typedef struct _SRV_CALL
10 {
11     union
12     {
13         MRX_SRV_CALL;
14         struct
15         {
16             MRX_NORMAL_NODE_HEADER spacer;
17         };
18     };
19     BOOLEAN UpperFinalizationDone;
20     RX_PREFIX_ENTRY PrefixEntry;
21     RX_BLOCK_CONDITION Condition;
22     ULONG SerialNumberForEnum;
23     volatile LONG NumberOfCloseDelayedFiles;
24     LIST_ENTRY TransitionWaitList;
25     LIST_ENTRY ScavengerFinalizationList;
26     PURGE_SYNCHRONIZATION_CONTEXT PurgeSyncronizationContext;
27     RX_BUFFERING_MANAGER BufferingManager;
28 } SRV_CALL, *PSRV_CALL;
29 
30 #define NETROOT_FLAG_FINALIZATION_IN_PROGRESS 0x00040000
31 #define NETROOT_FLAG_NAME_ALREADY_REMOVED 0x00080000
32 
33 typedef struct _NET_ROOT
34 {
35     union
36     {
37         MRX_NET_ROOT;
38         struct
39         {
40             MRX_NORMAL_NODE_HEADER spacer;
41             PSRV_CALL SrvCall;
42         };
43     };
44     BOOLEAN UpperFinalizationDone;
45     RX_BLOCK_CONDITION Condition;
46     LIST_ENTRY TransitionWaitList;
47     LIST_ENTRY ScavengerFinalizationList;
48     PURGE_SYNCHRONIZATION_CONTEXT PurgeSyncronizationContext;
49     PV_NET_ROOT DefaultVNetRoot;
50     LIST_ENTRY VirtualNetRoots;
51     ULONG NumberOfVirtualNetRoots;
52     ULONG SerialNumberForEnum;
53     RX_PREFIX_ENTRY PrefixEntry;
54     RX_FCB_TABLE FcbTable;
55 } NET_ROOT, *PNET_ROOT;
56 
57 typedef struct _V_NET_ROOT
58 {
59     union
60     {
61         MRX_V_NET_ROOT;
62         struct
63         {
64             MRX_NORMAL_NODE_HEADER spacer;
65             PNET_ROOT NetRoot;
66         };
67     };
68     BOOLEAN UpperFinalizationDone;
69     BOOLEAN ConnectionFinalizationDone;
70     RX_BLOCK_CONDITION Condition;
71     volatile LONG AdditionalReferenceForDeleteFsctlTaken;
72     RX_PREFIX_ENTRY PrefixEntry;
73     UNICODE_STRING NamePrefix;
74     ULONG PrefixOffsetInBytes;
75     LIST_ENTRY NetRootListEntry;
76     ULONG SerialNumberForEnum;
77     LIST_ENTRY TransitionWaitList;
78     LIST_ENTRY ScavengerFinalizationList;
79 } V_NET_ROOT, *PV_NET_ROOT;
80 
81 typedef struct _NON_PAGED_FCB
82 {
83     NODE_TYPE_CODE NodeTypeCode;
84     NODE_BYTE_SIZE NodeByteSize;
85     SECTION_OBJECT_POINTERS SectionObjectPointers;
86     ERESOURCE HeaderResource;
87     ERESOURCE PagingIoResource;
88 #ifdef USE_FILESIZE_LOCK
89     FAST_MUTEX FileSizeLock;
90 #endif
91     LIST_ENTRY TransitionWaitList;
92     ULONG OutstandingAsyncWrites;
93     PKEVENT OutstandingAsyncEvent;
94     KEVENT TheActualEvent;
95     PVOID MiniRdrContext[2];
96     FAST_MUTEX AdvancedFcbHeaderMutex;
97     ERESOURCE BufferedLocksResource;
98 #if DBG
99     PFCB FcbBackPointer;
100 #endif
101 } NON_PAGED_FCB, *PNON_PAGED_FCB;
102 
103 typedef enum _RX_FCBTRACKER_CASES
104 {
105     RX_FCBTRACKER_CASE_NORMAL,
106     RX_FCBTRACKER_CASE_NULLCONTEXT,
107     RX_FCBTRACKER_CASE_CBS_CONTEXT,
108     RX_FCBTRACKER_CASE_CBS_WAIT_CONTEXT,
109     RX_FCBTRACKER_CASE_MAXIMUM
110 } RX_FCBTRACKER_CASES;
111 
112 typedef struct _FCB_LOCK
113 {
114     struct _FCB_LOCK * Next;
115     LARGE_INTEGER Length;
116     LARGE_INTEGER BytesOffset;
117     ULONG Key;
118     BOOLEAN ExclusiveLock;
119 } FCB_LOCK, *PFCB_LOCK;
120 
121 typedef struct _FCB_BUFFERED_LOCKS
122 {
123     struct _FCB_LOCK * List;
124     volatile ULONG PendingLockOps;
125     PERESOURCE Resource;
126 } FCB_BUFFERED_LOCKS, *PFCB_BUFFERED_LOCKS;
127 
128 typedef struct _FCB
129 {
130     union
131     {
132         MRX_FCB;
133         struct
134         {
135             FSRTL_ADVANCED_FCB_HEADER spacer;
136             PNET_ROOT NetRoot;
137         };
138     };
139     PV_NET_ROOT VNetRoot;
140     PNON_PAGED_FCB NonPaged;
141     LIST_ENTRY ScavengerFinalizationList;
142     PKEVENT pBufferingStateChangeCompletedEvent;
143     LONG NumberOfBufferingStateChangeWaiters;
144     RX_FCB_TABLE_ENTRY FcbTableEntry;
145     UNICODE_STRING PrivateAlreadyPrefixedName;
146     BOOLEAN UpperFinalizationDone;
147     RX_BLOCK_CONDITION Condition;
148     PRX_FSD_DISPATCH_VECTOR PrivateDispatchVector;
149     PRDBSS_DEVICE_OBJECT RxDeviceObject;
150     PMINIRDR_DISPATCH MRxDispatch;
151     PFAST_IO_DISPATCH MRxFastIoDispatch;
152     PSRV_OPEN InternalSrvOpen;
153     PFOBX InternalFobx;
154     SHARE_ACCESS ShareAccess;
155     SHARE_ACCESS ShareAccessPerSrvOpens;
156     ULONG NumberOfLinks;
157     LARGE_INTEGER CreationTime;
158     LARGE_INTEGER LastAccessTime;
159     LARGE_INTEGER LastWriteTime;
160     LARGE_INTEGER LastChangeTime;
161 #if (_WIN32_WINNT < 0x0600)
162     PETHREAD CreateSectionThread;
163 #endif
164     ULONG ulFileSizeVersion;
165 #if (_WIN32_WINNT < 0x0600)
166     union
167     {
168         struct
169         {
170 #endif
171         FILE_LOCK FileLock;
172 #if (_WIN32_WINNT < 0x0600)
173         PVOID LazyWriteThread;
174 #endif
175         union
176         {
177             LOWIO_PER_FCB_INFO;
178             LOWIO_PER_FCB_INFO LowIoPerFcbInfo;
179         };
180 #ifdef USE_FILESIZE_LOCK
181         PFAST_MUTEX FileSizeLock;
182 #endif
183 #if (_WIN32_WINNT < 0x0600)
184         } Fcb;
185     } Specific;
186 #endif
187     ULONG EaModificationCount;
188     FCB_BUFFERED_LOCKS BufferedLocks;
189 #if DBG
190     PNON_PAGED_FCB CopyOfNonPaged;
191 #endif
192 #ifdef RDBSS_TRACKER
193     ULONG FcbAcquires[RX_FCBTRACKER_CASE_MAXIMUM];
194     ULONG FcbReleases[RX_FCBTRACKER_CASE_MAXIMUM];
195 #else
196 #error tracker must be defined
197 #endif
198     PCHAR PagingIoResourceFile;
199     ULONG PagingIoResourceLine;
200 } FCB, *PFCB;
201 
202 #define FCB_STATE_DELETE_ON_CLOSE 0x00000001
203 #define FCB_STATE_TRUNCATE_ON_CLOSE 0x00000002
204 #define FCB_STATE_PAGING_FILE 0x00000004
205 #define FCB_STATE_DISABLE_LOCAL_BUFFERING 0x00000010
206 #define FCB_STATE_TEMPORARY 0x00000020
207 #define FCB_STATE_BUFFERING_STATE_CHANGE_PENDING 0x00000040
208 #define FCB_STATE_ORPHANED 0x00000080
209 #define FCB_STATE_READAHEAD_DEFERRED 0x00000100
210 #define FCB_STATE_DELAY_CLOSE 0x00000800
211 #define FCB_STATE_FAKEFCB 0x00001000
212 #define FCB_STATE_FILE_IS_BUF_COMPRESSED 0x00004000
213 #define FCB_STATE_FILE_IS_DISK_COMPRESSED 0x00008000
214 #define FCB_STATE_FILE_IS_SHADOWED 0x00010000
215 #define FCB_STATE_BUFFERSTATE_CHANGING 0x00002000
216 #define FCB_STATE_SPECIAL_PATH 0x00020000
217 #define FCB_STATE_TIME_AND_SIZE_ALREADY_SET 0x00040000
218 #define FCB_STATE_FILETIMECACHEING_ENABLED 0x00080000
219 #define FCB_STATE_FILESIZECACHEING_ENABLED 0x00100000
220 #define FCB_STATE_LOCK_BUFFERING_ENABLED 0x00200000
221 #define FCB_STATE_COLLAPSING_ENABLED 0x00400000
222 #define FCB_STATE_OPENSHARING_ENABLED 0x00800000
223 #define FCB_STATE_READBUFFERING_ENABLED 0x01000000
224 #define FCB_STATE_READCACHING_ENABLED 0x02000000
225 #define FCB_STATE_WRITEBUFFERING_ENABLED 0x04000000
226 #define FCB_STATE_WRITECACHING_ENABLED 0x08000000
227 #define FCB_STATE_NAME_ALREADY_REMOVED 0x10000000
228 #define FCB_STATE_ADDEDBACKSLASH 0x20000000
229 #define FCB_STATE_FOBX_USED 0x40000000
230 #define FCB_STATE_SRVOPEN_USED 0x80000000
231 
232 #define FCB_STATE_BUFFERING_STATE_MASK     \
233     ((FCB_STATE_WRITECACHING_ENABLED       \
234       | FCB_STATE_WRITEBUFFERING_ENABLED   \
235       | FCB_STATE_READCACHING_ENABLED      \
236       | FCB_STATE_READBUFFERING_ENABLED    \
237       | FCB_STATE_OPENSHARING_ENABLED      \
238       | FCB_STATE_COLLAPSING_ENABLED       \
239       | FCB_STATE_LOCK_BUFFERING_ENABLED   \
240       | FCB_STATE_FILESIZECACHEING_ENABLED \
241       | FCB_STATE_FILETIMECACHEING_ENABLED))
242 
243 typedef struct _FCB_INIT_PACKET
244 {
245     PULONG pAttributes;
246     PULONG pNumLinks;
247     PLARGE_INTEGER pCreationTime;
248     PLARGE_INTEGER pLastAccessTime;
249     PLARGE_INTEGER pLastWriteTime;
250     PLARGE_INTEGER pLastChangeTime;
251     PLARGE_INTEGER pAllocationSize;
252     PLARGE_INTEGER pFileSize;
253     PLARGE_INTEGER pValidDataLength;
254 } FCB_INIT_PACKET;
255 
256 #define SRVOPEN_FLAG_ENCLOSED_ALLOCATED 0x10000
257 #define SRVOPEN_FLAG_FOBX_USED 0x20000
258 #define SRVOPEN_FLAG_SHAREACCESS_UPDATED 0x40000
259 
260 typedef struct _SRV_OPEN
261 {
262     union
263     {
264         MRX_SRV_OPEN;
265         struct
266         {
267             MRX_NORMAL_NODE_HEADER spacer;
268             PFCB Fcb;
269 #if (_WIN32_WINNT >= 0x600)
270             PV_NET_ROOT VNetRoot;
271 #endif
272         };
273     };
274     BOOLEAN UpperFinalizationDone;
275     RX_BLOCK_CONDITION Condition;
276     volatile LONG BufferingToken;
277     LIST_ENTRY ScavengerFinalizationList;
278     LIST_ENTRY TransitionWaitList;
279     LIST_ENTRY FobxList;
280     PFOBX InternalFobx;
281     union
282     {
283         LIST_ENTRY SrvOpenKeyList;
284         ULONG SequenceNumber;
285     };
286     NTSTATUS OpenStatus;
287 } SRV_OPEN, *PSRV_OPEN;
288 
289 #define FOBX_FLAG_MATCH_ALL 0x10000
290 #define FOBX_FLAG_FREE_UNICODE 0x20000
291 #define FOBX_FLAG_USER_SET_LAST_WRITE 0x40000
292 #define FOBX_FLAG_USER_SET_LAST_ACCESS 0x80000
293 #define FOBX_FLAG_USER_SET_CREATION 0x100000
294 #define FOBX_FLAG_USER_SET_LAST_CHANGE 0x200000
295 #define FOBX_FLAG_DELETE_ON_CLOSE 0x800000
296 #define FOBX_FLAG_SRVOPEN_CLOSED 0x1000000
297 #define FOBX_FLAG_UNC_NAME 0x2000000
298 #define FOBX_FLAG_ENCLOSED_ALLOCATED 0x4000000
299 #define FOBX_FLAG_MARKED_AS_DORMANT 0x8000000
300 #ifdef __REACTOS__
301 #define FOBX_FLAG_DISABLE_COLLAPSING 0x20000000
302 #endif
303 
304 typedef struct _FOBX
305 {
306     union
307     {
308         MRX_FOBX;
309         struct
310         {
311             MRX_NORMAL_NODE_HEADER spacer;
312             PSRV_OPEN SrvOpen;
313         };
314     };
315     volatile ULONG FobxSerialNumber;
316     LIST_ENTRY FobxQLinks;
317     LIST_ENTRY ScavengerFinalizationList;
318     LIST_ENTRY ClosePendingList;
319     LARGE_INTEGER CloseTime;
320     BOOLEAN UpperFinalizationDone;
321     BOOLEAN ContainsWildCards;
322     BOOLEAN fOpenCountDecremented;
323     union
324     {
325         struct
326         {
327             union
328             {
329                 MRX_PIPE_HANDLE_INFORMATION;
330                 MRX_PIPE_HANDLE_INFORMATION PipeHandleInformation;
331             };
332             LARGE_INTEGER CollectDataTime;
333             ULONG CollectDataSize;
334             THROTTLING_STATE ThrottlingState;
335             LIST_ENTRY ReadSerializationQueue;
336             LIST_ENTRY WriteSerializationQueue;
337         } NamedPipe;
338         struct {
339             RXVBO PredictedReadOffset;
340             RXVBO PredictedWriteOffset;
341             THROTTLING_STATE LockThrottlingState;
342             LARGE_INTEGER LastLockOffset;
343             LARGE_INTEGER LastLockRange;
344         } DiskFile;
345     } Specific;
346     PRDBSS_DEVICE_OBJECT RxDeviceObject;
347 } FOBX, *PFOBX;
348 
349 #define RDBSS_REF_TRACK_SRVCALL  0x00000001
350 #define RDBSS_REF_TRACK_NETROOT  0x00000002
351 #define RDBSS_REF_TRACK_VNETROOT 0x00000004
352 #define RDBSS_REF_TRACK_NETFOBX  0x00000008
353 #define RDBSS_REF_TRACK_NETFCB   0x00000010
354 #define RDBSS_REF_TRACK_SRVOPEN  0x00000020
355 #define RX_PRINT_REF_TRACKING    0x40000000
356 #define RX_LOG_REF_TRACKING      0x80000000
357 
358 extern ULONG RdbssReferenceTracingValue;
359 
360 VOID
361 RxpTrackReference(
362     _In_ ULONG TraceType,
363     _In_ PCSTR FileName,
364     _In_ ULONG Line,
365     _In_ PVOID Instance);
366 
367 BOOLEAN
368 RxpTrackDereference(
369     _In_ ULONG TraceType,
370     _In_ PCSTR FileName,
371     _In_ ULONG Line,
372     _In_ PVOID Instance);
373 
374 #define REF_TRACING_ON(TraceMask) (TraceMask & RdbssReferenceTracingValue)
375 #ifndef __REACTOS__
376 #define PRINT_REF_COUNT(TYPE, Count)                          \
377     if (REF_TRACING_ON( RDBSS_REF_TRACK_ ## TYPE) &&          \
378         (RdbssReferenceTracingValue & RX_PRINT_REF_TRACKING)) \
379     {                                                         \
380         DbgPrint("%ld\n", Count);                             \
381     }
382 #else
383 #define PRINT_REF_COUNT(TYPE, Count)                                     \
384     if (REF_TRACING_ON( RDBSS_REF_TRACK_ ## TYPE) &&                     \
385         (RdbssReferenceTracingValue & RX_PRINT_REF_TRACKING))            \
386     {                                                                    \
387         DbgPrint("(%s:%d) %s: %ld\n", __FILE__, __LINE__, #TYPE, Count); \
388     }
389 #endif
390 
391 #define RxReferenceSrvCall(SrvCall)                                          \
392     RxpTrackReference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
393     RxReference(SrvCall)
394 
395 #define RxDereferenceSrvCall(SrvCall, LockHoldingState)                        \
396     RxpTrackDereference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
397     RxDereference(SrvCall, LockHoldingState)
398 
399 #define RxReferenceNetRoot(NetRoot)                                          \
400     RxpTrackReference(RDBSS_REF_TRACK_NETROOT, __FILE__, __LINE__, NetRoot); \
401     RxReference(NetRoot)
402 
403 #define RxDereferenceNetRoot(NetRoot, LockHoldingState)                        \
404     RxpTrackDereference(RDBSS_REF_TRACK_NETROOT, __FILE__, __LINE__, NetRoot); \
405     RxDereference(NetRoot, LockHoldingState)
406 
407 #define RxReferenceVNetRoot(VNetRoot)                                          \
408     RxpTrackReference(RDBSS_REF_TRACK_VNETROOT, __FILE__, __LINE__, VNetRoot); \
409     RxReference(VNetRoot)
410 
411 #define RxDereferenceVNetRoot(VNetRoot, LockHoldingState)                        \
412     RxpTrackDereference(RDBSS_REF_TRACK_VNETROOT, __FILE__, __LINE__, VNetRoot); \
413     RxDereference(VNetRoot, LockHoldingState)
414 
415 #define RxReferenceNetFobx(Fobx)                                          \
416     RxpTrackReference(RDBSS_REF_TRACK_NETFOBX, __FILE__, __LINE__, Fobx); \
417     RxReference(Fobx)
418 
419 #define RxDereferenceNetFobx(Fobx, LockHoldingState)                        \
420     RxpTrackDereference(RDBSS_REF_TRACK_NETFOBX, __FILE__, __LINE__, Fobx); \
421     RxDereference(Fobx, LockHoldingState)
422 
423 #define RxReferenceSrvOpen(SrvOpen)                                          \
424     RxpTrackReference(RDBSS_REF_TRACK_SRVOPEN, __FILE__, __LINE__, SrvOpen); \
425     RxReference(SrvOpen)
426 
427 #define RxDereferenceSrvOpen(SrvOpen, LockHoldingState)                        \
428     RxpTrackDereference(RDBSS_REF_TRACK_SRVOPEN, __FILE__, __LINE__, SrvOpen); \
429     RxDereference(SrvOpen, LockHoldingState)
430 
431 #define RxReferenceNetFcb(Fcb)                                           \
432     (RxpTrackReference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
433      RxpReferenceNetFcb(Fcb))
434 
435 #define RxDereferenceNetFcb(Fcb)                                                 \
436     ((LONG)RxpTrackDereference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb), \
437      RxpDereferenceNetFcb(Fcb))
438 
439 #define RxDereferenceAndFinalizeNetFcb(Fcb, RxContext, RecursiveFinalize, ForceFinalize)  \
440     (RxpTrackDereference(RDBSS_REF_TRACK_NETFCB, __FILE__, __LINE__, Fcb),                \
441      RxpDereferenceAndFinalizeNetFcb(Fcb, RxContext, RecursiveFinalize, ForceFinalize))
442 
443 PSRV_CALL
444 RxCreateSrvCall(
445     _In_ PRX_CONTEXT RxContext,
446     _In_ PUNICODE_STRING Name,
447     _In_opt_ PUNICODE_STRING InnerNamePrefix,
448     _In_ PRX_CONNECTION_ID RxConnectionId);
449 
450 #define RxWaitForStableSrvCall(S, R) RxWaitForStableCondition(&(S)->Condition, &(S)->TransitionWaitList, (R), NULL)
451 #define RxTransitionSrvCall(S, C) RxUpdateCondition((C), &(S)->Condition, &(S)->TransitionWaitList)
452 
453 #if (_WIN32_WINNT >= 0x0600)
454 BOOLEAN
455 RxFinalizeSrvCall(
456     _Out_ PSRV_CALL ThisSrvCall,
457     _In_ BOOLEAN ForceFinalize);
458 #else
459 BOOLEAN
460 RxFinalizeSrvCall(
461     _Out_ PSRV_CALL ThisSrvCall,
462     _In_ BOOLEAN RecursiveFinalize,
463     _In_ BOOLEAN ForceFinalize);
464 #endif
465 
466 PNET_ROOT
467 RxCreateNetRoot(
468     _In_ PSRV_CALL SrvCall,
469     _In_ PUNICODE_STRING Name,
470     _In_ ULONG NetRootFlags,
471     _In_opt_ PRX_CONNECTION_ID RxConnectionId);
472 
473 #define RxWaitForStableNetRoot(N, R) RxWaitForStableCondition(&(N)->Condition, &(N)->TransitionWaitList, (R), NULL)
474 #define RxTransitionNetRoot(N, C) RxUpdateCondition((C), &(N)->Condition, &(N)->TransitionWaitList)
475 
476 BOOLEAN
477 RxFinalizeNetRoot(
478     _Out_ PNET_ROOT ThisNetRoot,
479     _In_ BOOLEAN RecursiveFinalize,
480     _In_ BOOLEAN ForceFinalize);
481 
482 NTSTATUS
483 RxInitializeVNetRootParameters(
484    _In_ PRX_CONTEXT RxContext,
485    _Out_ LUID *LogonId,
486    _Out_ PULONG SessionId,
487    _Out_ PUNICODE_STRING *UserNamePtr,
488    _Out_ PUNICODE_STRING *UserDomainNamePtr,
489    _Out_ PUNICODE_STRING *PasswordPtr,
490    _Out_ PULONG Flags);
491 
492 VOID
493 RxUninitializeVNetRootParameters(
494    _In_ PUNICODE_STRING UserName,
495    _In_ PUNICODE_STRING UserDomainName,
496    _In_ PUNICODE_STRING Password,
497    _Out_ PULONG Flags);
498 
499 PV_NET_ROOT
500 RxCreateVNetRoot(
501     _In_ PRX_CONTEXT RxContext,
502     _In_ PNET_ROOT NetRoot,
503     _In_ PUNICODE_STRING CanonicalName,
504     _In_ PUNICODE_STRING LocalNetRootName,
505     _In_ PUNICODE_STRING FilePath,
506     _In_ PRX_CONNECTION_ID RxConnectionId);
507 
508 BOOLEAN
509 RxFinalizeVNetRoot(
510     _Out_ PV_NET_ROOT ThisVNetRoot,
511     _In_ BOOLEAN RecursiveFinalize,
512     _In_ BOOLEAN ForceFinalize);
513 
514 #define RxWaitForStableVNetRoot(V, R) RxWaitForStableCondition(&(V)->Condition, &(V)->TransitionWaitList, (R), NULL)
515 #define RxTransitionVNetRoot(V, C) RxUpdateCondition((C), &(V)->Condition, &(V)->TransitionWaitList)
516 
517 VOID
518 RxSetFileSizeWithLock(
519     _Inout_ PFCB Fcb,
520     _In_ PLONGLONG FileSize);
521 
522 VOID
523 RxGetFileSizeWithLock(
524     _In_ PFCB Fcb,
525     _Out_ PLONGLONG FileSize);
526 
527 #if (_WIN32_WINNT >= 0x0600)
528 RxCreateNetFcb(
529     _In_ PRX_CONTEXT RxContext,
530     _In_ PIRP Irp,
531     _In_ PV_NET_ROOT VNetRoot,
532     _In_ PUNICODE_STRING Name);
533 #else
534 PFCB
535 RxCreateNetFcb(
536     _In_ PRX_CONTEXT RxContext,
537     _In_ PV_NET_ROOT VNetRoot,
538     _In_ PUNICODE_STRING Name);
539 #endif
540 
541 #define RxWaitForStableNetFcb(F, R) RxWaitForStableCondition(&(F)->Condition, &(F)->NonPaged->TransitionWaitList, (R), NULL )
542 #define RxTransitionNetFcb(F, C) RxUpdateCondition((C), &(F)->Condition, &(F)->NonPaged->TransitionWaitList)
543 
544 #define RxFormInitPacket(IP, I1, I1a, I2, I3, I4a, I4b, I5, I6, I7) ( \
545     IP.pAttributes = I1, IP.pNumLinks = I1a,                          \
546     IP.pCreationTime = I2, IP.pLastAccessTime = I3,                   \
547     IP.pLastWriteTime = I4a, IP.pLastChangeTime = I4b,                \
548     IP.pAllocationSize = I5, IP.pFileSize = I6,                       \
549     IP.pValidDataLength = I7, &IP)
550 
551 #if DBG
552 #define ASSERT_CORRECT_FCB_STRUCTURE_DBG_ONLY(Fcb) \
553 {                                                  \
554     ASSERT(Fcb->NonPaged == Fcb->CopyOfNonPaged);  \
555     ASSERT(Fcb->NonPaged->FcbBackPointer == Fcb);  \
556 }
557 #else
558 #define ASSERT_CORRECT_FCB_STRUCTURE_DBG_ONLY(Fcb)
559 #endif
560 
561 #define ASSERT_CORRECT_FCB_STRUCTURE(Fcb)                      \
562 {                                                              \
563     ASSERT(NodeTypeIsFcb(Fcb));                                \
564     ASSERT(Fcb->NonPaged != NULL );                            \
565     ASSERT(NodeType(Fcb->NonPaged) == RDBSS_NTC_NONPAGED_FCB); \
566     ASSERT_CORRECT_FCB_STRUCTURE_DBG_ONLY(Fcb);                \
567 }
568 
569 VOID
570 NTAPI
571 RxFinishFcbInitialization(
572     _In_ OUT PMRX_FCB Fcb,
573     _In_ RX_FILE_TYPE FileType,
574     _In_opt_ PFCB_INIT_PACKET InitPacket);
575 
576 #define RxWaitForStableSrvOpen(S, R) RxWaitForStableCondition(&(S)->Condition, &(S)->TransitionWaitList, (R), NULL)
577 #define RxTransitionSrvOpen(S, C) RxUpdateCondition((C), &(S)->Condition, &(S)->TransitionWaitList)
578 
579 VOID
580 RxRemoveNameNetFcb(
581     _Out_ PFCB ThisFcb);
582 
583 LONG
584 RxpReferenceNetFcb(
585    _In_ PFCB Fcb);
586 
587 LONG
588 RxpDereferenceNetFcb(
589    _In_ PFCB Fcb);
590 
591 BOOLEAN
592 RxpDereferenceAndFinalizeNetFcb(
593     _Out_ PFCB ThisFcb,
594     _In_ PRX_CONTEXT RxContext,
595     _In_ BOOLEAN RecursiveFinalize,
596     _In_ BOOLEAN ForceFinalize);
597 
598 PSRV_OPEN
599 RxCreateSrvOpen(
600     _In_ PV_NET_ROOT VNetRoot,
601     _In_ OUT PFCB Fcb);
602 
603 BOOLEAN
604 RxFinalizeSrvOpen(
605     _Out_ PSRV_OPEN ThisSrvOpen,
606     _In_ BOOLEAN RecursiveFinalize,
607     _In_ BOOLEAN ForceFinalize);
608 
609 FORCEINLINE
610 PUNICODE_STRING
611 GET_ALREADY_PREFIXED_NAME(
612     PMRX_SRV_OPEN SrvOpen,
613     PMRX_FCB Fcb)
614 {
615     PFCB ThisFcb = (PFCB)Fcb;
616 
617 #if DBG
618     if (SrvOpen != NULL)
619     {
620         ASSERT(NodeType(SrvOpen) == RDBSS_NTC_SRVOPEN);
621         ASSERT(ThisFcb != NULL);
622         ASSERT(NodeTypeIsFcb(Fcb));
623         ASSERT(SrvOpen->pFcb == Fcb);
624         ASSERT(SrvOpen->pAlreadyPrefixedName == &ThisFcb->PrivateAlreadyPrefixedName);
625     }
626 #endif
627 
628     return &ThisFcb->PrivateAlreadyPrefixedName;
629 }
630 #define GET_ALREADY_PREFIXED_NAME_FROM_CONTEXT(Rxcontext) GET_ALREADY_PREFIXED_NAME((Rxcontext)->pRelevantSrvOpen, (Rxcontext)->pFcb)
631 
632 PMRX_FOBX
633 NTAPI
634 RxCreateNetFobx(
635     _Out_ PRX_CONTEXT RxContext,
636     _In_ PMRX_SRV_OPEN MrxSrvOpen);
637 
638 BOOLEAN
639 RxFinalizeNetFobx(
640     _Out_ PFOBX ThisFobx,
641     _In_ BOOLEAN RecursiveFinalize,
642     _In_ BOOLEAN ForceFinalize);
643 
644 #ifdef __REACTOS__
645 #define FILL_IN_FCB(Fcb, a, nl, ct, lat, lwt, lct, as, fs, vdl)  \
646     (Fcb)->Attributes = a;                                       \
647     (Fcb)->NumberOfLinks = nl;                                   \
648     (Fcb)->CreationTime.QuadPart = ct;                           \
649     (Fcb)->LastAccessTime.QuadPart = lat;                        \
650     (Fcb)->LastWriteTime.QuadPart = lwt;                         \
651     (Fcb)->LastChangeTime.QuadPart = lct;                        \
652     (Fcb)->ActualAllocationLength = as;                          \
653     (Fcb)->Header.AllocationSize.QuadPart = as;                  \
654     (Fcb)->Header.FileSize.QuadPart = fs;                        \
655     (Fcb)->Header.ValidDataLength.QuadPart = vdl;                \
656     SetFlag((Fcb)->FcbState, FCB_STATE_TIME_AND_SIZE_ALREADY_SET)
657 
658 #define TRACKER_ACQUIRE_FCB 0x61616161
659 #define TRACKER_RELEASE_FCB_NO_BUFF_PENDING 0x72727272
660 #define TRACKER_RELEASE_NON_EXCL_FCB_BUFF_PENDING 0x72727230
661 #define TRACKER_RELEASE_EXCL_FCB_BUFF_PENDING 0x72727231
662 #define TRACKER_RELEASE_FCB_FOR_THRD_NO_BUFF_PENDING 0x72727474
663 #define TRACKER_RELEASE_NON_EXCL_FCB_FOR_THRD_BUFF_PENDING 0x72727430
664 #define TRACKER_RELEASE_EXCL_FCB_FOR_THRD_BUFF_PENDING 0x72727431
665 #define TRACKER_FCB_FREE 0x72724372
666 
667 #define FCB_STATE_BUFFERING_STATE_WITH_NO_SHARES \
668     (( FCB_STATE_WRITECACHING_ENABLED            \
669     | FCB_STATE_WRITEBUFFERING_ENABLED           \
670     | FCB_STATE_READCACHING_ENABLED              \
671     | FCB_STATE_READBUFFERING_ENABLED            \
672     | FCB_STATE_LOCK_BUFFERING_ENABLED           \
673     | FCB_STATE_FILESIZECACHEING_ENABLED         \
674     | FCB_STATE_FILETIMECACHEING_ENABLED))
675 
676 #endif
677 
678 #endif
679