https://git.reactos.org/?p=reactos.git;a=commitdiff;h=bc2378a3560a384c47d2a4...
commit bc2378a3560a384c47d2a4c83886531ad8f0af90 Author: David Quintana gigaherz@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)