https://git.reactos.org/?p=reactos.git;a=commitdiff;h=bc2378a3560a384c47d2a4c83886531ad8f0af90

commit bc2378a3560a384c47d2a4c83886531ad8f0af90
Author: David Quintana <gigah...@gmail.com>
AuthorDate: Fri Nov 24 17:27:46 2017 +0100

    [CDFS_NEW] Use CdAcquireForCreateSection from the old driver in place of 
the newer CdFilterCallbackAcquireForCreateSection.
---
 drivers/filesystems/cdfs_new/cdinit.c   |  6 ++++
 drivers/filesystems/cdfs_new/cdprocs.h  |  8 +++++
 drivers/filesystems/cdfs_new/resrcsup.c | 54 +++++++++++++++++++++++++++++++++
 3 files changed, 68 insertions(+)

diff --git a/drivers/filesystems/cdfs_new/cdinit.c 
b/drivers/filesystems/cdfs_new/cdinit.c
index 871419ac57..d9c96db04f 100755
--- a/drivers/filesystems/cdfs_new/cdinit.c
+++ b/drivers/filesystems/cdfs_new/cdinit.c
@@ -191,7 +191,9 @@ Return Value:
                    sizeof(FS_FILTER_CALLBACKS) );
 
     FilterCallbacks.SizeOfFsFilterCallbacks = sizeof(FS_FILTER_CALLBACKS);
+#ifndef __REACTOS__
     FilterCallbacks.PreAcquireForSectionSynchronization = 
CdFilterCallbackAcquireForCreateSection;
+#endif
 
     Status = FsRtlRegisterFileSystemFilterCallbacks( DriverObject,
                                                      &FilterCallbacks );
@@ -357,11 +359,15 @@ Return Value:
     CdFastIoDispatch.FastIoUnlockSingle =      CdFastUnlockSingle;       //  
UnlockSingle
     CdFastIoDispatch.FastIoUnlockAll =         CdFastUnlockAll;          //  
UnlockAll
     CdFastIoDispatch.FastIoUnlockAllByKey =    CdFastUnlockAllByKey;     //  
UnlockAllByKey
+#ifndef __REACTOS__
     //
     //  This callback has been replaced by 
CdFilterCallbackAcquireForCreateSection.
     //
 
     CdFastIoDispatch.AcquireFileForNtCreateSection =  NULL;
+#else
+    CdFastIoDispatch.AcquireFileForNtCreateSection =  
CdAcquireForCreateSection;
+#endif
     CdFastIoDispatch.ReleaseFileForNtCreateSection =  
CdReleaseForCreateSection;
     CdFastIoDispatch.FastIoQueryNetworkOpenInfo =     CdFastQueryNetworkInfo;  
 //  QueryNetworkInfo
     
diff --git a/drivers/filesystems/cdfs_new/cdprocs.h 
b/drivers/filesystems/cdfs_new/cdprocs.h
index 6c957aebba..6506b233cb 100755
--- a/drivers/filesystems/cdfs_new/cdprocs.h
+++ b/drivers/filesystems/cdfs_new/cdprocs.h
@@ -1121,6 +1121,7 @@ CdReleaseFromCache (
     _Inout_ PFCB Fcb
     );
 
+#ifndef __REACTOS__
 _Requires_lock_held_(_Global_critical_region_)
 NTSTATUS
 NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
@@ -1128,6 +1129,13 @@ CdFilterCallbackAcquireForCreateSection (
     _In_ PFS_FILTER_CALLBACK_DATA CallbackData,
     _Unreferenced_parameter_ PVOID *CompletionContext
     );
+#else
+VOID
+NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
+CdAcquireForCreateSection (
+    IN PFILE_OBJECT FileObject
+    );
+#endif
 
 _Function_class_(FAST_IO_RELEASE_FILE)
 _Requires_lock_held_(_Global_critical_region_)
diff --git a/drivers/filesystems/cdfs_new/resrcsup.c 
b/drivers/filesystems/cdfs_new/resrcsup.c
index c9eaa7be26..0e7ebd9d30 100755
--- a/drivers/filesystems/cdfs_new/resrcsup.c
+++ b/drivers/filesystems/cdfs_new/resrcsup.c
@@ -23,7 +23,11 @@ Abstract:
 
 #ifdef ALLOC_PRAGMA
 #pragma alloc_text(PAGE, CdAcquireForCache)
+#ifndef __REACTOS__
 #pragma alloc_text(PAGE, CdFilterCallbackAcquireForCreateSection)
+#else
+#pragma alloc_text(PAGE, CdAcquireForCreateSection)
+#endif
 #pragma alloc_text(PAGE, CdAcquireResource)
 #pragma alloc_text(PAGE, CdNoopAcquire)
 #pragma alloc_text(PAGE, CdNoopRelease)
@@ -274,6 +278,7 @@ Return Value:
 }
 
 
+#ifndef __REACTOS__
 _Requires_lock_held_(_Global_critical_region_)
 NTSTATUS
 NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
@@ -356,6 +361,55 @@ Return Value:
 
     UNREFERENCED_PARAMETER( CompletionContext );
 }
+#else
+VOID
+NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */
+CdAcquireForCreateSection (
+    IN PFILE_OBJECT FileObject
+    )
+
+/*++
+
+Routine Description:
+
+    This is the callback routine for MM to use to acquire the file exclusively.
+
+Arguments:
+
+    FileObject - File object for a Cdfs stream.
+
+Return Value:
+
+    None
+
+--*/
+
+{
+    PAGED_CODE();
+
+    
+    //
+    //  Get the Fcb resource exclusively.
+    //
+
+    ExAcquireResourceExclusiveLite( &((PFCB) 
FileObject->FsContext)->FcbNonpaged->FcbResource,
+                                TRUE );
+                                
+    //
+    //  Take the File resource shared.  We need this later on when MM calls 
+    //  QueryStandardInfo to get the file size.  
+    //
+    //  If we don't use StarveExclusive,  then we can get wedged behind an 
+    //  exclusive waiter who is waiting on someone else holding it shared in 
the 
+    //  read->initializecachemap path (which calls createsection) who is in 
turn 
+    //  waiting on us to finish the create section.
+    //
+
+    ExAcquireSharedStarveExclusive( ((PFCB) FileObject->FsContext)->Resource,
+                                    TRUE );
+}
+#endif
+
 
 
 _Function_class_(FAST_IO_RELEASE_FILE)

Reply via email to