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