ReactOS 0.4.16-dev-306-g647d351
filtrctx.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for filtrctx.c:

Go to the source code of this file.

Classes

struct  _FILE_OBJECT_FILTER_CONTEXTS
 

Macros

#define NDEBUG
 

Typedefs

typedef struct _FILE_OBJECT_FILTER_CONTEXTS FILE_OBJECT_FILTER_CONTEXTS
 
typedef struct _FILE_OBJECT_FILTER_CONTEXTSPFILE_OBJECT_FILTER_CONTEXTS
 

Functions

VOID NTAPI FsRtlPTeardownPerFileObjectContexts (IN PFILE_OBJECT FileObject)
 
LOGICAL NTAPI FsRtlIsPagingFile (IN PFILE_OBJECT FileObject)
 
PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlLookupPerFileObjectContext (IN PFILE_OBJECT FileObject, IN PVOID OwnerId OPTIONAL, IN PVOID InstanceId OPTIONAL)
 
PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlLookupPerStreamContextInternal (IN PFSRTL_ADVANCED_FCB_HEADER AdvFcbHeader, IN PVOID OwnerId OPTIONAL, IN PVOID InstanceId OPTIONAL)
 
NTSTATUS NTAPI FsRtlInsertPerFileObjectContext (IN PFILE_OBJECT FileObject, IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr)
 
NTSTATUS NTAPI FsRtlInsertPerStreamContext (IN PFSRTL_ADVANCED_FCB_HEADER AdvFcbHeader, IN PFSRTL_PER_STREAM_CONTEXT PerStreamContext)
 
PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlRemovePerFileObjectContext (IN PFILE_OBJECT FileObject, IN PVOID OwnerId OPTIONAL, IN PVOID InstanceId OPTIONAL)
 
PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlRemovePerStreamContext (IN PFSRTL_ADVANCED_FCB_HEADER AdvFcbHeader, IN PVOID OwnerId OPTIONAL, IN PVOID InstanceId OPTIONAL)
 
VOID NTAPI FsRtlTeardownPerStreamContexts (IN PFSRTL_ADVANCED_FCB_HEADER AdvFcbHeader)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file filtrctx.c.

Typedef Documentation

◆ FILE_OBJECT_FILTER_CONTEXTS

◆ PFILE_OBJECT_FILTER_CONTEXTS

Function Documentation

◆ FsRtlInsertPerFileObjectContext()

NTSTATUS NTAPI FsRtlInsertPerFileObjectContext ( IN PFILE_OBJECT  FileObject,
IN PFSRTL_PER_FILEOBJECT_CONTEXT  Ptr 
)

Definition at line 175 of file filtrctx.c.

177{
180
181 if (!FileObject)
182 {
184 }
185
187 {
189 }
190
191 /* Get filter contexts */
193 if (!FOContext)
194 {
195 /* If there's none, allocate new structure */
197 if (!FOContext)
198 {
200 }
201
202 /* Initialize it */
204 InitializeListHead(&(FOContext->FilterContexts));
205
206 /* Set it */
208 if (!NT_SUCCESS(Status))
209 {
210 /* If it fails, it means that someone else has set it in the meanwhile */
211 ExFreePoolWithTag(FOContext, 'FOCX');
212
213 /* So, we can get it */
215 if (!FOContext)
216 {
217 /* If we fall down here, something went very bad. This shouldn't happen */
218 ASSERT(FALSE);
219 return STATUS_UNSUCCESSFUL;
220 }
221 }
222 }
223
224 /* Finally, insert */
226 InsertHeadList(&(FOContext->FilterContexts), &(Ptr->Links));
228
229 return STATUS_SUCCESS;
230}
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
Status
Definition: gdiplustypes.h:25
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
Definition: fmutex.c:23
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
Definition: fmutex.c:31
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define FO_FILE_OBJECT_HAS_EXTENSION
Definition: iotypes.h:144
NTSTATUS NTAPI IoChangeFileObjectFilterContext(IN PFILE_OBJECT FileObject, IN PVOID FilterContext, IN BOOLEAN Define)
Definition: file.c:2511
PVOID NTAPI IoGetFileObjectFilterContext(IN PFILE_OBJECT FileObject)
Definition: file.c:2496
#define STATUS_SUCCESS
Definition: shellext.h:65
FAST_MUTEX FilterContextsMutex
Definition: filtrctx.c:19
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274

