NTAPI
IopNotifyAlreadyRegisteredFileSystems(IN PLIST_ENTRY ListHead,
IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine,
- BOOLEAN SkipLast)
+ BOOLEAN SkipRawFs)
{
PLIST_ENTRY ListEntry;
PDEVICE_OBJECT DeviceObject;
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;
}
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;
+ ChangeEntry = CONTAINING_RECORD(ListEntry,
+ FS_CHANGE_NOTIFY_ENTRY,
+ FsChangeNotifyList);
- /* 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)
+ /* If buffer is still big enough */
+ if (ListSize < MaximumSize)
{
- ChangeEntry = CONTAINING_RECORD(ListEntry,
- FS_CHANGE_NOTIFY_ENTRY,
- FsChangeNotifyList);
-
/* 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;
}
PAGED_CODE();
/* Acquire the FS lock */
+ KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Check what kind of FS this is */
/* Release the FS Lock */
ExReleaseResourceLite(&IopDatabaseResource);
+ KeLeaveCriticalRegion();
/* Ensure driver won't be unloaded */
IopInterlockedIncrementUlong(LockQueueIoDatabaseLock, (PULONG)&DeviceObject->ReferenceCount);
PAGED_CODE();
/* Acquire the FS lock */
+ KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Simply remove the entry - if queued */
/* Then release the lock */
ExReleaseResourceLite(&IopDatabaseResource);
+ KeLeaveCriticalRegion();
/* Decrease reference count to allow unload */
IopInterlockedDecrementUlong(LockQueueIoDatabaseLock, (PULONG)&DeviceObject->ReferenceCount);
PAGED_CODE();
/* Acquire the list lock */
+ KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Check if that driver is already registered (successive calls)
/* Release the lock */
ExReleaseResourceLite(&IopDatabaseResource);
+ KeLeaveCriticalRegion();
/* Reference the driver */
ObReferenceObject(DriverObject);
PAGED_CODE();
/* Acquire the list lock */
+ KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite(&IopDatabaseResource, TRUE);
/* Loop the list */
/* Release the lock and dereference the driver */
ExReleaseResourceLite(&IopDatabaseResource);
+ KeLeaveCriticalRegion();
+
+ /* Dereference the driver */
ObDereferenceObject(DriverObject);
}