xref: /reactos/sdk/include/ddk/buffring.h (revision 53221834)
1 #ifndef __BUFFRING_H__
2 #define __BUFFRING_H__
3 
4 #define RX_REQUEST_PREPARED_FOR_HANDLING 0x10000000
5 
6 typedef struct _CHANGE_BUFFERING_STATE_REQUEST_
7 {
8     LIST_ENTRY ListEntry;
9     ULONG Flags;
10 #if (_WIN32_WINNT < 0x0600)
11     PSRV_CALL pSrvCall;
12 #endif
13     PSRV_OPEN SrvOpen;
14     PVOID SrvOpenKey;
15     PVOID MRxContext;
16 } CHANGE_BUFFERING_STATE_REQUEST, *PCHANGE_BUFFERING_STATE_REQUEST;
17 
18 typedef struct _RX_BUFFERING_MANAGER_
19 {
20     BOOLEAN DispatcherActive;
21     BOOLEAN HandlerInactive;
22     BOOLEAN LastChanceHandlerActive;
23     UCHAR Pad;
24     KSPIN_LOCK SpinLock;
25     volatile LONG CumulativeNumberOfBufferingChangeRequests;
26     LONG NumberOfUnhandledRequests;
27     LONG NumberOfUndispatchedRequests;
28     volatile LONG NumberOfOutstandingOpens;
29     LIST_ENTRY DispatcherList;
30     LIST_ENTRY HandlerList;
31     LIST_ENTRY LastChanceHandlerList;
32     RX_WORK_QUEUE_ITEM DispatcherWorkItem;
33     RX_WORK_QUEUE_ITEM HandlerWorkItem;
34     RX_WORK_QUEUE_ITEM LastChanceHandlerWorkItem;
35     FAST_MUTEX Mutex;
36     LIST_ENTRY SrvOpenLists[1];
37 } RX_BUFFERING_MANAGER, *PRX_BUFFERING_MANAGER;
38 
39 #if (_WIN32_WINNT >= 0x0600)
40 #define RxAcquireBufferingManagerMutex(BufMan) ExAcquireFastMutex(&(BufMan)->Mutex)
41 #else
42 #define RxAcquireBufferingManagerMutex(BufMan)          \
43     {                                                   \
44         if (!ExTryToAcquireFastMutex(&(BufMan)->Mutex)) \
45         {                                               \
46             ExAcquireFastMutex(&(BufMan)->Mutex);       \
47         }                                               \
48     }
49 #endif
50 #define RxReleaseBufferingManagerMutex(BufMan) ExReleaseFastMutex(&(BufMan)->Mutex)
51 
52 VOID
53 RxpProcessChangeBufferingStateRequests(
54     PSRV_CALL SrvCall,
55     BOOLEAN UpdateHandlerState);
56 
57 VOID
58 NTAPI
59 RxProcessChangeBufferingStateRequests(
60     _In_ PVOID SrvCall);
61 
62 VOID
63 RxProcessFcbChangeBufferingStateRequest(
64     _In_ PFCB Fcb);
65 
66 VOID
67 RxPurgeChangeBufferingStateRequestsForSrvOpen(
68     _In_ PSRV_OPEN SrvOpen);
69 
70 VOID
71 RxCompleteSrvOpenKeyAssociation(
72     _Inout_ PSRV_OPEN SrvOpen);
73 
74 VOID
75 RxInitiateSrvOpenKeyAssociation(
76    _Inout_ PSRV_OPEN SrvOpen);
77 
78 NTSTATUS
79 RxInitializeBufferingManager(
80    _In_ PSRV_CALL SrvCall);
81 
82 NTSTATUS
83 RxTearDownBufferingManager(
84    _In_ PSRV_CALL SrvCall);
85 
86 NTSTATUS
87 RxFlushFcbInSystemCache(
88     _In_ PFCB Fcb,
89     _In_ BOOLEAN SynchronizeWithLazyWriter);
90 
91 NTSTATUS
92 RxPurgeFcbInSystemCache(
93     _In_ PFCB Fcb,
94     _In_ PLARGE_INTEGER FileOffset OPTIONAL,
95     _In_ ULONG Length,
96     _In_ BOOLEAN UninitializeCacheMaps,
97     _In_ BOOLEAN FlushFile);
98 
99 #endif
100