◆ FsRtlInsertPerStreamContext()

NTSTATUS NTAPI FsRtlInsertPerStreamContext ( IN PFSRTL_ADVANCED_FCB_HEADER  AdvFcbHeader,
IN PFSRTL_PER_STREAM_CONTEXT  PerStreamContext 
)

Definition at line 237 of file filtrctx.c.

239{
240 if (!(AdvFcbHeader) || !(AdvFcbHeader->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS))
241 {
243 }
244
245 ExAcquireFastMutex(AdvFcbHeader->FastMutex);
246 InsertHeadList(&(AdvFcbHeader->FilterContexts), &(PerStreamContext->Links));
247 ExReleaseFastMutex(AdvFcbHeader->FastMutex);
248 return STATUS_SUCCESS;
249}
#define FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS
Definition: fsrtltypes.h:55

◆ FsRtlIsPagingFile()

LOGICAL NTAPI FsRtlIsPagingFile ( IN PFILE_OBJECT  FileObject)

Definition at line 64 of file filtrctx.c.

65{
67}
BOOLEAN NTAPI MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject)
Definition: pagefile.c:119

◆ FsRtlLookupPerFileObjectContext()

PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlLookupPerFileObjectContext ( IN PFILE_OBJECT  FileObject,
IN PVOID OwnerId  OPTIONAL,
IN PVOID InstanceId  OPTIONAL 
)

Definition at line 74 of file filtrctx.c.

77{
78 PLIST_ENTRY NextEntry;
80 PFSRTL_PER_FILEOBJECT_CONTEXT TmpPerFOContext, PerFOContext = NULL;
81
83 {
84 return NULL;
85 }
86
88
89 /* If list is empty, no need to browse it */
90 if (!IsListEmpty(&(FOContext->FilterContexts)))
91 {
92 for (NextEntry = FOContext->FilterContexts.Flink;
93 NextEntry != &(FOContext->FilterContexts);
94 NextEntry = NextEntry->Flink)
95 {
96 /* If we don't have any criteria for search, first entry will be enough */
97 if (!OwnerId && !InstanceId)
98 {
99 PerFOContext = (PFSRTL_PER_FILEOBJECT_CONTEXT)NextEntry;
100 break;
101 }
102 /* Else, we've to find something that matches with the parameters. */
103 else
104 {
105 TmpPerFOContext = CONTAINING_RECORD(NextEntry, FSRTL_PER_FILEOBJECT_CONTEXT, Links);
106 if ((InstanceId && TmpPerFOContext->InstanceId == InstanceId && TmpPerFOContext->OwnerId == OwnerId) ||
107 (OwnerId && TmpPerFOContext->OwnerId == OwnerId))
108 {
109 PerFOContext = TmpPerFOContext;
110 break;
111 }
112 }
113 }
114 }
115
117
118 return PerFOContext;
119}
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
Definition: fsrtlfuncs.h:908
_Must_inspect_result_ _In_opt_ PVOID OwnerId
Definition: fsrtlfuncs.h:907
struct _FSRTL_PER_FILEOBJECT_CONTEXT * PFSRTL_PER_FILEOBJECT_CONTEXT
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

◆ FsRtlLookupPerStreamContextInternal()

PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlLookupPerStreamContextInternal ( IN PFSRTL_ADVANCED_FCB_HEADER  AdvFcbHeader,
IN PVOID OwnerId  OPTIONAL,
IN PVOID InstanceId  OPTIONAL 
)

Definition at line 126 of file filtrctx.c.

