Author: pschweitzer Date: Fri Jun 3 08:43:05 2011 New Revision: 52073
URL: http://svn.reactos.org/svn/reactos?rev=52073&view=rev Log: [NTOSKRNL] Fixes to r52065: - Acquire resources within a critical region - Simplified IoEnumerateRegisteredFiltersList and made its behaviour match the one described in MSDN: http://msdn.microsoft.com/en-us/library/ff548348%28v=vs.85%29.aspx This was brought to you by Alex Ionescu.
Modified: trunk/reactos/ntoskrnl/io/iomgr/volume.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/volume.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/volume.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/volume.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/io/iomgr/volume.c [iso-8859-1] Fri Jun 3 08:43:05 2011 @@ -781,7 +781,7 @@ NTAPI IopNotifyAlreadyRegisteredFileSystems(IN PLIST_ENTRY ListHead, IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, - BOOLEAN SkipLast) + BOOLEAN SkipRawFs) { PLIST_ENTRY ListEntry; PDEVICE_OBJECT DeviceObject; @@ -790,8 +790,8 @@ ListEntry = ListHead->Flink; while (ListEntry != ListHead) { - /* Check if we reached end and if we have to skip it */ - if (ListEntry->Flink == ListHead && SkipLast) + /* Check if we reached rawfs and if we have to skip it */ + if (ListEntry->Flink == ListHead && SkipRawFs) { return; } @@ -819,55 +819,49 @@ IN ULONG DriverObjectListSize, OUT PULONG ActualNumberDriverObjects) { - USHORT Index = 0; - ULONG ListSize = 0; PLIST_ENTRY ListEntry; NTSTATUS Status = STATUS_SUCCESS; PFS_CHANGE_NOTIFY_ENTRY ChangeEntry; + ULONG ListSize = 0, MaximumSize = DriverObjectListSize / sizeof(PDRIVER_OBJECT);
/* Acquire the FS lock */ + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
- /* First of all, count number of driver objects */ + /* Browse the whole list */ ListEntry = IopFsNotifyChangeQueueHead.Flink; while (ListEntry != &IopFsNotifyChangeQueueHead) { - ListSize++; - - /* Go to the next entry */ - ListEntry = ListEntry->Flink; - } - - /* Return this size */ - *ActualNumberDriverObjects = ListSize; - - /* Then, check if given buffer is big enough to contain list */ - if (ListSize > DriverObjectListSize / sizeof(PDRIVER_OBJECT)) - { - Status = STATUS_BUFFER_TOO_SMALL; - } - else - { - /* Rebrowse the whole list */ - ListEntry = IopFsNotifyChangeQueueHead.Flink; - while (ListEntry != &IopFsNotifyChangeQueueHead) - { - ChangeEntry = CONTAINING_RECORD(ListEntry, - FS_CHANGE_NOTIFY_ENTRY, - FsChangeNotifyList); - + ChangeEntry = CONTAINING_RECORD(ListEntry, + FS_CHANGE_NOTIFY_ENTRY, + FsChangeNotifyList); + + /* If buffer is still big enough */ + if (ListSize < MaximumSize) + { /* Reference the driver object */ ObReferenceObject(ChangeEntry->DriverObject); /* And pass it to the caller */ - DriverObjectList[Index++] = ChangeEntry->DriverObject; - - /* Go to the next entry */ - ListEntry = ListEntry->Flink; - } - } + DriverObjectList[ListSize] = ChangeEntry->DriverObject; + } + else + { + Status = STATUS_BUFFER_TOO_SMALL; + } + + /* Increase size counter */ + ListSize++; + + /* Go to the next entry */ + ListEntry = ListEntry->Flink; + } + + /* Return list size */ + *ActualNumberDriverObjects = ListSize;
/* Release the FS lock */ ExReleaseResourceLite(&IopDatabaseResource); + KeLeaveCriticalRegion();
return Status; } @@ -993,6 +987,7 @@ PAGED_CODE();
/* Acquire the FS lock */ + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Check what kind of FS this is */ @@ -1044,6 +1039,7 @@
/* Release the FS Lock */ ExReleaseResourceLite(&IopDatabaseResource); + KeLeaveCriticalRegion();
/* Ensure driver won't be unloaded */ IopInterlockedIncrementUlong(LockQueueIoDatabaseLock, (PULONG)&DeviceObject->ReferenceCount); @@ -1059,6 +1055,7 @@ PAGED_CODE();
/* Acquire the FS lock */ + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Simply remove the entry - if queued */ @@ -1075,6 +1072,7 @@
/* Then release the lock */ ExReleaseResourceLite(&IopDatabaseResource); + KeLeaveCriticalRegion();
/* Decrease reference count to allow unload */ IopInterlockedDecrementUlong(LockQueueIoDatabaseLock, (PULONG)&DeviceObject->ReferenceCount); @@ -1092,6 +1090,7 @@ PAGED_CODE();
/* Acquire the list lock */ + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Check if that driver is already registered (successive calls) @@ -1140,6 +1139,7 @@
/* Release the lock */ ExReleaseResourceLite(&IopDatabaseResource); + KeLeaveCriticalRegion();
/* Reference the driver */ ObReferenceObject(DriverObject); @@ -1159,6 +1159,7 @@ PAGED_CODE();
/* Acquire the list lock */ + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Loop the list */ @@ -1186,6 +1187,9 @@
/* Release the lock and dereference the driver */ ExReleaseResourceLite(&IopDatabaseResource); + KeLeaveCriticalRegion(); + + /* Dereference the driver */ ObDereferenceObject(DriverObject); }