32 _In_ PFLT_CONTEXT Context,
33 _In_ FLT_CONTEXT_TYPE ContextType
38 _In_ PFLT_CONTEXT Context,
39 _In_ FLT_CONTEXT_TYPE ContextType
44 #pragma alloc_text(PAGE, CgCreateFileContext) 45 #pragma alloc_text(PAGE, CgFindOrCreateFileContext) 46 #pragma alloc_text(PAGE, CgFindOrCreateTransactionContext) 47 #pragma alloc_text(PAGE, CgFileContextCleanup) 48 #pragma alloc_text(PAGE, CgTransactionContextCleanup) 63 { FLT_TRANSACTION_CONTEXT,
75 _In_ PFLT_CONTEXT Context,
76 _In_ FLT_CONTEXT_TYPE ContextType
105 FLT_ASSERTMSG(
"[CG]: File context is not supposed to be in the transaction context list at cleanup.!\n",
109 (
"[CG]: Cleaning up file context for file ID %I64x,%I64x (FileContext = %p), dirty = %d\n",
113 fileContext->
Dirty) );
116 (
"[CG]: File context cleanup complete.\n") );
123 _In_ PFLT_CONTEXT Context,
124 _In_ FLT_CONTEXT_TYPE ContextType
152 (
"[CG]: CgTransactionContextCleanup context cleanup entered.\n") );
156 ObDereferenceObject( transactionContext->
Transaction );
188 NTSTATUS status = STATUS_SUCCESS;
189 FLT_FILESYSTEM_TYPE type;
195 status = FltGetFileSystemType( Instance, &type );
197 if (NT_SUCCESS( status )) {
199 if (type == FLT_FSTYPE_REFS) {
201 FILE_ID_INFORMATION fileIdInformation;
203 status = FltQueryInformationFile( Instance,
206 sizeof(FILE_ID_INFORMATION),
210 if (NT_SUCCESS( status )) {
212 RtlCopyMemory(&FileId->FileId128, &fileIdInformation.FileId,
sizeof(FileId->FileId128) );
217 FILE_INTERNAL_INFORMATION fileInternalInformation;
219 status = FltQueryInformationFile( Instance,
221 &fileInternalInformation,
222 sizeof(FILE_INTERNAL_INFORMATION),
223 FileInternalInformation,
226 if (NT_SUCCESS( status )) {
228 FileId->FileId64.Value = fileInternalInformation.IndexNumber.QuadPart;
229 FileId->FileId64.UpperZeroes = 0LL;
239 _In_ PFLT_CALLBACK_DATA Cbd,
275 (
"[CG]: Trying to get file context (FileObject = %p, Instance = %p, rq = %d)\n",
276 Cbd->Iopb->TargetFileObject,
277 Cbd->Iopb->TargetInstance,
278 Cbd->Iopb->MajorFunction) );
280 status = FltGetFileContext( Cbd->Iopb->TargetInstance,
281 Cbd->Iopb->TargetFileObject,
290 if (status == STATUS_NOT_FOUND) {
295 Cbd->Iopb->TargetFileObject,
298 if (!NT_SUCCESS( status )) {
301 (
"[CG]: Failed to get file id with status 0x%x. (FileObject = %p, Instance = %p, rq = %d)\n",
303 Cbd->Iopb->TargetFileObject,
304 Cbd->Iopb->TargetInstance,
305 Cbd->Iopb->MajorFunction) );
317 if (!NT_SUCCESS( status )) {
320 (
"[CG]: Failed to create file context with status 0x%x. (FileObject = %p, Instance = %p)\n",
322 Cbd->Iopb->TargetFileObject,
323 Cbd->Iopb->TargetInstance) );
339 (
"[CG]: Setting file context %p (FileObject = %p, Instance = %p)\n",
341 Cbd->Iopb->TargetFileObject,
342 Cbd->Iopb->TargetInstance) );
344 status = FltSetFileContext( Cbd->Iopb->TargetInstance,
345 Cbd->Iopb->TargetFileObject,
346 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
350 if (!NT_SUCCESS( status )) {
353 (
"[CG]: Failed to set file context with status 0x%x. (FileObject = %p, Instance = %p, rq = %d)\n",
355 Cbd->Iopb->TargetFileObject,
356 Cbd->Iopb->TargetInstance,
357 Cbd->Iopb->MajorFunction) );
367 (
"[CG]: Releasing file context %p (FileObject = %p, Instance = %p)\n",
369 Cbd->Iopb->TargetFileObject,
370 Cbd->Iopb->TargetInstance) );
372 FltReleaseContext( fileContext );
374 if (status != STATUS_FLT_CONTEXT_ALREADY_DEFINED) {
383 (
"[CG]: Failed to set file context with status 0x%x != STATUS_FLT_CONTEXT_ALREADY_DEFINED. (FileObject = %p, Instance = %p)\n",
385 Cbd->Iopb->TargetFileObject,
386 Cbd->Iopb->TargetInstance) );
397 (
"[CG]: Race: File context already defined. Retaining old file context %p (FileObject = %p, Instance = %p)\n",
399 Cbd->Iopb->TargetFileObject,
400 Cbd->Iopb->TargetInstance) );
407 fileContext = oldFileContext;
408 status = STATUS_SUCCESS;
413 *FileContext = fileContext;
449 (
"[CG]: Allocating file context \n") );
457 if (!NT_SUCCESS( status )) {
460 (
"[CG]: Failed to allocate file context with status 0x%x \n",
470 *FileContext = fileContext;
472 return STATUS_SUCCESS;
477 _In_ PCFLT_RELATED_OBJECTS FltObjects,
503 PFAST_MUTEX pFastMutex =
NULL;
508 (
"[CG]: CgFindOrCreateTransactionContext entered. \n") );
510 FLT_ASSERTMSG(
"[CG]: Transaction object pointer is not supposed to be NULL !\n", FltObjects->Transaction !=
NULL);
512 status = FltGetTransactionContext( FltObjects->Instance,
513 FltObjects->Transaction,
514 &transactionContext );
516 if (NT_SUCCESS( status )) {
518 *TransactionContext = transactionContext;
519 return STATUS_SUCCESS;
522 if (status != STATUS_NOT_FOUND) {
525 (
"[CG]: Failed to get transaction context with status 0x%x \n",
536 if (
NULL == pFastMutex ) {
538 return STATUS_INSUFFICIENT_RESOURCES;
546 FLT_TRANSACTION_CONTEXT,
549 &transactionContext );
551 if (!NT_SUCCESS( status )) {
554 (
"[CG]: Failed to allocate transaction context with status 0x%x \n",
561 FLT_ASSERTMSG(
"[CG]: Transaction object pointer is not supposed to be NULL !\n", FltObjects->Transaction !=
NULL);
570 transactionContext->
Mutex = pFastMutex;
571 ObReferenceObject( FltObjects->Transaction );
572 transactionContext->
Transaction = FltObjects->Transaction;
573 InitializeListHead( &transactionContext->
ScListHead );
574 ExInitializeFastMutex( transactionContext->
Mutex );
576 status = FltSetTransactionContext( FltObjects->Instance,
577 FltObjects->Transaction,
578 FLT_SET_CONTEXT_KEEP_IF_EXISTS,
580 &oldTransactionContext );
582 if (NT_SUCCESS( status )) {
584 *TransactionContext = transactionContext;
585 return STATUS_SUCCESS;
589 FltReleaseContext( transactionContext );
591 if (status != STATUS_FLT_CONTEXT_ALREADY_DEFINED) {
594 (
"[CG]: Failed to set transaction context with status 0x%x \n",
600 FLT_ASSERTMSG(
"[CG]: if FltSetTransactionContext returns STATUS_FLT_CONTEXT_ALREADY_DEFINED, the pointer should not be NULL.\n",
601 oldTransactionContext !=
NULL);
603 *TransactionContext = oldTransactionContext;
606 return STATUS_SUCCESS;
#define CG_FILE_CONTEXT_TAG
PFLT_FILTER gFilterInstance
#define CG_TRANSACTION_CONTEXT_TAG
#define CG_DBG_PRINT(_dbgLevel, _string)
NTSTATUS CgFindOrCreateFileContext(_In_ PFLT_CALLBACK_DATA Cbd, _Outptr_ PCG_FILE_CONTEXT *FileContext)
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
PKTRANSACTION Transaction
_In_opt_ PFILE_OBJECT _In_opt_ PFLT_INSTANCE Instance
const FLT_CONTEXT_REGISTRATION ContextRegistration[]
FORCEINLINE VOID CgFreeMutex(_In_ PFAST_MUTEX Mutex)
#define CGDBG_TRACE_ROUTINES
VOID CgFileContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
#define CGDBG_TRACE_DEBUG
struct _CG_FILE_CONTEXT * PCG_FILE_CONTEXT
UNREFERENCED_PARAMETER(FileObject)
NTSTATUS CgGetFileId(_In_ PFLT_INSTANCE Instance, _In_ PFILE_OBJECT FileObject, _Out_ PCG_FILE_REFERENCE FileId)
NcLoadRegistryStringRetry NULL
VOID CgTransactionContextCleanup(_In_ PFLT_CONTEXT Context, _In_ FLT_CONTEXT_TYPE ContextType)
FORCEINLINE PFAST_MUTEX CgAllocateMutex(VOID)
#define CGDBG_TRACE_ERROR
#define CG_FILE_CONTEXT_SIZE
#define CG_TRANSACTION_CONTEXT_SIZE
PCG_TRANSACTION_CONTEXT TxContext
NTSTATUS CgFindOrCreateTransactionContext(_In_ PCFLT_RELATED_OBJECTS FltObjects, _Outptr_ PCG_TRANSACTION_CONTEXT *TransactionContext)
struct _CG_FILE_REFERENCE::@3 FileId64
struct _CG_TRANSACTION_CONTEXT * PCG_TRANSACTION_CONTEXT
_In_opt_ PFILE_OBJECT FileObject
NTSTATUS CgCreateFileContext(_Outptr_ PCG_FILE_CONTEXT *FileContext)