129{
130 PLIST_ENTRY NextEntry;
131 PFSRTL_PER_STREAM_CONTEXT TmpPerStreamContext, PerStreamContext = NULL;
132
133 ASSERT(AdvFcbHeader);
134 ASSERT(FlagOn(AdvFcbHeader->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS));
135
136 ExAcquireFastMutex(AdvFcbHeader->FastMutex);
137
138 /* If list is empty, no need to browse it */
139 if (!IsListEmpty(&(AdvFcbHeader->FilterContexts)))
140 {
141 for (NextEntry = AdvFcbHeader->FilterContexts.Flink;
142 NextEntry != &(AdvFcbHeader->FilterContexts);
143 NextEntry = NextEntry->Flink)
144 {
145 /* If we don't have any criteria for search, first entry will be enough */
146 if (!OwnerId && !InstanceId)
147 {
148 PerStreamContext = (PFSRTL_PER_STREAM_CONTEXT)NextEntry;
149 break;
150 }
151 /* Else, we've to find something that matches with the parameters. */
152 else
153 {
154 TmpPerStreamContext = CONTAINING_RECORD(NextEntry, FSRTL_PER_STREAM_CONTEXT, Links);
155 if ((InstanceId && TmpPerStreamContext->InstanceId == InstanceId && TmpPerStreamContext->OwnerId == OwnerId) ||
156 (OwnerId && TmpPerStreamContext->OwnerId == OwnerId))
157 {
158 PerStreamContext = TmpPerStreamContext;
159 break;
160 }
161 }
162 }
163 }
164
165 ExReleaseFastMutex(AdvFcbHeader->FastMutex);
166
167 return PerStreamContext;
168}
#define FlagOn(_F, _SF)
Definition: ext2fs.h:179
struct _FSRTL_PER_STREAM_CONTEXT * PFSRTL_PER_STREAM_CONTEXT

◆ FsRtlPTeardownPerFileObjectContexts()

VOID NTAPI FsRtlPTeardownPerFileObjectContexts ( IN PFILE_OBJECT  FileObject)

Definition at line 28 of file filtrctx.c.

29{
31
33
34 if (!(FOContext = IoGetFileObjectFilterContext(FileObject)))
35 {
36 return;
37 }
38
40 ASSERT(IsListEmpty(&(FOContext->FilterContexts)));
41
42 ExFreePoolWithTag(FOContext, 'FOCX');
43}

Referenced by IopDeleteFile().

◆ FsRtlRemovePerFileObjectContext()

PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlRemovePerFileObjectContext ( IN PFILE_OBJECT  FileObject,
IN PVOID OwnerId  OPTIONAL,
IN PVOID InstanceId  OPTIONAL 
)

Definition at line 256 of file filtrctx.c.

259{
260 PLIST_ENTRY NextEntry;
262 PFSRTL_PER_FILEOBJECT_CONTEXT TmpPerFOContext, PerFOContext = NULL;
263
264 if (!FileObject || !(FOContext = IoGetFileObjectFilterContext(FileObject)))
265 {
266 return NULL;
267 }
268
270
271 /* If list is empty, no need to browse it */
272 if (!IsListEmpty(&(FOContext->FilterContexts)))
273 {
274 for (NextEntry = FOContext->FilterContexts.Flink;
275 NextEntry != &(FOContext->FilterContexts);
276 NextEntry = NextEntry->Flink)
277 {
278 /* If we don't have any criteria for search, first entry will be enough */
279 if (!OwnerId && !InstanceId)
280 {
281 PerFOContext = (PFSRTL_PER_FILEOBJECT_CONTEXT)NextEntry;
282 break;
283 }
284 /* Else, we've to find something that matches with the parameters. */
285 else
286 {
287 TmpPerFOContext = CONTAINING_RECORD(NextEntry, FSRTL_PER_FILEOBJECT_CONTEXT, Links);
288 if ((InstanceId && TmpPerFOContext->InstanceId == InstanceId && TmpPerFOContext->OwnerId == OwnerId) ||
289 (OwnerId && TmpPerFOContext->OwnerId == OwnerId))
290 {
291 PerFOContext = TmpPerFOContext;
292 break;
293 }
294 }
295 }
296
297 /* Finally remove entry from list */
298 if (PerFOContext)
299 {
300 RemoveEntryList(&(PerFOContext->Links));
301 }
302 }
303
305
306 return PerFOContext;
307}
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986

◆ FsRtlRemovePerStreamContext()

PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlRemovePerStreamContext ( IN PFSRTL_ADVANCED_FCB_HEADER  AdvFcbHeader,
IN PVOID OwnerId  OPTIONAL,
IN PVOID InstanceId  OPTIONAL 
)

