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