Definition at line 314 of file filtrctx.c.

317{
318 PLIST_ENTRY NextEntry;
319 PFSRTL_PER_STREAM_CONTEXT TmpPerStreamContext, PerStreamContext = NULL;
320
321 if (!(AdvFcbHeader) || !(AdvFcbHeader->Flags2 & FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS))
322 {
323 return NULL;
324 }
325
326 ExAcquireFastMutex(AdvFcbHeader->FastMutex);
327 /* If list is empty, no need to browse it */
328 if (!IsListEmpty(&(AdvFcbHeader->FilterContexts)))
329 {
330 for (NextEntry = AdvFcbHeader->FilterContexts.Flink;
331 NextEntry != &(AdvFcbHeader->FilterContexts);
332 NextEntry = NextEntry->Flink)
333 {
334 /* If we don't have any criteria for search, first entry will be enough */
335 if (!OwnerId && !InstanceId)
336 {
337 PerStreamContext = (PFSRTL_PER_STREAM_CONTEXT)NextEntry;
338 break;
339 }
340 /* Else, we've to find something that matches with the parameters. */
341 else
342 {
343 TmpPerStreamContext = CONTAINING_RECORD(NextEntry, FSRTL_PER_STREAM_CONTEXT, Links);
344 if ((InstanceId && TmpPerStreamContext->InstanceId == InstanceId && TmpPerStreamContext->OwnerId == OwnerId) ||
345 (OwnerId && TmpPerStreamContext->OwnerId == OwnerId))
346 {
347 PerStreamContext = TmpPerStreamContext;
348 break;
349 }
350 }
351 }
352
353 /* Finally remove entry from list */
354 if (PerStreamContext)
355 {
356 RemoveEntryList(&(PerStreamContext->Links));
357 }
358 }
359 ExReleaseFastMutex(AdvFcbHeader->FastMutex);
360
361 return PerStreamContext;
362
363}

◆ FsRtlTeardownPerStreamContexts()

VOID NTAPI FsRtlTeardownPerStreamContexts ( IN PFSRTL_ADVANCED_FCB_HEADER  AdvFcbHeader)

Definition at line 370 of file filtrctx.c.

371{
372 PLIST_ENTRY NextEntry;
373 volatile BOOLEAN IsMutexLocked = FALSE;
374 PFSRTL_PER_STREAM_CONTEXT PerStreamContext;
375
377 {
378 /* Acquire mutex to deal with the list */
379 ExAcquireFastMutex(AdvFcbHeader->FastMutex);
380 IsMutexLocked = TRUE;
381
382 /* While there are items... */
383 while (!IsListEmpty(&(AdvFcbHeader->FilterContexts)))
384 {
385 /* ...remove one */
386 NextEntry = RemoveHeadList(&(AdvFcbHeader->FilterContexts));
387 PerStreamContext = CONTAINING_RECORD(NextEntry, FSRTL_PER_STREAM_CONTEXT, Links);
388
389 /* Release mutex before calling callback */
390 ExReleaseFastMutex(AdvFcbHeader->FastMutex);
391 IsMutexLocked = FALSE;
392
393 /* Call the callback */
394 ASSERT(PerStreamContext->FreeCallback);
395 (*PerStreamContext->FreeCallback)(PerStreamContext);
396
397 /* Relock the list to continue */
398 ExAcquireFastMutex(AdvFcbHeader->FastMutex);
399 IsMutexLocked = TRUE;
400 }
401 }
403 {
404 /* If mutex was locked, release */
405 if (IsMutexLocked)
406 {
407 ExReleaseFastMutex(AdvFcbHeader->FastMutex);
408 }
409 }
410 _SEH2_END;
411}
unsigned char BOOLEAN
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define _SEH2_FINALLY
Definition: pseh2_64.h:114
#define _SEH2_END
Definition: pseh2_64.h:155
#define _SEH2_TRY
Definition: pseh2_64.h:55
PFREE_FUNCTION FreeCallback
Definition: fsrtltypes.h:164

Referenced by CdDeleteFcb(), Ext2FreeFcb(), FatDeleteFcb(), FatTearDownVcb(), and RxFreeFcbObject().